elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  duda con parametros sin definir y saber su direccion
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda con parametros sin definir y saber su direccion  (Leído 4,476 veces)
asmnb

Desconectado Desconectado

Mensajes: 10


Ver Perfil
duda con parametros sin definir y saber su direccion
« en: 14 Agosto 2011, 05:52 am »

hola de nuevo  ;D , tengo una funcion en c que lleva un parametros fijo, y luego permite mas parametros que no estan definidos ,
lo que necesito es saber con asm la direccion de esos parametros, pero aqui viene el tema de la convencion de llamada me parece  :-\ , yo en este caso quisiera saber la direccion del segundo parametro, porque yo se que se le va a pasar 1 mas, por eso digo el segundo

Código:
int AgregarRegistro(int reg_tipo, ...)
{
       void* ptrreg;
__asm eax, esp
__asm add eax,4
__asm mov ptrreg, eax

       //......
}


supongamos que la llamo asi

Código:
class Usuario reg;
AgregarRegistro(1 ,  reg);

bueno yo necesitaria saber con asm la direccion de reg, esto lo haria dentro de la propia AgregarRegistro()
alguna idea  :huh:

PS: noten que puse add 4 porque supuse que el primer parametro fijo ocupa 4 bytes,  entonces despues de ese viene el segundo osea el que quiero, pero esto no estoy seguro, por  eso pregunto



« Última modificación: 14 Agosto 2011, 05:54 am por asmnb » En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.470


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: duda con parametros sin definir y saber su direccion
« Respuesta #1 en: 31 Agosto 2011, 18:28 pm »

Hasta donde se, en ASM los params se PUSHean al reves de como los declaras.

Código:
int AgregarRegistro(int param1, int param2)
{
       void* ptrreg;
       void* ptrreg2;
__asm eax, dword ptr [esp+4] //recupera param2
        __asm mov ptrreg, eax
__asm eax, dword ptr [esp+8] //recupera param1
        __asm mov ptrreg2, eax
}

Si no es asi, debe ser al reves...  ;D

Saludos!


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: duda con parametros sin definir y saber su direccion
« Respuesta #2 en: 1 Septiembre 2011, 03:37 am »

Hasta donde se, en ASM los params se PUSHean al reves de como los declaras.

Código:
int AgregarRegistro(int param1, int param2)
{
       void* ptrreg;
       void* ptrreg2;
__asm eax, dword ptr [esp+4] //recupera param2
        __asm mov ptrreg, eax
__asm eax, dword ptr [esp+8] //recupera param1
        __asm mov ptrreg2, eax
}

Si no es asi, debe ser al reves...  ;D

Saludos!

no sería asi exactamente, fijate:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        cadena1 db 'primero',0
  5.        cadena2 db 'segundo',0
  6.  
  7. .code
  8. start:
  9.        push cadena2
  10.        push cadena1
  11.  
  12.        call Msgbox
  13.  
  14.        invoke MessageBoxA,0,"Sali del proceso",0,0
  15.  
  16.        ret
  17.  
  18.        Msgbox:
  19.             pop eax ; dirección de retorno
  20.  
  21.             pop ecx ;primer parametro
  22.             pop edx ;segundo parametro
  23.  
  24.             push eax
  25.             invoke MessageBoxA,0,edx,ecx,0
  26.             pop eax
  27.  
  28.  
  29.             jmp eax ; retornamos
  30. .end start        


Aunque con las macros de las funciones y tal creo qeu variaria un poco.

saludos.
En línea

Un byte a la izquierda.
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: duda con parametros sin definir y saber su direccion
« Respuesta #3 en: 1 Septiembre 2011, 06:31 am »

definitivamente asi no se hace en CDECL. (ni en stdcall, ni en fastcall... ni en ningun lado que conozca)
Citar
pop eax ; dirección de retorno
 
             pop ecx ;primer parametro
             pop edx ;segundo parametro
 
             push eax
             invoke MessageBoxA,0,edx,ecx,0



La forma facil seria:
Código:
void PrintInts( int amount, ...)
{
  

__asm mov eax, [ebp+08h]//valor primero, amount
__asm mov eax, [ebp+0Ch]//valor segundo
__asm mov eax,[ebp+010h]//valor tercero...
}
Visual Studio se encarga de inicializar (push ebp, mov ebp esp)
Tambien, en realidad lo hace de la siguiente manera, colocando comprobaciones de la pila  de por medio.
Código:
lea eax,dword ptr [ebp+08h]
add eax, 4 //apunta al segundo parametro
add eax, 4// apunta al tercer parametro
add eax, 4// apunta al cuarto parametro



Depura este ejemplo:
http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/
y se te solucionaran todas las dudas. Te conviene convertir ese ejemplo de float a int.
« Última modificación: 1 Septiembre 2011, 06:53 am por _Enko » En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: duda con parametros sin definir y saber su direccion
« Respuesta #4 en: 1 Septiembre 2011, 08:22 am »

Son diferentes formas de hacerlo... de la forma que yo púse tambien se puede hacer pero si tienes muchos parametros es mas lio obviamente :P

PD: tambien sirve con stdcall y etc.

saludos.
En línea

Un byte a la izquierda.
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: duda con parametros sin definir y saber su direccion
« Respuesta #5 en: 1 Septiembre 2011, 14:52 pm »


Tu forma sirve unicamente para stdcall ya que la propia funcion limpia la pila. Stdcall no admite numero de parametros variables. (sobre esto va el hilo, nro prametros variables)

ahora, si estas en C/C++, y usas cdecl, el que llama la funcion limpia la pila. Si se usa tu metodo, la plia muere.

Y este hilo siempre fue sobre funciones en C con parametros variables.  NO STDCALL
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines