[FASM] Api Hooking

Iniciado por Juan, Mayo 05, 2011, 04:51:49 PM

Tema anterior - Siguiente tema

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

Mayo 05, 2011, 04:51:49 PM Ultima modificación: Diciembre 08, 2014, 02:46:39 PM por Expermicid
Código: php
;##########################################################
;##  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

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Junio 22, 2011, 03:18:14 AM #2 Ultima modificación: Junio 22, 2011, 03:51:25 AM por _DauT_
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) :
Código: php
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:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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) :
Código: php
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:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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!