В прошлом шаге мы научились получать заголовок 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, а потом ссылка еще на две структуры.