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

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

Иван Скляров

Спецвыпуск: Хакер, номер #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