push ebp
mov ebp, esp
;sub esp,x ; opt
;EBP = Valor anterior de EBP
;EBP+4 = Dirección de retorno
;EBP+8 = 1er parámetro
;EBP+C = 2do parámetro
;...etc
mov esp, ebp
pop ebp
retn cArgs*4
Cuando vemos algo así, es porque estamos frente a una función de alto nivel o
"stack frame". Un stack frame permite manejar parámetros y/o variables locales (espacio reservado en la
stack restando una cantidad determinada al registro
Extended Stack Pointer o "
ESP").
También existen los opcodes "
ENTER" y "
LEAVE" que se encargan de crear y liberar el stack frame.
Funcionamiento de un stack frame :
push 0
push 1234
call fnExample
ret
fnExample:
push ebp
mov ebp, esp
mov eax, dword ptr[ebp+0x08] ; eax = 1234
mov eax, dword ptr[ebp+0x0C] ; eax = 0
leave
retn 2*4
PD: Ahora que puedo darme el gusto de leer completamente el hilo, sería recomendable que en vez de usar funciones que encuentres por Internet, aprendas a programar correctamente en ASM ya que tus dudas son muy básicas, y el código del ejemplo que has facilitado está terriblemente desorganizado. Además que no es nada complicado recorrer el
Export Directory, comparar, y encontrar la función que se requiera.