[ASM] Calcular direccion de CALL
Lambda:
Vereis, estoy programando X programa y para ello necesito llamar a una funcion "dinamicamente", o sea, tengo que generar el codigo binario a partir de un unsigned long que contiene la direccion de la funcion a llamar, la verdad es que nunca habia echo esto, por lo tanto al igual que hice con el push, hice esto.
Código
BYTE CallSignature[5];
CallSignature[0] = 0xE8; //! CALL opcode
*(DWORD*)( CallSignature + 1 ) = dwFunctionAddress;
Pero en ese momento me di cuenta de que las direcciones de los calls son relativas y no absolutas, estuve buscando por google y no encontre nada que me aclarara como calcular la direccion.
Alguien tiene idea de como calcular la direccion que habria que poner justo despues del 0xE8?
Arkangel_0x7C5:
mira esto.
Cita de: Intel Hex Opcodes And Mnemonics
E8 cw CALL rel16 Call near, relative, displacement relative to next instruction
E8 cd CALL rel32 Call near, relative, displacement relative to next instruction
FF /2 CALL r/m16 Call near, absolute indirect, address given in r/m16
FF /2 CALL r/m32 Call near, absolute indirect, address given in r/m32
9A cd CALL ptr16:16 Call far, absolute, address given in operand
9A cp CALL ptr16:32 Call far, absolute, address given in operand
FF /3 CALL m16:16 Call far, absolute indirect, address given in m16:16
FF /3 CALL m16:32 Call far, absolute indirect, address given in m16:32
puedes usar relativos y no relativos
El que creo que te puede ir mejor es el de FF15 call no relativo
Saludos
Lambda:
Cita de: Arcangel_0x7C5 en 12 Mayo 2009, 00:59 am
mira esto.
Cita de: Intel Hex Opcodes And Mnemonics
E8 cw CALL rel16 Call near, relative, displacement relative to next instruction
E8 cd CALL rel32 Call near, relative, displacement relative to next instruction
FF /2 CALL r/m16 Call near, absolute indirect, address given in r/m16
FF /2 CALL r/m32 Call near, absolute indirect, address given in r/m32
9A cd CALL ptr16:16 Call far, absolute, address given in operand
9A cp CALL ptr16:32 Call far, absolute, address given in operand
FF /3 CALL m16:16 Call far, absolute indirect, address given in m16:16
FF /3 CALL m16:32 Call far, absolute indirect, address given in m16:32
puedes usar relativos y no relativos
El que creo que te puede ir mejor es el de FF15 call no relativo
Saludos
Si, ya habia visto eso buscando en google, el problema es que no puedo pasar de 5 bytes ya que tengo que sobreescribir un CALL en un ejecutable para que apunte al mio, (no es hooking, puedo hacerlo como si fuera hooking pero prefiero hacerlo de esta manera, ya que para lo que quiero hacer es mas limpio)
Arkangel_0x7C5:
entonces, usa la que tu dijiste, es relativa a la siguiente instrucción. el uno seria el primer vite de la siguiente o algo asi.
Saludos
Lambda:
Cita de: Arcangel_0x7C5 en 12 Mayo 2009, 01:35 am
entonces, usa la que tu dijiste, es relativa a la siguiente instrucción. el uno seria el primer vite de la siguiente o algo asi.
Saludos
Ese es el problema, que no se como calcularlo xD, he estado haciendo varias sumas y restas y ninguna me da lo que creo que me tiene que dar.
Código
0054A033 . 52 PUSH EDX
0054A034 . 83C1 0C ADD ECX,0C
0054A037 . 03FD ADD EDI,EBP
0054A039 . E8 A2AAEEFF CALL 00434AE0
0054A03E . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0054A040 . 50 PUSH EAX
0054A041 . 57 PUSH EDI
Por que en ese CALL a 0x00434AE0 los 4 bytes siguientes al E8 son 0xA2AAEEFF? es lo que no se resolver.
Navegación
[#] Página Siguiente