Ir al contenido


Foto

Explorar datos y funciones exportadas e importadas en el formato PE


  • Por favor identifícate para responder
5 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 23 diciembre 2009 - 07:08

Tras publicar la herramienta Visor de datos exportados por un ejecutable a raiz de éste hilo, me pareció que sería bueno ampliar el estudio del PE y escribir otra herramienta mas potente que explorara tanto los datos y funciones exportados como las funciones importadas en la IAT del PE.

La gran diferencia con la anterior herramienta es que es que aquella estaba basada en funciones que exploraban el PE una vez cargado por el S.O. Esta técnica impide la exploración de algunos módulos que no se pueden cargar con un LoadLibrary. Ahora explora en bruto el archivo no cargado lo que la convierte en mas versatil y potente.

Esta nueva herramienta es capaz de explorar los archivos ejecutables del Kernel sin necesidad de ser administradores del Sistema y sin trucos hacking. Nos muestra de forma amigable los datos con su nombre y direcciones hexadecimales u offsets a la ImageBase de la carga del ejecutable, si así lo preferimos. Nos permite ordenar los datos para una mejor visualización.


Las funciones en las que se basa el corazón de la herramienta son las siguientes:


cpp
  1. //---------------------------------------------------------------------------
  2.  
  3. void TForm1::GetExportData(PVOID lpFile)
  4. {
  5.   PIMAGE_EXPORT_DIRECTORY IED;
  6.   int DeltaVA;
  7.  
  8.   ClearData();
  9.   DWORD ImageBase;
  10.   DWORD ModuleEntryPoint;
  11.   IED = (PIMAGE_EXPORT_DIRECTORY) GetImageDirectory(lpFile, (DWORD)0, &DeltaVA);
  12.   if(!IED){
  13.       ViewError(ListView1, "No exported data");
  14.       return;
  15.   }
  16.  
  17.   Update();
  18.   char** Names = (char**)(IED->AddressOfNames + DeltaVA);
  19.   DWORD* EntryPoints = (DWORD*)(IED->AddressOfFunctions + DeltaVA);
  20.   WORD*  Index = (WORD*)(IED->AddressOfNameOrdinals + DeltaVA);
  21.  
  22.   // Listar las funciones exportadas:
  23.   ::ImageBase = GetKernelModuleBase(ComboBox1->Text.c_str());
  24.   if(::ImageBase == 0)
  25.       ::ImageBase = GetOptionalHeader(lpFile)->ImageBase;
  26.   if(CheckBox1->Checked)
  27.       ImageBase = 0;
  28.   else
  29.       ImageBase = ::ImageBase;
  30.      
  31.   ModuleEntryPoint = (DWORD)GetModuleEntryPoint(lpFile) + ImageBase;
  32.   StatusBar1->Panels->Items[0]->Text = "Base Address: " + IntToHex((int)ImageBase, 8)+"h";
  33.   StatusBar1->Panels->Items[1]->Text = "Entry Point: " + IntToHex((int)ModuleEntryPoint, 8)+"h";
  34.   StatusBar1->Panels->Items[2]->Text = IntToStr((int)IED->NumberOfNames) + " Functions and variables";
  35.   for(UINT n=0; n<IED->NumberOfNames; n++){
  36.       if(Index[n]>=IED->NumberOfFunctions) continue;
  37.       char* Name = Names[n] + DeltaVA;
  38.       TListItem *pItem = ListView1->Items->Add();
  39.       pItem->Caption = "";
  40.       pItem->SubItems->Add(IntToStr(Index[n] + IED->Base));// IED->Base es el Ordinal Base
  41.       pItem->SubItems->Add(IntToHex(int(EntryPoints[Index[n]] + ImageBase), 8)+"h");
  42.       pItem->SubItems->Add(Name);
  43.       Application->ProcessMessages();
  44.   }
  45. }
  46.  
  47. //---------------------------------------------------------------------------
  48. void TForm1::GetImportData(PVOID lpFile)
  49. {
  50.   PIMAGE_IMPORT_DIRECTORY  ID;
  51.   PIMAGE_SECTION_HEADER    SH;
  52.   PIMAGE_THUNK_DATA        thunk, thunkIAT;
  53.   PIMAGE_IMPORT_BY_NAME    pOrdinalName;
  54.   int                      nModules = 0;
  55.   int                      nFunc = 0;
  56.   char                    *ModuleName, *FunctionName;
  57.   int                      DeltaVA;
  58.   DWORD                    Ordinal;
  59.   DWORD                    ImageBase;
  60.  
  61.   ID = (PIMAGE_IMPORT_DIRECTORY)GetImageDirectory(lpFile, IMAGE_DIRECTORY_ENTRY_IMPORT, &DeltaVA);
  62.  
  63.   SH = GetSectionHeader(lpFile, PVOID((DWORD)ID-DeltaVA));
  64.   if(!SH || !ID){
  65.     ViewError(ListView2, "No imported data");
  66.     return;
  67.   }
  68.   ImageBase = GetKernelModuleBase(ComboBox1->Text.c_str());
  69.   if(ImageBase == 0)
  70.       ImageBase = GetOptionalHeader(lpFile)->ImageBase;
  71.   if(CheckBox1->Checked)
  72.       ImageBase = 0;
  73.  
  74.   while (ID->dwRVAModuleName){
  75.     // Localizo el ModuleName
  76.     ModuleName = (char*)(ID->dwRVAModuleName + DeltaVA);
  77.     thunk = (PIMAGE_THUNK_DATA)ID->dwRVAFunctionNameList;
  78.     thunkIAT = (PIMAGE_THUNK_DATA)ID->dwRVAFunctionAddressList;
  79.     if(thunk==0)
  80.       thunk = thunkIAT;
  81.     if(thunk==0){
  82.       ViewError(ListView1, "No imported data");
  83.       return;
  84.     }
  85.  
  86.     thunk = (PIMAGE_THUNK_DATA)((DWORD)thunk + DeltaVA);
  87.     thunkIAT = (PIMAGE_THUNK_DATA)((DWORD)thunkIAT + DeltaVA);
  88.  
  89.     while (thunk->u1.AddressOfData){
  90.       // Localizo los Nombres de función, ordinales y IAT thunk
  91.       pOrdinalName = (PIMAGE_IMPORT_BY_NAME)(thunk->u1.AddressOfData + DeltaVA);
  92.       if(thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG){
  93.         Ordinal = IMAGE_ORDINAL(thunk->u1.Ordinal);
  94.         FunctionName = "";
  95.       }else{
  96.         Ordinal = pOrdinalName->Hint;
  97.         FunctionName = pOrdinalName->Name;
  98.       }
  99.       TListItem *pItem = ListView2->Items->Add();
  100.       pItem->Caption = ModuleName;
  101.       pItem->SubItems->Add(Ordinal);
  102.       pItem->SubItems->Add(IntToHex((int)thunkIAT - DeltaVA, 8)+"h");
  103.       pItem->SubItems->Add(FunctionName);
  104.  
  105.       // Incremento el contador de funciones y los thunk
  106.       nFunc++;
  107.       thunk++;
  108.       thunkIAT++;
  109.     }
  110.  
  111.     //  Incremento el import_directory_entry y el contador de módulos.
  112.     ID++;
  113.     nModules++;
  114.   }
  115.   StatusBar2->Panels->Items[0]->Text = IntToStr(nModules)+" imported modules";
  116.   StatusBar2->Panels->Items[1]->Text = IntToStr(nFunc)+" imported functions";
  117. }
  118. //---------------------------------------------------------------------------

Espero que sea de utilidad o que sirva, al menos, para esclarecer y servir de ejemplo con código, parte del formato de archivo de PE.


Saludos.

Archivos adjuntos


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 23 diciembre 2009 - 07:30

He incluido el programa en la zona de descargas: IEDataVisor. Visionar datos del PE.

Saludos.
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 diciembre 2009 - 08:48

Cuando sea grande quiero ser como escafandra !!! :$ :p
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 23 diciembre 2009 - 09:13

SIN PALABRAS¡¡¡¡ :o:o :o :o  Amigo escafandra, en verdad es admirable la calidad técnica de sus conocimientos. por compartirnos tus conocimientos: MUCHAS GRACIAS¡¡¡¡¡¡¡¡¡¡¡¡¡
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 23 diciembre 2009 - 10:24

Vaya, que buena publicación, muchas gracias amigo escafandra.

Salud OS
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 10 junio 2010 - 04:25

He detectado un bug que se produce en algunas actualizaciones de Windows XP con el viejo control TListView + XP Manifest del BCB5 he actualizado el programa para compilarlo con BCB6 cuyo TListView no presenta el problema al añadir el XP Manifest. 

He actualizo la descarga.

Saludos.


  • 0




IP.Board spam blocked by CleanTalk.