Требования к заголовку PE - PullRequest
5 голосов
/ 17 января 2010

Каковы требования к файлу PE (PE / COFF)? Какие поля должны быть установлены, какое значение, как минимум, для того, чтобы он мог «запускаться» в Windows (то есть, выполняя инструкцию «ret» и затем закрываясь, без ошибок).

Библиотека, которую я создаю сначала, является компоновщиком: теперь у меня проблема с файлом PE (PE / COFF). Я не знаю, что "требуется" для PE-файла, прежде чем он действительно сможет работать на моей платформе. Моя платформа тестирования - Vista. Я получаю сообщение об ошибке: « Это недопустимый исполняемый файл Win32. », когда я выполняю его двойным щелчком, и я получаю «Отказано в доступе». при выполнении с CLI cmd . У меня есть два раздела, .text и .data.

Я реализовал PE-заголовки в соответствии с несколькими онлайн-документами, т. Е. MSDN и некоторой другой документацией третьих сторон. Если я использую hex-редактор, он выглядит почти как обычный PE-файл. Я не использую ни импорт, ни IAT, ни каталоги в заголовке PE.

Редактировать: Я добавил таблицу импорта , которая по-прежнему не является действительным .exe-файлом, говорит моя Windows. Я попытался использовать значения, которые также упоминаются в наименьшем руководстве по PE-файлам. Неудачно. На самом деле единственное, что я не могу понять, это то, что требуется, а что нет. Некоторые гиды говорят мне, что все требуется, в то время как другие говорят об ограничениях: и это может быть ноль.

Надеюсь, этой информации достаточно. Заранее спасибо.


Необработанные данные (по запросу) текущего PE-заголовка:

4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 50 45 00 00 4C 01 02 00 C8 7A 55 4B 00 00 00 00 00 00 00 00 E0 00 82 01 0B 01 0D 25 00 10 00 00 00 10 00 00 00 00 00 00 00 10 00 00 00 10 00 00 00 20 00 00 00 00 40 00 00 10 00 00 00 02 00 00 01 00 0B 00 00 00 00 00 03 00 0A 00 00 00 00 00 00 22 00 00 38 01 00 00 00 00 00 00 03 00 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 00 00 00 0E 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00 00 00 00 00 00 10 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 2E 69 64 61 74 61 00 00 00 00 00 00 00 20 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 20 00 00 00 00 00 00 00 00 00 00 24 20 00 00 34 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4B 45 52 4E 45 4C 33 32 2E 64 6C 6C 00 00 00 00 01 00 00 80 00 00 00 00 01 00 00 80 00 00 00 00

Ответы [ 5 ]

2 голосов
/ 27 марта 2010

То, что вы пытаетесь сделать, зависит от версии Windows, которую вы используете. Например, способ чтения PE-файлов в Windows 2000 отличается от способа их чтения в Windows 7. Я пользователь OSX, но в Windows 7 у меня нет возможности манипулировать PE-файлами так, как это работает в Windows 2000 и более ранних версиях. Я не тестировал XP или Vista (или другие версии между 2000 и Win7), чтобы увидеть, когда Windows начала читать PE по-другому. В Windows 7 каждый бит памяти в заголовке и заглушке MS-DOS игнорируется. Имеют значение только два элемента: «магическое число» (WORD, равное «MZ») и смещение PE, которое является DWORD, определяющим место в памяти для начала PE-заголовка. Я не уверен, что Windows действительно игнорирует все остальные значения в заголовке и заглушке MS-DOS 100% времени, но, за исключением двух, которые я только что упомянул, если все другие значения установлены в 0, допустимая исполняемая программа будет работать правильно .

В Windows 2000 и более ранних версиях я не знаю, было ли то, что я упомянул выше, правдой, но в то время вам было разрешено изменить длину заглушки MS-DOS (или, возможно, удалить ее) при условии, что PE Значение смещения все еще указывало на правильное место в памяти, чтобы найти заголовок PE. В Windows 7, если вы вообще измените длину заглушки MS-DOS, даже если PE Offset указывает на правильное, измененное расположение, Windows не будет запускать exe и заявляет, что это не допустимое приложение Win32.

4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Это наименьшая часть MS-DOS PE-файла, которая может быть в Windows 7, но при этом все еще имеет действующий исполняемый файл. Этот бит не может быть сокращен.

Надеюсь, это прояснит некоторые вещи.

2 голосов
/ 17 января 2010

Это полная боль - копировать вставку в шестнадцатеричный редактор, поэтому, к сожалению, я не могу сказать что-то слишком умное сразу.

Что нужно отметить в PE-файле: Убедитесь, что ваш заголовок DOS действителен. Убедитесь, что IMAGE_OPTIONAL_HEADER правильно отформатирован, потому что, несмотря на свое имя, Windows не очень нравится, когда его не делают должным образом.

Для получения дополнительной информации, помимо формата MS, ищите pe.txt , одно из лучших руководств по домашнему пиву в формате PE, который я знаю.

Если бы вы могли публиковать только байты, я мог бы попробовать поместить их в свои собственные PE-парсеры и посмотреть, смогу ли я помочь больше.

2 голосов
/ 19 января 2010

Эта статья о создании крошечных исполняемых файлов PE может представлять интерес: в частности, упоминается, что загрузчику Win2k требуется импортировать KERNEL32.DLL, так что, возможно, стоит исследовать ее.

1 голос
/ 12 марта 2010

Вы можете попробовать такую ​​книгу, как .NET 2.0 IL Assembler. В этой книге есть целая глава, посвященная тому, как выглядит исполняемый файл формата PE (и как выглядит .Net PE).

Вы также можете попробовать загрузить PE-файлы с помощью PE File Reader и проверить результаты. Если читатель PE борется с вашим PE, у вас есть указатель на то, что не работает.

Вот DLL-файл для чтения файлов PE , которую я написал (с исходным кодом). Существует также графический интерфейс (с источником), который использует его.

Источник является полностью открытым исходным кодом (не обремененным лицензией GPL), поэтому вы можете делать с ним все, что захотите (за исключением наложения на него лицензии GPL, которая помешает его полной открытости), включая закрытие вашей версии.

0 голосов
/ 17 января 2010

Спецификация Microsoft PE / COFF - единственная, о которой я знаю.

...