Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

160
Vistas
¿Ghidra está malinterpretando una llamada de función?

Al analizar la lista de montaje en Ghidra, me topé con esta instrucción:

CALL dword ptr [EBX*0x4 + 0x402ac0]=>DAT_00402abc

Supuse que el programa estaba llamando a una función cuya dirección estaba dentro de DAT_00402abc , que inicialmente pensé que era una variable dword. De hecho, al intentar crear una función en la ubicación donde se encuentra DAT_00402abc , Ghidra no me dejaba hacerlo.

El descompilador me muestra esta línea de código para traducir esa instrucción:

(*(code *)(&int2)[iVar2])();

Así que me preguntaba, ¿qué significa y qué se supone que debe hacer el programa con esta llamada? ¿Existe la posibilidad de que Ghidra se haya equivocado por completo? Y si es así, ¿cómo debo interpretar esa instrucción?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

No estoy nada familiarizado con Ghidra, pero puedo decirle cómo interpretar la instrucción de la máquina...

 CALL dword ptr [EBX*0x4 + 0x402ac0]

Hay una tabla de direcciones de funciones en 0x402ac0 ; se está llamando a la entrada EBX'th en esa tabla. No tengo idea de lo que significa DAT_00402abc , pero si inspecciona la memoria en fragmentos del tamaño de dword en la dirección 0x0402ac0 , debería encontrar direcciones de funciones plausibles. [EDITAR: 0x0040_2abc = 0x0040_2ac0 - 4. Sospecho que esto significa que Ghidra cree que EBX tiene un valor -1 cuando el control llega a este punto. Puede estar mal, o tal vez el programa tiene un error. Uno esperaría que EBX tuviera un valor no negativo cuando el control llega a este punto.]

El código fuente C natural correspondiente a esta instrucción sería algo así como

 extern void do_thing_zero(void); extern void do_thing_one(void); extern void do_thing_two(void); extern void do_thing_three(void); typedef void (*do_thing_ptr)(void); const do_thing_ptr do_thing_table[4] = { do_thing_zero, do_thing_one, do_thing_two, do_thing_three }; // ... void do_thing_n(unsigned int n) { if (n >= 4) abort(); do_thing_table[n](); }

Si las funciones en la tabla toman argumentos o devuelven valores, verá el código de manejo de argumentos antes y después de la instrucción CALL que citó, pero la instrucción CALL en sí no cambiará.

Vería algo diferente y mucho más complicado si las funciones no tomaran todas el mismo conjunto de argumentos.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda