Duda con ollydbg y asm

Iniciado por shiro51, 20 Septiembre 2013, 05:50 AM

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

shiro51

Hace poco que me he metido a fondo con ollydbg lo vi hace tiempo pero no me meti de lleno, y pues ahora me meti de lleno para hookear desde asm, ya que es el lenguaje que mas me gusta, pero he tenido unas dudas que no consigo solucionar incluso buscando :S a ver si me podéis ayudar...

Aqui os dejo el codigo, lo compilo desde fasm, y debajo de el os dejo las dudas por si alguien me puede echar un cable

format PE GUI 4.0
entry main

include '..\..\INCLUDE\win32ax.inc'

section '.idata' import data readable

        library kernel32,'KERNEL32.DLL',\
                user32,'USER32.DLL'

        import kernel32,\
               ExitProcess,'ExitProcess',\
               AllocConsole, 'AllocConsole',\
               GetStdHandle,'GetStdHandle',\
               WriteConsole, 'WriteConsoleA',\
               GetModuleHandle,'GetModuleHandleA',\
               GetProcAddress, 'GetProcAddress',\
               WriteProcessMemory, 'WriteProcessMemory',\
               GetCurrentProcess, 'GetCurrentProcess'

        import user32,\
               MessageBox,'MessageBoxA',\
               LoadIcon, 'LoadIconA',\
               LoadCursor, 'LoadCursorA',\
               DefWindowProc, 'DefWindowProcA',\
               RegisterClass, 'RegisterClassA',\
               CreateWindowEx, 'CreateWindowExA' ,\
               PostQuitMessage, 'PostQuitMessage',\
               GetMessage, 'GetMessageA',\
               TranslateMessage, 'TranslateMessage',\
               DispatchMessage, 'DispatchMessageA'

section '.data' data readable writable

        Adrr DD 0

        Jump DB 0xe9
             DD 0x65467689
             DB 0xc3

section '.text' code readable executable

main:
        invoke  GetModuleHandle, 'user32.dll'
        invoke  GetProcAddress, eax, 'MessageBoxA'
        mov [Adrr], eax
        invoke GetCurrentProcess
        invoke WriteProcessMemory, eax, [Adrr], Jump, 6, 0
        nop
        nop
        invoke  MessageBox, 0, 'Texto', 'Titulo', MB_OK
        nop
        invoke  ExitProcess, 0

        Hook:
        invoke AllocConsole
        invoke GetStdHandle, STD_OUTPUT_HANDLE

        invoke WriteConsole, eax, "Hola", 4, 0, 0
        retn


Las dudas que tengo son las siguientes:

1:
        Jump DB 0xe9
                 DD 0x65467689
                 DB 0xc3

en esta parte no se podria hacer algo como:

        Jump DB 0xe9
                DD Hook
                DB 0xc3

Ya que tengo este "cartel" o no se como llamarlo

        Hook:
        invoke AllocConsole

Luego compilo y manualmente busco en el ollydbg la posicion de esta sección (hook) y la pongo en su variable correspondiente (jump)

para que termine:
e9(jmp) ?? ?? ?? ?? c3(retn)

Pero por ejemplo si la posicion de la sección hook es:
0040307B y la meto de la manera anterior

       Jump DB 0xe9
                DD 0x0040307B
                DB 0xc3

al usar invoke WriteProcessMemory, eax, [Adrr], Jump, 6, 0

me lo deja asi:
http://i39.tinypic.com/160pv7a.png

y si la pongo asi:

       Jump DB 0xe9
                DB 0x00
                DB 0x40
                DB 0x30
                DB 0x7B
                DB 0xc3

termina asi:
http://i44.tinypic.com/1gm5jm.png

Y yo ya no entiendo que narices es una columna o la otra... se suponia que era hex... pero ahora ya estoy hecho un lio AARG

A ver si me podeis ayudar gracias de antemano...

MCKSys Argentina

Debes releer un poco el tema de las instrucciones ASM.

Los JMPs son relativos a la posición donde están ubicados.

La solucion sencilla para evitar ese problema es usar PUSH + RET, pero esto ocupa un byte mas.

Por ej.:
Código (asm) [Seleccionar]
00412C32    E9 87000000 JMP 00412CBE

podrías reemplazarlo con:

Código (asm) [Seleccionar]
00412C32    68 BE2C4100 PUSH 00412CBE
00412C37    C3          RET


pero, como ves, ocupa 1 byte más.

Si quieres usar un JMP, tendrás que calcular la distancia del salto antes de escribirlo.

Saludos!
MCKSys Argentina

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


shiro51

Vale entiendo, ya lo probé y genial, funciona perfecto solo me quedaría limpiar la pila y poco más para que estuviera correcto el código ya que supongo que no si uso pop después del invoke messagebox[...] se quedaran los parámetros dentro.

No me acordaba que 'jmp' era relativo, hace bastante que no toco asm.

¿Es recomendable usar jmp calculando la distancia? o ¿es mejor usar push y ret ya que te ahorras todo eso?. Iré a mirar si encuentro como calcular la distancia relativa, ya que el otro día lo leí y ponían 'punterofuncion-inicioapi-5' y no entendí porque de esa manera...