x64 ajustar la pila

Iniciado por luisferfago, 8 Marzo 2015, 23:39 PM

0 Miembros y 1 Visitante están viendo este tema.

luisferfago

hola!

en x64 los 4 primeros parametros se ponen en: rcx, rdx, r8, r9, y el resto de parametros si se necesitan van a la pila. ok, entendido.

pero lo que NO ENTIENDO es COMO SE AJUSTA LA PILA.

o sea, en esta llamada a MessageBoxA:

sub   rsp, 28h
xor   rcx, rcx
lea   rdx, qword ptr [lpText]
lea   r8, qword ptr [lpCaption]
xor   r9, r9
call   MessageBoxA

por que se resta a rsp 28h?
sí: hay que ajustar la pila y dejar espacio para los 4 parametros, pero entonces seria:
4 * 8 = 32 y en hexadecimal 20h.

¿ese 8 extra, para que quede 28h, por que se añade?

se que tiene que ver con algo de ALINEAR LA PILA, ¿a 8? ¿a 16? ....

¿alguien lo sabe? ¿alguien me lo explica? gracias!

BloodSharp

Cita de: luisferfago en  8 Marzo 2015, 23:39 PM
4 * 8 = 32 y en hexadecimal 20h.

¿ese 8 extra, para que quede 28h, por que se añade?

La verdad que no tengo idea sobre x64 porque siempre apliqué ingeniería inversa para x86, pero ¿probaste ver si era para la dirección del caller? osea depurar poniendo un bp en la llamada y ver si en tiempo de ejecución tiene que ver dicha dirección...

Cita de: luisferfago en  8 Marzo 2015, 23:39 PM
se que tiene que ver con algo de ALINEAR LA PILA, ¿a 8? ¿a 16? ....

Tengo entendido que cuando se alinea la pila sube el registro sp y no baja porque la rutina que quieras llamar en su convención de llamada no sube manualmente el sp justo antes de retornar... (ejemplo cdecl)


B#



cpu2

Eso es un dissasembler o un fragmento de code en ASM? Como no veo todo el code se hace dificil decirte algo.

El sistema de llamada que estas usando se llama fastcall, como bien dijiste usa los registros para el paso de parametros a las funciones, como los registros son limitados si la funcion tiene demasiados parametros este sistema se apoya en la pila.

Pero este no es el caso, ya que MessageBoxA tiene 4 parametros, segun MSDN. No tiene sentido usar la pila ya que no se requiere, o ese es mi punto de vista.

Ese sub no esta reservando espacio en la pila para los parametros ya que estos se pasan en los registros, no tiene sentido.

Asi que me remito a mi primera pregunta y linea.

Un saludo.

luisferfago

gracias BloodSharp y cpu2 por contestar.

luisferfago

cpu2:

el trozo de codigo que ponia son las 6 lineas de una simple llamada a MessageBoxA en x64.
(no se necesita ver mas codigo, con esas 6 lineas vale para entender)

ese sub sí esta reservando espacio de pila para los parametros. aunque los parametros se pasen en registros: da igual.

regla en x64: el codigo que llama (en este caso las 6 lineas en asm) tiene que reservar espacio en la pila (creo que tantos qwords como parametros use), para que el codigo llamado (en este caso el user32.dll donde esta el MessageBoxA) pueda tener la posibilidad si quiere, de copiar esos parametros (que le llegan en registros) a la pila.

......................

finalmente: me respondo a mi mismo   :) la pregunta que hacia al foro:

es que investigué un poco y me parece que di con la solucion.

yo preguntaba que ese alinear la pila, como se hacia.
la respuesta es: en x64 hay que alinear la pila a 16 bytes.

entonces en el ejemplo: hay 4 parametros, luego hay que reservar 4 qwords. luego está la direccion de retorno que meterá la call, pero aqui no necesitamos reservar nada.
entonces tenemos que en la pila se ocuparan 5 qwords. como hay que alinear la pila a 16 bytes, eso hace que necesitemos reservar otro qword.

en total nuestro codigo tiene que reservar: 5 qwords.

y (5 * 8) = 40 bytes = 28h.

:-*

cpu2

Acabo de leer la MSDN, y el sistema fastcall que usa Windows hace como un seguimiemto de la pila.

En sistemas Unix y demas no requiere hacer tal cosa con llamadas fastcall, se utilizan los registros para el paso de parametros y no hace falta reservar nada.

Claro que es Windows, y ya por naturaleza no quiero buscarle la logica...

Un saludo.