| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

Шаг 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
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz