[Solucionado] Ayuda con ASM inline

Iniciado por saawyeer, 28 Marzo 2013, 00:26 AM

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

saawyeer

Bueno tengo el siguiente problema, he realizado con éxito un salto (jmp) en una dirección de un proceso:


DWORD dwDireccion = 0x00692B0C;

__declspec( naked ) void asmSalto() {
 __asm
   {
   mov eax, dwDireccion
   jmp Direccion
   }
}


Se inyectan correctamente las instrucciones pero acá esta mi problema, las instrucciones originales de la dirección antes de ser inyectadas eran 6 bytes en la memoria pero con la inyección anterior equivale a mas de 6 bytes, lo que origina que se cuelgue el programa:

Instrucciones originales de 6 bytes:
0042276B - 29 83 64 04 00 00        - sub [ebx+00000464],eax

Se podría hacer con un simple salto; Pero da error el copilador, se vería en memoria asi:

__asm
{
   jmp 0x00692B0C
}


Son solo 5 bytes en la memoria le agregamos 1 mas con un nop y tendríamos el salto correctamente:

00540967  - E9 A0 21 15 00           - jmp 00692B0C
0054096C  - 90                       - nop



Hay alguna forma de hacer el salto sin ocupar mas de 6 bytes? Agradecería mucho sus respuestas o comentarios.

BloodSharp

Cita de: saawyeer en 28 Marzo 2013, 00:26 AM
Son solo 5 bytes en la memoria le agregamos 1 mas con un nop y tendríamos el salto correctamente:

00540967  - E9 A0 21 15 00           - jmp 00692B0C
0054096C  - 90                       - nop


Hay alguna forma de hacer el salto sin ocupar mas de 6 bytes? Agradecería mucho sus respuestas o comentarios.

Si te referís a otra manera de hacer un salto con 6 bytes a lo sumo si la hay, aún así te estás respondiendo tu misma pregunta un par de renglones arriba...  :P


B#



x64core

Cita de: saawyeer en 28 Marzo 2013, 00:26 AM
Bueno tengo el siguiente problema, he realizado con éxito un salto (jmp) en una dirección de un proceso:


DWORD dwDireccion = 0x00692B0C;

__declspec( naked ) void asmSalto() {
  __asm
    {
    mov eax, dwDireccion
    jmp Direccion
    }
}


Se inyectan correctamente las instrucciones pero acá esta mi problema, las instrucciones originales de la dirección antes de ser inyectadas eran 6 bytes en la memoria pero con la inyección anterior equivale a mas de 6 bytes, lo que origina que se cuelgue el programa:

Instrucciones originales de 6 bytes:
0042276B - 29 83 64 04 00 00        - sub [ebx+00000464],eax

Se podría hacer con un simple salto; Pero da error el copilador, se vería en memoria asi:

__asm
{
    jmp 0x00692B0C
}


Son solo 5 bytes en la memoria le agregamos 1 mas con un nop y tendríamos el salto correctamente:

00540967  - E9 A0 21 15 00           - jmp 00692B0C
0054096C  - 90                       - nop



Hay alguna forma de hacer el salto sin ocupar mas de 6 bytes? Agradecería mucho sus respuestas o comentarios.


jmp dword ptr [0x80808080]

BloodSharp

#3
La alternativa con 6 bytes: (que me falto agregar :P)
Código (asm) [Seleccionar]
push Direccion;
ret;



B#



saawyeer

@IEAX
@x64Core

Muchas gracias por sus respuestas, ya solucione el problema :)