|
||||||||||||||||||||||||||||||||||||
|
Формат исполняемых PE-файлов
|
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 программирование: Бурлаков Михаил