В позапрошлом шаге мы получили ссылку на структуру PIMAGE_NT_HEADERS, которая включает две структуры. Одна из них IMAGE_FILE_HEADER. С ней мы познакомились. Вторая структура - это IMAGE_OPTIONAL_HEADER32. Вот так ее мы получим:
......
if (FileHeader.Machine!=IMAGE_FILE_MACHINE_I386)
{
MessageBox(NULL,"Error Not 386 Proccesor","Error",MB_OK);
return FALSE;
}
IMAGE_OPTIONAL_HEADER32 OptionHeader;
OptionHeader = (IMAGE_OPTIONAL_HEADER32) pPEHeader->OptionalHeader;
return TRUE;
}
Эта структура довольна большая. Вот ее описание:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// стандартные поля
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT дополнительные поля.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
Чего здесь только не содержится относительно модуля. Куча всякой информации. Все ее мы рассматривать пока не будем. Я скажу к чему я веду. Я веду к тому, чтобы вычислить адрес конкретной экспортируемой функции из модуля User32.Dll. Зачем ??? Узнаем потом. А пока я хочу добраться до этого адреса через структуру заголовков модулей. Нас интересует IMAGE_DATA_DIRECTORY. Это массив записей о каталогах с информацией.
//
// Directory format.
//
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
Как видите этих каталогов 16. Вот они:
// Каталоги данных // Каталог экспортируемых объектов #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Каталог импортируемых объектов #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Каталог ресурсов #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Каталог исключений #define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Каталог безопасности #define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Таблица переадресации #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Отладочный каталог #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Строки описания #define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Машинный значения (MIPS GP) #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Каталог TLS (Thread local storage - локальная память потоков) #define IMAGE_DIRECTORY_ENTRY_TLS 9 // Каталог конфигурации загрузки #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // таблица адресов импорта #define IMAGE_DIRECTORY_ENTRY_IAT 12 #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // информация COM объектов #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
Все импортируемые объекты находятся в каталоге IMAGE_DIRECTORY_ENTRY_IMPORT. Там же находится и функция ExitWindowEx, которая перегружает Ваш компьютер :-)