2012-05-10 3 views
0

Я попытался перечислить импортированную DLL файла PE, используя следующий код, но он не работает, и в Windows говорится, что exe перестает работать, когда я запускаю его. В коде я просто сопоставлял данный exe-файл в памяти с помощью функции CreateFileMapping, а затем исследовал каждый раздел, используя соответствующие структуры, указанные в Win32 API. Как я могу это исправить?Список импортированных DLL файлов PE

#include <stdio.h> 
#include <windows.h> 

//add Pointer Values 
#define MakePtr(cast, ptr, addValue) (cast)((unsigned long)(ptr)+(unsigned long)(addValue)) 


int main(int argc , char ** argv) //main method 
{ 
HANDLE hMapObject, hFile;//File Mapping Object 
LPVOID lpBase;//Pointer to the base memory of mapped 

PIMAGE_DOS_HEADER dosHeader;//Pointer to DOS Header 
PIMAGE_NT_HEADERS ntHeader;//Pointer to NT Header 
PIMAGE_IMPORT_DESCRIPTOR importDesc;//Pointer to import descriptor 

hFile = CreateFile(argv[1],GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//Open the Exe File 
if(hFile == INVALID_HANDLE_VALUE){ 
     printf("\nERROR : Could not open the file specified\n"); 
} 
hMapObject = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); 
lpBase = MapViewOfFile(hMapObject,FILE_MAP_READ,0,0,0);//Mapping Given EXE file to Memory 

dosHeader = (PIMAGE_DOS_HEADER)lpBase;//Get the DOS Header Base 
//verify dos header 
if (dosHeader->e_magic == IMAGE_DOS_SIGNATURE) 
{ 

    ntHeader = MakePtr(PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew);//Get the NT Header 
      //verify NT header 
    if (ntHeader->Signature == IMAGE_NT_SIGNATURE){ 
     importDesc = MakePtr(PIMAGE_IMPORT_DESCRIPTOR, dosHeader,ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress); 

     while (importDesc->Name) 
     { 
      printf("%s\n",MakePtr(char*, dosHeader,importDesc->Name)); 
      importDesc++;    
     } 

    } 
} 

getchar(); 

} 
+0

Это трудный способ сделать это. MS предоставляет DLL dbghelp для этого. –

ответ

3

Содержание списка, который вы ищите, содержится в разделе (например, почти все в изображении PE). Вы должны получить доступ к разделу, на который указывает каталог. Взгляните на код Мэтта Пьетрека (PeDump), чтобы узнать, как он работает.

+0

Код Мэтта старый и не очень подготовлен к обработке некоторых изображений PE, но это действительно помогло мне создать PeStudio. – mox

+0

Просьба указать причину для downvoting и предложение исправить любую ошибку! Благодарю. – mox

+1

Теперь я пишу свой собственный парсер, и формат PE меня немного смущает. Я использую PeStudio для проверки некоторых ключевых значений, которые я извлекаю! Спасибо, что сделали! – Dio

Смежные вопросы