• Domingo 28 de Abril de 2024, 23:19

Autor Tema:  Ayuda???  (Leído 1603 veces)

zed2000

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Ayuda???
« en: Sábado 3 de Marzo de 2007, 05:08 »
0
Hola amigos, estoy interesado en hook pero no he encontrado mucha informacion en español algunos de ustedes conoce alguna web o algun tutorial en español sobre este tema en cuestion.
gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda???
« Respuesta #1 en: Sábado 3 de Marzo de 2007, 09:07 »
0
Sin con hook te referis a interceptar codigo explica exactamente que queres hacer.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

zed2000

  • Miembro activo
  • **
  • Mensajes: 31
    • Ver Perfil
Re: Ayuda???
« Respuesta #2 en: Domingo 4 de Marzo de 2007, 02:48 »
0
si a eso mismo me refiero.
interceptar apis,etc.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda???
« Respuesta #3 en: Domingo 4 de Marzo de 2007, 09:12 »
0
Como decis API voy a centrarme en modo Usuario. Existen diferentes tecnicas pero se basan en dos fundamentos:

A. Aprovechar el formato PE
B. Sobreescribir el mismo codigo

La primera es mas simple al no necesitar saber nada sobre assembly para poder implementarla. Para esta como te decia tenes que buscar informacion sobre el formato PE (mas especificamente sobre las tablas IAT y EAT por ejemplo).

La segunda manera implica, para hacerla bien, implementar al menos un codigo que se encargue de calcular el tamaño de cualquier instruccion. Esto se debe a que normalmente lo que se hace es esto:

Teniendo como ejemplo CreateFileW, normalmente se usaria ZwCreateFile/NtCreateFile (tienen exactemante la misma direccion, una es alias de la otra) pero en este caso no sirven para demostrar el problema del tamaño de las instrucciones:

Código: Text
  1.  
  2. CreateFileW:
  3. 77e4ba58 55              push    ebp
  4. 77e4ba59 8bec            mov     ebp,esp
  5. 77e4ba5b 83ec58          sub     esp,58h
  6. 77e4ba5e 8b4518          mov     eax,dword ptr [ebp+18h]
  7. 77e4ba61 48              dec     eax
  8. 77e4ba62 0f8477e40000    je      kernel32!FindAtomA+0x10 (77e59edf)
  9. 77e4ba68 48              dec     eax
  10. 77e4ba69 0f8401050000    je      kernel32!WriteFile+0xb9 (77e4bf70)
  11.  
  12.  

El objetivo es cambiar esas instrucciones del comienzo por un jmp a donde este nuestro "hook", entonces esto quedaria asi:

Código: Text
  1.  
  2. CreateFileW:
  3. 77e4ba58 e98bec83ec      jmp     6468a6e8 <<hacemos de cuenta que esta es la direccion nuesta funcion "hook"
  4. 77e4ba5d 58              pop     eax
  5. 77e4ba5e 8b4518          mov     eax,dword ptr [ebp+18h]
  6. 77e4ba61 48              dec     eax
  7. 77e4ba62 0f8477e40000    je      kernel32!FindAtomA+0x10 (77e59edf)
  8. 77e4ba68 48              dec     eax
  9. 77e4ba69 0f8401050000    je      kernel32!WriteFile+0xb9 (77e4bf70)
  10. 77e4ba6f 48              dec     eax
  11.  
  12.  

Al haber "destruido" las primeras instrucciones de esta funcion lo que tenemos que hacer en nuestro "hook" si queremos llamar a la funcion original es justamente reproducir estas instrucciones (lo mas facil es reservar memoria y copiarlas) para posteriormente saltar a la primera instruccion bien formada que haya justo despues del jmp que insertamos. Para poder copiar las instrucciones necesarias y saber donde hay que saltar para continuar necesitamos el codigo que calcule el tamaño de las instrucciones.

Finalmente tendriamos en memoria esto:

Código: Text
  1.  
  2. CreateFileW_Trampoline:
  3. push    ebp
  4. mov     ebp,esp
  5. sub     esp,58h
  6. jmp 77e4ba5e
  7.  
  8.  

Como se puede ver ahi arriba, ejecutamos 6 bytes (las tres primeras instrucciones) y saltamos justo a la cuarta que no fue destruida al comenzar en el 7 byte (nosotros modificamos 5 bytes PERO necesitamos 6 al menos para ejecutar instrucciones completas (en este caso).

Entonces desde nuestro hermoso "hook" en C/C++ podemos hacer:

Código: Text
  1.  
  2. HANDLE __stdcall CreateFileW_Hook(LPCWSTR lpFileName,  DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
  3. {
  4.     //hacemos una comprobacion
  5.     if (!dejarArchivo(lpFileName))
  6.     {
  7.         SetLastError(ACCESS_DENIED)
  8.         return INVALID_HANDLE_VALUE;
  9.     }
  10.     //llamamos a la funcion original
  11.     return CreateFile_Trampoline(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttribues, hTemplateFile);
  12. }
  13.  
  14.  

IMPORTANTE es nunca olvidarse de respetar la convencion de llamada de la funcion "hookeada", en este caso y en el 99% de la API de Windows se usa stdcall.

En algunas versiones de Windows mas recientes podemos comprobar que muchas funciones comienzan con mov edi, edi este par de instrucciones que no hacen nada estan por una razon: poder hacer lo que Microsoft denomina "hotpatching" que basicamente es aplicar un parche en tiempo real usando un metodo de "hooking". Esas dos instrucciones se combinan con un la adicion de varios bytes al final de una funcion con lo cual podemos hacer un salto corto a la direccion de estos bytes y en la misma poner un salto a donde queramos.

Existen mas tecnicas de sobreescritura pero con esas me parece que tenes de sobra y son la mas "limpias".

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

pabloreda

  • Miembro MUY activo
  • ***
  • Mensajes: 125
    • Ver Perfil
    • http://www.reda4.org
Re: Ayuda???
« Respuesta #4 en: Domingo 4 de Marzo de 2007, 15:24 »
0
muy buena data eternal !!

asi que windows hace sus propios hook, o sea que ni el mismo SO sabe que hace exactamente cada llamada... :D

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Ayuda???
« Respuesta #5 en: Domingo 4 de Marzo de 2007, 16:13 »
0
Cita de: "pabloreda"
asi que windows hace sus propios hook, o sea que ni el mismo SO sabe que hace exactamente cada llamada... :D
No exactamente, lo que hacen es parchear, lo que hace la funcion es simpre lo mismo solo que la segunda version es correcta (en teoria). Esto es lo que se usa para aplicar un parche en tiempo de ejecucion y no necesitar reiniciar la maquina si o si, es muy util para la linea de server que tienen que estar on-line todo el tiempo. Despues cuando sea que reinicie la nueva copia del archivo se reemplazara, obviamente no podemos reemplazar en tiempo de ejecucion Kernel32.dll por ejemplo al estar cargada en todos los procesos practicamente.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.