Шаг 26 - IMAGE_OPTIONAL_HEADER32.
В позапрошлом шаге мы получили ссылку на структуру 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, которая перегружает Ваш компьютер :-).
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|