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

Иван Скляров

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

(www.sklyaroff.com)

Просто, но со вкусом о PE-формате файлов

Зачем крэкеру знать все о PE-формате? Затем же, зачем хирургу знать устройство человеческого организма. PE-формат - это основной формат файлов Windows, с которым приходится работать крэкеру. Без знаний об этом формате невозможно полноценно заниматься крэкингом.

Полного описания PE-формата не существует в природе. Есть множество материалов в MSDN, есть отдельные статьи исследователей (например несколько статей от Мэтта Питтрека, которые присутствуют и в MSDN), но все это содержит недомолвки, неточности, ошибки. Впрочем, и эта статья никак не претендует на полное описание и организует лишь вводное знакомство с PE-форматом.

Все структуры, макросы и сигнатуры PE-формата содержатся в заголовочном файле winnt.h, на него и буду опираться в дальнейшем. Увы, этот файл довольно скудно откомментирован, так что о назначении некоторых полей можно лишь догадываться.

Общее устройство PE-файла

В самом общем случае PE-файл состоит из четырех частей, которые идут в следующем порядке, начиная с нулевого адреса:

1. DOS-заголовок (IMAGE_DOS_HEADER);

2. PE-заголовок (IMAGE_NT_HEADERS);

3. таблица секций (IMAGE_SECTION_HEADER);

4. cекции.

В самом конце PE-файла за секциями вполне могут размещаться дополнительные данные, например какая-нибудь отладочная информация, но это носит необязательный характер.

Заголовок DOS

В файле winnt.h DOS-заголовок описан следующей структурой:

typedef struct _IMAGE_DOS_HEADER { // DOS .EXE заголовок

USHORT e_magic; // Магическое число

USHORT e_cblp; // Количество байт на последней странице файла

USHORT e_cp; // Количество страниц в файле

USHORT e_crlc; // Relocations

USHORT e_cparhdr; // Размер заголовка в параграфах

USHORT e_minalloc; // Minimum extra paragraphs needed

USHORT e_maxalloc; // Maximum extra paragraphs needed

USHORT e_ss; // Начальное (относительное) значение регистра SS

USHORT e_sp; // Начальное значение регистра SP

USHORT e_csum; // Контрольная сумма

USHORT e_ip; // Начальное значение регистра IP

USHORT e_cs; // Начальное (относительное) значение регистра CS

USHORT e_lfarlc; // Адрес в файле на таблицу переадресации

USHORT e_ovno; // Количество оверлеев

USHORT e_res[4]; // Зарезервировано

USHORT e_oemid; // OEM identifier (for e_oeminfo)

USHORT e_oeminfo; // OEM information; e_oemid specific

USHORT e_res2[10]; // Зарезервировано

LONG e_lfanew; // Адрес в файле нового .exe-заголовка

} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

Самым важным здесь является поле e_lfanew, которое содержит 4-байтовое смещение от начала файла до PE-заголовка. Первое поле структуры e_magic содержит сигнатуру исполняемого файла. Все MS-DOS-совместимые исполняемые файлы имеют сигнатуру 0x54AD, которая в ASCII-символах представлена двумя символами MZ. По этой причине заголовок DOS часто называют MZ-заголовком.

Содержание  Вперед на стр. 057-026-2
Выпуски журнала "СПЕЦ Xakep"
Cпец Хакер #01Cпец Хакер #02Cпец Хакер #03Cпец Хакер #04Cпец Хакер #05Cпец Хакер #06Cпец Хакер #07Cпец Хакер #08Cпец Хакер #09Cпец Хакер #10Cпец Хакер #11Cпец Хакер #12Cпец Хакер #13Cпец Хакер #14Cпец Хакер #15Cпец Хакер #16Cпец Хакер #17Cпец Хакер #18Cпец Хакер #19Cпец Хакер #20Cпец Хакер #21Cпец Хакер #22Cпец Хакер #23Cпец Хакер #24Cпец Хакер #25Cпец Хакер #26Cпец Хакер #27Cпец Хакер #28Cпец Хакер #29Cпец Хакер #30Cпец Хакер #31Cпец Хакер #32Cпец Хакер #33Cпец Хакер #34Cпец Хакер #35Cпец Хакер #36Cпец Хакер #37Cпец Хакер #38Cпец Хакер #39Cпец Хакер #40Cпец Хакер #41Cпец Хакер #42Cпец Хакер #43Cпец Хакер #44Cпец Хакер #45Cпец Хакер #46Cпец Хакер #47Cпец Хакер #48Cпец Хакер #49Cпец Хакер #50Cпец Хакер #51Cпец Хакер #52Cпец Хакер #53Cпец Хакер #54Cпец Хакер #55Cпец Хакер #56Cпец Хакер #57Cпец Хакер #58Cпец Хакер #59Cпец Хакер #60Cпец Хакер #61Cпец Хакер #62Cпец Хакер #63Cпец Хакер #64Cпец Хакер #65Cпец Хакер #66Cпец Хакер #67Cпец Хакер #68Cпец Хакер #69Cпец Хакер #70Cпец Хакер #71Cпец Хакер #72Cпец Хакер #73Cпец Хакер #74Cпец Хакер #75