Foro de elhacker.net

Seguridad Informática => Análisis y Diseño de Malware => Mensaje iniciado por: mr.blood en 23 Enero 2013, 16:40 pm



Título: [Libreria C] Hook a la IAT
Publicado por: mr.blood en 23 Enero 2013, 16:40 pm
Por si a alguien le ayuda. Es mejorable, no tiene ningun control de errores era solo para mostrar la idea ;).

No se si esto va en esta sección o en la de Programacion en C. Creo que esta mas relacionado con esto.

hookiat.c
Código
  1. #include "hookiat.h"
  2.  
  3. void HookIAT(char *tohooklibrary, char *tohookfunc, void *newfunc)
  4. {
  5. DWORD image_base=GetModuleHandleA(0);
  6. PIMAGE_DOS_HEADER DOS;
  7. PIMAGE_NT_HEADERS NT;
  8. PIMAGE_IMPORT_DESCRIPTOR IT;
  9. PIMAGE_IMPORT_BY_NAME *IMPORTED_FUNCTIONS;
  10. PIMAGE_THUNK_DATA Funcion;
  11. DWORD *IMPORTED_DLL_NAME;
  12. DWORD *IMPORTED_FUNCTION_NAME;
  13. unsigned int i=0;
  14.  
  15. DOS=(PIMAGE_DOS_HEADER)image_base;
  16. NT=(PIMAGE_NT_HEADERS)(DOS->e_lfanew + image_base);
  17. IT=(PIMAGE_IMPORT_DESCRIPTOR)(NT->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + image_base);
  18. IMPORTED_DLL_NAME=(DWORD *)(IT->Name + image_base);
  19.  
  20. while( (IT->Name) != 0 )
  21. {
  22. IMPORTED_DLL_NAME=(DWORD *)(IT->Name + image_base);
  23. if(!strcmp((char *)IMPORTED_DLL_NAME, tohooklibrary))
  24. {
  25. break;
  26. }
  27. IT++;
  28. }
  29.  
  30. IMPORTED_FUNCTIONS=(PIMAGE_IMPORT_BY_NAME *)(IT->Characteristics + image_base);
  31.  
  32. for(i=0;;i++)
  33. {
  34. IMPORTED_FUNCTION_NAME=(DWORD *)((*IMPORTED_FUNCTIONS)->Name + image_base);
  35. if(((*IMPORTED_FUNCTIONS)!=0) && (!strcmp((char *)IMPORTED_FUNCTION_NAME, tohookfunc)))
  36. {
  37. break;
  38. }
  39. IMPORTED_FUNCTIONS++;
  40. }
  41.  
  42. Funcion=(PIMAGE_THUNK_DATA)(IT->FirstThunk + image_base);
  43. Funcion+=i;
  44. ORIGINAL_FUNCTION=(void *)Funcion->u1.Function;
  45. Funcion->u1.Function=(DWORD)newfunc;
  46. }
  47.  

hookiat.h
Código
  1. #include <string.h>
  2. #include <windows.h>
  3.  
  4. void *ORIGINAL_FUNCTION;
  5.  
  6. void HookIAT(char *tohooklibrary, char *tohookfunc, void *newfunc);
  7.  

Sa1uDoS


Título: Re: [Libreria C] Hook a la IAT
Publicado por: Arkangel_0x7C5 en 23 Enero 2013, 18:21 pm
Buen codogo.
Como recomendación para su uso, seria recomendable hacer el hook al inicio de la aplicaccion y enganchar también GetProcAddress para que no se te escape cuando usen punteros a esas funciones

Saludos


Título: Re: [Libreria C] Hook a la IAT
Publicado por: mr.blood en 23 Enero 2013, 19:34 pm
Si, es la desventaja de este tipo de Hooks, si usan GetProcAddress no los "engancha", hay que hookear GetProcAddress tambien.

Gracias por el comentario ;).

Pero a mi es el tipo de Hook que mas me gusta



Como recomendación para su uso, seria recomendable hacer el hook al inicio de la aplicaccion

¿A que te refieres con eso?

Sa1uDoS


Título: Re: [Libreria C] Hook a la IAT
Publicado por: Arkangel_0x7C5 en 23 Enero 2013, 19:47 pm

¿A que te refieres con eso?

Sa1uDoS


A que pongan el gancho justo cuando la aplicaccion se ejecuta, para que no le de tiempo a llamar a GetProcAddress.
Tambien se puede usar para las importaciones de otras dll, por lo que un campo para el nombre del modulo estaría interesante

Saludos


Título: Re: [Libreria C] Hook a la IAT
Publicado por: mr.blood en 23 Enero 2013, 20:57 pm
Ah bueno jaja. Pero esto es una funcion, que cada uno la use como mas conveniente crea.

Sa1uDoS

P.D.: Que gusto da este foro, la gente comenta.


Título: Re: [Libreria C] Hook a la IAT
Publicado por: Karcrack en 24 Enero 2013, 01:50 am
Gracias por la aportación mr.blood :)
Realmente lo ideal sería hookear LdrGetProcedureAddress() a pesar de que recorriendo la EAT manualmente se podría escapar.

Otra librería de [Zero]:
Código:
http://foro.elhacker.net/analisis_y_diseno_de_malware/srccasm_clshookapi-t281292.0.html

Saludos