В прошлом шаге мы получили ссылку на структуру 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 нас не обманула.