comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[FASM] Api Hooking

  • 3 Respuestas
  • 2137 Vistas

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

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« en: Mayo 05, 2011, 04:51:49 pm »
Código: You are not allowed to view links. Register or Login
;##########################################################
;##  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!
« Última modificación: Diciembre 08, 2014, 02:46:39 pm por Expermicid »

Desconectado Comandante Linux

  • *
  • Underc0der
  • Mensajes: 175
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • http://comandante-linux.blogspot.com/
    • Email
« Respuesta #1 en: Mayo 05, 2011, 04:57:40 pm »
Muchas gracias Drinky94
You are not allowed to view links. Register or Login

Desconectado _DauT_

  • *
  • Underc0der
  • Mensajes: 2
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Junio 22, 2011, 03:18:14 am »
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: You are not allowed to view links. Register or Login
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:
You are not allowed to view links. Register or Login
Pedazo de mierda sin valor, estaba esperando el momento desde que copiaste ese stub foo dll fasm.
« Última modificación: Junio 22, 2011, 03:51:25 am por _DauT_ »

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« Respuesta #3 en: Julio 04, 2011, 06:16:25 am »
You are not allowed to view links. Register or Login
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: You are not allowed to view links. Register or Login
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:
You are not allowed to view links. Register or Login
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!

 

¿Te gustó el post? COMPARTILO!



[FASM][64bits]Detección de emuladores usando Heaven's gate

Iniciado por Karcrack

Respuestas: 0
Vistas: 1389
Último mensaje Julio 19, 2013, 01:27:28 pm
por Karcrack