Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Формат исполняемых PE-файлов
Обзор


PE формат файлов существует очень давно, Windows 3.11 при установленном Win32s может запускать такие файлы (более того, это заложено в архитектуру системы). Но только недавно он получил довольно широкое распространение, а именно с расширением использования Windows'95. Формат файла чрезвычайно прост, но тем не менее в нем есть очень много спотычек, через которые падают некоторые программы, да и сами Windows'95 (как программа). Следует отметить, что формат файла слизан с аналогичного в юних системах, кроме того, мелкомягкие опять поехали на изменении форматов и теперь вы можете так же лицезреть COFF формат OBJ файлов, который весьма похож на PE (собственно говоря это почти одно и то же ;-). Добавлю, что с новым форматом объектных модулей работает только Microsoft (вполне естественно, учитывая, что они его предложили), но найти данный компилятор ассемблера мне не удалось, впрочем как и линковщик. Borland по прежнему работает со старым форматом OBJ файлов, а именно - Intel OMF (справедливо для TASM v5.0 старше я не нашел). Ну а теперь о самом файловом формате.
Микрософт решила оставить у запускаемых файлов расширение EXE, а чтобы не было проблем начальным заголовком сделать запускаемый файл MS-DOS. У них это получилось, вот краткая схема названного:

Summary File Structure

00h DOS 2 Header
Совместимый заголовок (форматированная часть), будем считать, что его формат всем известен.
1Ch 4 байта, выравнивающие форматированную область заголовка с 1Ch до 20h,
никто не мешает им там не присутствовать ;-) но у Микрософта они описаны.
Это позволяет заголовку файла иметь красивый размер в 2 параграфа...
20h OEM Identifier & OEM Info
Другими словами, информация о программе, практически никогда не присутствует, однако место должно быть зарезервировано. Я встречал файлы с заполненным полем, наверное их делали люди буквально соблюдающие требования документации от Microsoft.
3Ch Offset to PE Header
Смещение реального PE заголовка в файле, DWord, присутствует именно здесь,
? заголовок выравнивается на 8 байтовую границу относительно начала файла.
min 40h релокейшены программы-заглушки, у стандартного STUB'а их нет.
На это поле указывает ReloOfs заголовка DOS 2 Header, соответственно его значение должно быть >=40h иначе такой файл как кандидат в PE рассматриваться вообще не будет. ;-)
Но на самом деле загрузчику безразлично фактическое их положение.
min 40h + XXh собственно говоря, тело DOS программы, иначе говоря STUB'a.
Чаще всего говорит о невозможности запуска, но может содержать в себе очень разрушительные вещи, как то поиск в PATH и запуск файла WIN.COM с указанием имени данного файла, причем без предупреждений, что конечно-же весьма неприятно. 40h есть нижняя граница данного поля, может, собственно говоря, находиться сколь угодно выше, зависит от размера заголовка.
XXh PE Header
Туточки находится заголовок PE файла и, другими словами, начинается сама 32-битная программа,
по идее он должен быть выровнен на 8-байтовую границу, пусть так и будет.
XXh Object Table
табличка описаний секций файла, подробнее далее.
XXh Image Pages (import info, export info, fixup info, resource info, debug info, etc...)
Остальная часть запускаемого файла...


Для проверки на возможность файла быть в формате PE необходимо, чтобы он был во первых EXE (байты по смещению 0h равны 5A4Dh), во вторых, слово по смещению 18h должно быть >=40h, тогда и только тогда DWord поле по смещению 3Ch имеет смысл. Загрузчик маздая файлы с заголовком 'ZM' - 4D5Ah не считает валидными 32-битовыми программами. При запуске из дос-окна выполняется ДОС часть программы, а при запуске с помощью CreateProcessA (консольная утилита START.EXE вызывает данный сервис) выдается сообщение о невозможности запуска программы, т.к. это не валидное 32-битовое приложение. Так же интересен следующий момент: возможен запуск файлов с расширением COM и структурой PE, но невозможен запуск файлов с расширением COM и структурой NE. Загрузчик 32-битового приложения проверяет на принадлежность файла к разряду 16-битовых приложений и передает управление в 16-битовый Kernel, в свою очередь тот отбраковывает переданное ему приложение и выполняет STUB.
Так же следует заметить, что фактическое значение поля ReloOffs заголовка DOS 2 Header для загрузчика PE файлов безразлично (он его не проверяет), соответственно это можно использовать в своих целях. (Зато HIEW это проверяет и отказывается работать с такими файлами, чтение документаций - вредная штука).

[Оглавление]

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz