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...
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.:
00412C32 E9 87000000 JMP 00412CBE
podrías reemplazarlo con:
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!
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...