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