|
Шаг 24 - PIMAGE_NT_HEADERS.
В прошлом шаге мы научились получать заголовок MS DOS. За ним следует MS DOS Stub, то есть заглушка MS DOS, а за ней PE заголовок, который описывается структурой PIMAGE_NT_HEADERS. Для того, чтобы добраться до PE заголовка в структуре MS DOS есть поле со смещением до этого заголовка.
typedef struct _IMAGE_DOS_HEADER
{
.............
LONG e_lfanew; // адрес в файле нового .exe заголовка (PE)
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
Нам надо научиться вычислять смещение до этого заголовка. Создадим для этого макрос.
#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew))
И получим заголовок PE.
// TestAPI.cpp : Defines the entry point for the application.
//
..........
if ( pDOSHead->e_magic != IMAGE_DOS_SIGNATURE )
{
MessageBox(NULL,"Error Dos Header signature MZ","Error",MB_OK);
return FALSE;
}
PIMAGE_NT_HEADERS pPEHeader;
pPEHeader=(PIMAGE_NT_HEADERS) NTSIGNATURE(pDOSHead);
return TRUE;
}
Теперь нужно проверить сигнатуру, что это заголовок именно PE.
if ( pPEHeader->Signature != IMAGE_NT_SIGNATURE )
{
MessageBox(NULL,"Error PE Header signature PE","Error",MB_OK);
return FALSE;
}
Давайте посмотрим, что еще есть в этой структуре.
typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
typedef struct _IMAGE_NT_HEADERS
{
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
Как видите первое поле это сигнатура, которая должна быть PE, а потом ссылка еще на две структуры.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|