Шаг 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, а потом ссылка еще на две структуры.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.