;##########################################################
;## Ejemplo API Hooking by Drinky94 ##
;## Agradecimientos a: ##
;## [Zero] por todo en lo que me ayuda ##
;## YST por su funcion ASCIITOUNICODE ##
;##########################################################
format PE GUI 4.0 DLL
entry DllEntryPoint
include 'win32ax.inc'
section '.code' code readable executable
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
locals
proteccion dd ?
endl
stdcall ASCIITOUNICODE,mensajito,buffer;pasamos la cadena que se mostrara en MessageBoxW a Unicode
invoke LoadLibrary,'user32.dll' ;Cargamos User32
invoke GetProcAddress,eax,"MessageBoxA" ;obtenemos la direccion de la api
mov ebx,eax; ebx = direccion MessageBoxA
mov eax,hook ;Calculamos la distancia entre el jmp y la funcion donde saltaremos
sub eax,ebx
sub eax,4
mov ecx,eax
push ebx
push ecx
invoke VirtualProtect,ebx,5,PAGE_EXECUTE_READWRITE,addr proteccion ;le damos a 5 bytes permiso de escritura
pop ecx
pop ebx
mov byte[ebx],0xE9 ;escribimos un jmp
inc ebx
mov dword[ebx],ecx ;escriimos la longitud del salto
add ebx,4
ret
endp
proc hook,uno,dos,tres,cuatro ;funcion que remplaza a MesasgeBoxA
invoke MessageBox,0,buffer,0,0 ;Si se llama a MessageBoxA, mostramos nuestro mensagito :PP
mov eax,0 ;devolvemos cero
jmp ebx ;saltamos donde nos quedamos para continuar la ejecucion.
endp
proc ASCIITOUNICODE,Cadena,Buffer
;Funcion By YST
push ecx ebx
mov eax,[Cadena]
mov ebx,[Buffer]
dec eax
sub ebx,2
.bucle:
inc eax
cmp byte[eax],0
je .salir
add ebx,2
mov cl,byte[eax]
mov byte[ebx],cl
mov byte[ebx+1],0
jmp .bucle
.salir:
pop ebx ecx
ret
endp
proc ShowErrorMessage hWnd,dwError
local lpBuffer:DWORD
lea eax,[lpBuffer]
invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0
invoke MessageBox,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK
invoke LocalFree,[lpBuffer]
ret
endp
; VOID ShowLastError(HWND hWnd);
proc ShowLastError hWnd
invoke GetLastError
stdcall ShowErrorMessage,[hWnd],eax
ret
endp
section '.data' data readable writeable
mensajito db 'Msgbox Hookeado',0
buffer db ?
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
GetLastError,'GetLastError',\
SetLastError,'SetLastError',\
FormatMessage,'FormatMessageA',\
LocalFree,'LocalFree',\
LoadLibrary,'LoadLibraryA',\
GetProcAddress,'GetProcAddress',\
VirtualProtect,'VirtualProtect'
import user,\
MessageBox,'MessageBoxW'
section '.edata' export data readable
export 'ERRORMSG.DLL',\
ShowErrorMessage,'ShowErrorMessage',\
ShowLastError,'ShowLastError'
section '.reloc' fixups data discardable
un código vale mas que mil palabras ;D
salu2!
Muchas gracias Drinky94
Excelente aporte para los que empiezan, pero deberías esforzarte por hacer un poco más práctico sin tanta cosa inútil el código citando algunos errores para que puedas identificarlos más fácilmente.
Citar
stdcall ASCIITOUNICODE,mensajito,buffer;pasamos la cadena que se mostrara en MessageBoxW a Unicode
Eso no es muy inteligente por varias razones :
1º El buffer que es utilizado para la cadena en UNICODE es demasiado pequeño (de un solo byte) :
buffer db ?
2º Se puede llamar dentro de la misma función hook a MessageBoxA saltando unos bytes más adelante del API.
Igualmente esa forma de hookear, mediante DLL Injection es ineficiente. Puedes hacer lo mismo abriendo un proceso y escribiendo en la memoria. También, para simplificar el ejemplo, deberías quitar todas las API que no usas, además que FASM ensambla el ejecutable con las API que no usas en la IAT y quedan ocupando espacio.
EDIT:
http://www.google.com/search?q=%22local%20lpBuffer:DWORD%22+%22ShowErrorMessage%22+-Drinky94+%22;VOID%20ShowLastError%28HWND%20hWnd%29;%22
Pedazo de mierda sin valor, estaba esperando el momento desde que copiaste ese stub foo dll fasm.
No tienes permitido ver los links.
Registrarse o Entrar a mi cuenta
Excelente aporte para los que empiezan, pero deberías esforzarte por hacer un poco más práctico sin tanta cosa inútil el código citando algunos errores para que puedas identificarlos más fácilmente.
Citar
stdcall ASCIITOUNICODE,mensajito,buffer;pasamos la cadena que se mostrara en MessageBoxW a Unicode
Eso no es muy inteligente por varias razones :
1º El buffer que es utilizado para la cadena en UNICODE es demasiado pequeño (de un solo byte) :
buffer db ?
2º Se puede llamar dentro de la misma función hook a MessageBoxA saltando unos bytes más adelante del API.
Igualmente esa forma de hookear, mediante DLL Injection es ineficiente. Puedes hacer lo mismo abriendo un proceso y escribiendo en la memoria. También, para simplificar el ejemplo, deberías quitar todas las API que no usas, además que FASM ensambla el ejecutable con las API que no usas en la IAT y quedan ocupando espacio.
EDIT:
http://www.google.com/search?q=%22local%20lpBuffer:DWORD%22+%22ShowErrorMessage%22+-Drinky94+%22;VOID%20ShowLastError%28HWND%20hWnd%29;%22
Pedazo de mierda sin valor, estaba esperando el momento desde que copiaste ese stub foo dll fasm.
1- Porsi no lo sabias el compilador arregla eso ;)
2- No es llamando unos pocos bytes mas adelante, es ejecutando los bytes que as remplazado que se suponen que estan en otra parte de la memoria.
Y por ultimo, porque es ineficiente? sabes tu que a mi no me vale así? te repito que es solo un ejemplo,,, pero vamos, que te invito a que programes tu algo usando api hooking y nos deleites ;D
salu2!