Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Анатомия файла

Иван Скляров

Спецвыпуск: Хакер, номер #057, стр. 057-026-2


PE-заголовок

Формат PE-заголовка представлен структурой IMAGE_NT_HEADERS, которая в 32-разрядных системах соответствует структуре IMAGE_NT_HEADERS32:

typedef struct _IMAGE_NT_HEADERS {

DWORD Signature;

IMAGE_FILE_HEADER FileHeader;

IMAGE_OPTIONAL_HEADER32 OptionalHeader;

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Как видно, структура состоит из трех частей. Первая часть - это сигнатура, которая для PE-файла равна 0x00004550 или, в ASCII-символах, "PE00". Кстати, именно из-за этой сигнатуры исполняемый файл Windows и называют PE-файлом. Вторая часть - это файловый заголовок (FileHeader), а третья часть - опциональный заголовок (OptionalHeader). Рассмотрим отдельно оба заголовка.

Файловый заголовок

Файловый заголовок в winnt.h описан такой структурой:

typedef struct _IMAGE_FILE_HEADER {

WORD Machine;

WORD NumberOfSections;

DWORD TimeDateStamp;

DWORD PointerToSymbolTable;

DWORD NumberOfSymbols;

WORD SizeOfOptionalHeader;

WORD Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

#define IMAGE_SIZEOF_FILE_HEADER 20

Как видишь, размер заголовка для удобства также определен в файле заголовков (значение 20). Первое поле, Machine, используется для идентификации типа процессора, для которого скомпилирован исполняемый файл: Alpha, MIPS, Intel и др. Поле NumberOfSections содержит количество секций в файле, или, точнее - количество заголовков секций и количество тел секций, имеющихся в исполнимом PE-файле. Это поле занимает одно слово, поэтому максимальное число секций в файле составляет 65536. В третьем поле, TimeDateStamp, записано число секунд, которые прошли с момента 16-ти часов 1969 года до момента создания файла. В поле PointerToSymbolTable содержится смещение таблицы символов, о которой будет рассказано ниже, а в поле NumberOfSymbols указано количество символов в таблице символов отладочной информации. SizeOfOptionalHeader хранит размер опционального заголовка. И последнее поле, Characteristics, содержит специфические характеристики файла, например, IMAGE_FILE_DEBUG_STRIPPED указывает на то, что из файла была удалена отладочная информация, а IMAGE_FILE_DLL говорит о том, что файл является DLL, а не исполняемым файлом. Все характеристики с комментариями можно увидеть в файле winnt.h сразу после описания файлового заголовка.

Опциональный заголовок

Теперь перейдем к опциональному заголовку. Вот его описание из заголовочного файла winnt.h:

typedef struct _IMAGE_OPTIONAL_HEADER {

//

// Standard fields.

//

WORD Magic;

BYTE MajorLinkerVersion;

BYTE MinorLinkerVersion;

DWORD SizeOfCode;

DWORD SizeOfInitializedData;

DWORD SizeOfUninitializedData;

DWORD AddressOfEntryPoint;

DWORD BaseOfCode;

DWORD BaseOfData;

//

// NT additional fields.

//

DWORD ImageBase;

DWORD SectionAlignment;

DWORD FileAlignment;

WORD MajorOperatingSystemVersion;

WORD MinorOperatingSystemVersion;

WORD MajorImageVersion;

WORD MinorImageVersion;

Назад на стр. 057-026-1  Содержание  Вперед на стр. 057-026-3