Анатомия файла Иван Скляров Спецвыпуск: Хакер, номер #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; |