Serán pasados argumentos a una función en la pila o en un registro?
-
13-09-2019 - |
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?
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