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.

[SCR] GetProcAddres con hash FNV

  • 2 Respuestas
  • 1905 Vistas

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

Desconectado Arkangel

  • *
  • Underc0der
  • Mensajes: 15
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« en: Junio 17, 2013, 08:25:40 am »
Aqui les traigo esta funcion que ahorra  espacio cuando usas muchas importaciones y a parte, sirve para ocultar lo que importas al no quedar rastro visible de las cadenas de las apis

GetProcAddressByHash.c
Código: C++
  1. FARPROC WINAPI GetProcAddressByHash(HINSTANCE hModule,ulong hash){
  2.     register PIMAGE_NT_HEADERS PE;
  3.     register FARPROC proc = null;
  4.     register PIMAGE_EXPORT_DIRECTORY ExpDir = null;
  5.     register char** ExportNames = null;
  6.  
  7.     //Comprovamos la marca de DOS
  8.     if(*((ushort*)hModule)==IMAGE_DOS_SIGNATURE){
  9.         //localizamos la cabecera PE
  10.         PE = (PIMAGE_NT_HEADERS)(((IMAGE_DOS_HEADER*)hModule)->e_lfanew+(ulong)hModule);
  11.         //Compruebo la firma de PE y que halla tabla de importaciones
  12.         if(PE->Signature == IMAGE_NT_SIGNATURE
  13.                 && PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size){
  14.             //Localizo el directorio de exportaciones
  15.             ExpDir = (PIMAGE_EXPORT_DIRECTORY)(PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
  16.                     .VirtualAddress+(ulong)hModule);
  17. #ifdef DEBUG
  18.             DebugPrintf("GPA","ExpDir = %p,EXPORT_DIRECTORY = %x",ExpDir,PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]
  19.                         .VirtualAddress);
  20. #endif
  21.             //Localizo los nombres de simbolos exportados y busco la funcion
  22.             ExportNames = (char**)(ExpDir->AddressOfNames+(ulong)hModule);
  23.             register int i;
  24.             for(i = 0;ExportNames[i];i++){
  25.                 //Comparo los hash para buscar la funcion
  26.                 if(fnv32(ExportNames[i]+(ulong)hModule) == hash){
  27.                     ulong* funtionRVAs = (ulong*)(ExpDir->AddressOfFunctions+(ulong)hModule);
  28.                     ushort* ordinalRVAs = (ushort*)(ExpDir->AddressOfNameOrdinals+(ulong)hModule);
  29.                     //Calculamos la direccion de la funcion
  30.                     proc = (FARPROC)(funtionRVAs[ordinalRVAs[i]] +(ulong)hModule);
  31.                     break;
  32.                 }
  33.             }
  34.  
  35.         }
  36.     }
  37.     return proc;
  38. }
  39.  
fnv.c
Código: C++
  1. #define FNV_PRIME_32 16777619
  2. #define FNV_OFFSET_32 2166136261U
  3.  
  4. ulong fnv32(register const char *s){
  5.     register ulong hash = FNV_OFFSET_32;
  6.  
  7.     while(*s)
  8.         hash = (hash ^ (*(s++)))*FNV_PRIME_32;
  9.  
  10.     return hash;
  11. }
  12.  
« Última modificación: Febrero 08, 2014, 05:37:31 pm por Expermicid »

Desconectado Karcrack

  • *
  • Underc0der
  • Mensajes: 87
  • Actividad:
    0%
  • Reputación 0
  • Se siente observado ¬¬'
    • Ver Perfil
« Respuesta #1 en: Junio 17, 2013, 12:34:03 pm »
Buen code sólo falta aclarar que no funcionaría ni con ordinales ni con forwarded imports.
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Desconectado Arkangel

  • *
  • Underc0der
  • Mensajes: 15
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #2 en: Junio 18, 2013, 08:02:27 am »
lo de los ordinales no hay solucion, pero lo de los forward se podria solucionar, solo que complicaria la funcion un poco

Saludos

 

¿Te gustó el post? COMPARTILO!