Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: saawyeer en 28 Marzo 2013, 00:26 am



Título: [Solucionado] Ayuda con ASM inline
Publicado por: 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:

Código:
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:
Código:
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:
Código:
__asm 
{
    jmp 0x00692B0C
}

Son solo 5 bytes en la memoria le agregamos 1 mas con un nop y tendríamos el salto correctamente:
Código:
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.


Título: Re: Ayuda con ASM inline
Publicado por: BloodSharp en 28 Marzo 2013, 03:00 am
Son solo 5 bytes en la memoria le agregamos 1 mas con un nop y tendríamos el salto correctamente:
Código:
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#


Título: Re: Ayuda con ASM inline
Publicado por: x64core en 28 Marzo 2013, 03:18 am
Bueno tengo el siguiente problema, he realizado con éxito un salto (jmp) en una dirección de un proceso:

Código:
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:
Código:
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:
Código:
__asm 
{
    jmp 0x00692B0C
}

Son solo 5 bytes en la memoria le agregamos 1 mas con un nop y tendríamos el salto correctamente:
Código:
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.


Código:
jmp dword ptr [0x80808080]


Título: Re: Ayuda con ASM inline
Publicado por: BloodSharp en 28 Marzo 2013, 03:42 am
La alternativa con 6 bytes: (que me falto agregar :P)
Código
  1. push Direccion;
  2. ret;


B#


Título: Re: Ayuda con ASM inline
Publicado por: saawyeer en 28 Marzo 2013, 06:28 am
@IEAX
@x64Core

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