Шаг 27 - Каталог IMAGE_DIRECTORY_ENTRY_EXPORT и истинное имя DLL

В прошлом шаге мы получили ссылку на структуру IMAGE_OPTIONAL_HEADER32, из которой мы можем добраться до любого раздела файла PE формата.

Сейчас нам интересен раздел IMAGE_DIRECTORY_ENTRY_EXPORT, в котором находится список экспортированных функций. Этот каталог типичен для DLL и в нем обычно находятся ссылки на функции, которые DLL предоставляет системе. Но для начала нам нужно создать макрос, который поможет нам получать адреса в памяти, так как структуры полны всяких ссылок. Этот макрос такой.

#define MakePtr(Type, Base, Offset) ((Type)(DWORD(Base) + (DWORD)(Offset)))

Каталогу IMAGE_DIRECTORY_ENTRY_EXPORT соответствует структура IMAGE_EXPORT_DIRECTORY.

typedef struct _IMAGE_EXPORT_DIRECTORY 
{
	DWORD   Characteristics;
	DWORD   TimeDateStamp;
	WORD    MajorVersion;
	WORD    MinorVersion;
	DWORD   Name;
	DWORD   Base;
	DWORD   NumberOfFunctions;
	DWORD   NumberOfNames;
	DWORD   AddressOfFunctions;     
	DWORD   AddressOfNames;         
	DWORD   AddressOfNameOrdinals;  
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

Назначения этих полей такие:

Давайте пока на этом остановимся. И попробуем получить ссылку на структуру IMAGE_EXPORT_DIRECTORY и посмотреть имя DLL дабы убедиться, что ссылку на эту структуру мы получили правильно.

......
IMAGE_OPTIONAL_HEADER32 OptionHeader;
OptionHeader = (IMAGE_OPTIONAL_HEADER32) pPEHeader->OptionalHeader; 

PIMAGE_EXPORT_DIRECTORY pImportDesc=NULL; 
pImportDesc = MakePtr(PIMAGE_EXPORT_DIRECTORY,hUser32,
	pPEHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

char *p;
p=MakePtr(char*,hUser32,pImportDesc->Name);
MessageBox(NULL,p,"Info",MB_OK);
return TRUE;

На экран должно быть выведено USER32.DLL. Это имя DLL, которое находится внутри. И оно совпадает с именем в файловой системе. Microsoft нас не обманула.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.