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









































































