|
Шаг 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;
Назначения этих полей такие:
- Поле Characteristics является неиспользуемым и обычно 0.
- TimeDateStamp хранит время создания таблицы.
- MajorVersion и MinorVersion часто устанавливаются в 0.
- Name имя DLL, как 0-законченная строка ASCII. Имя необходимо в случае, если DLL файл переименован.
- NumberOfFunctions число экспортируемых функций.
- NumberOfNames число экспортируемых названий.
- AddressOfFunctions массив точек входа.
Давайте пока на этом остановимся. И попробуем получить ссылку на структуру 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 нас не обманула.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|