В позапрошлом шаге мы получили ссылку на структуру 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, которая перегружает Ваш компьютер :-)