Pregunta

Actualmente estoy analizando un programa que escribí en el montaje y estaba pensando en mudarse algún código en torno a la asamblea. Tengo un procedimiento que toma un argumento, pero no estoy seguro si es aprobada en la pila o un registro.

Cuando abro mi programa de IDA Pro, la primera línea en el procedimiento es:

ThreadID= dword ptr -4

Si se ciernen mi cursor sobre la declaración, el siguiente también aparece:

ThreadID dd ?
 r db 4 dup(?)

lo que yo supongo que apuntaría a una variable de pila?

Al abrir el mismo programa en OllyDbg Sin embargo, en este punto de la pila hay un valor grande, lo que sería incompatible con cualquier parámetro que se podría haber pasado, que me lleva a creer que se pasa en un registro.

Puede alguien me punto en la dirección correcta?

¿Fue útil?

Solución

La forma de los argumentos se pasan a una función depende de la función de convención de llamada . La convención de llamada por defecto depende del lenguaje, compilador y la arquitectura.

No puedo decir nada con seguridad con la información que ya ha proporcionado, sin embargo no hay que olvidar que los depuradores de nivel de ensamblado como OllyDbg y desensambladores como AIF a menudo utilizan la heurística para ingeniería inversa del programa. La mejor manera de estudiar el código generado por el compilador es instruir para escribir anuncios de montaje. La mayoría de los compiladores tienen una opción para hacer esto.

Otros consejos

Es una variable local con seguridad. Para comprobar los argumentos buscan valores [ESP + XXX]. nombres de los AIF [esp + arg_XXX] automáticamente.

.text:0100346A sub_100346A     proc near               ; CODE XREF: sub_100347C+44p
.text:0100346A                                         ; sub_100367A+C6p ...
.text:0100346A
.text:0100346A arg_0           = dword ptr  4
.text:0100346A
.text:0100346A                 mov     eax, [esp+arg_0]
.text:0100346E                 add     dword_1005194, eax
.text:01003474                 call    sub_1002801
.text:01003474
.text:01003479                 retn    4
.text:01003479
.text:01003479 sub_100346A     endp

Y convención fastcall como se describe en el comentario anterior utiliza registros para pasar argumentos. Yo apostaría por Microsoft o compilador GCC ya que se utilizan más ampliamente. Así que echa un vistazo a ECX y EDX registra por primera vez.

  

Microsoft o GCC [2] __fastcall [3]   convención (aka __msfastcall) pasa   los dos primeros argumentos (evaluados   de izquierda a derecha) que encajan en ECX y   EDX. argumentos restantes son empujados   en la pila de derecha a izquierda.    http://en.wikipedia.org/wiki/X86_calling_conventions#fastcall

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top