Как я могу создать исполняемый PE-файл .exe вручную?

Все тексты о том, как создать компилятор, останавливаются после объяснения лексеров и синтаксических анализаторов. Они не объясняют, как создать машинный код. Я хочу понять непрерывный процесс.

В настоящее время я понимаю, что форматы файлов Windows exe называются Portable Executable. Я читал о заголовках, которые у него есть, но пока не нашел ресурса, который бы это легко объяснил.

Моя следующая проблема: я не вижу ресурсов, которые объясняют, как машинный код хранится в файле. Это как 32-битные инструкции фиксированной длины, хранящиеся одна за другой в разделе .text?

Есть ли место, которое хотя бы объясняет, как создать exe-файл, который ничего не делает (у него есть инструкция No Op). Следующим моим шагом будет подключение к файлам dll для печати на консоли.


person AppleGrew    schedule 31.10.2011    source источник
comment
Обратите внимание, что разные системы по-разному представляют исполняемые файлы.   -  person Keith Thompson    schedule 31.10.2011
comment
Он упомянул Windows ... Я думаю, что он имеет в виду именно это (формат EXE).   -  person qJake    schedule 31.10.2011
comment
Да, я хотел бы сначала сосредоточиться на Windows. Когда меня это устраивает, я могу перейти к ELF.   -  person AppleGrew    schedule 31.10.2011
comment
Это не заслуживает ответа, но Microsoft реализует версию формата COFF с описанием здесь: msdn.microsoft.com/en-us/windows/hardware/gg463119   -  person wkl    schedule 31.10.2011


Ответы (7)


Хороший вопрос! У меня нет большого опыта в этом конкретном вопросе, но я бы начал вот так:

  1. PE или ELF не создают чистый машинный код. Он также содержит некоторую информацию заголовка и т. Д. Подробнее: Запись пользовательских данных в исполняемые файлы в Windows и Linux

  2. Я предполагаю, что вы ищете, как файл ELF / PE хранит машинный код, вы можете получить это из этого вопроса (используя objdump): Как извлечь только содержимое раздела ELF

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

  4. Попробуйте какой-нибудь редактор ресурсов, например ResourceEditor, чтобы понять exe, или просто ildasm.

PS: В основном это решения Unix, но я уверен, что PE должен делать что-то принципиально похожее.

Я думаю, что лучший способ подойти к этому - сначала попытаться проанализировать, как работают существующие PE / ELF, в основном обратное проектирование. И для этого хорошей отправной точкой будет Unix-машина. А потом творите чудеса :)

Не тот же, но похожий вопрос здесь.

Обновление:

Я создал дамп объекта из образца кода c. Итак, я полагаю, это то, на что вы нацеливаетесь, верно? Вам нужно знать, генерируете ли вы этот файл (a.out)?

https://gist.github.com/1329947

Взгляните на это изображение, время жизни кода C.

введите описание изображения здесь

Источник Теперь, чтобы внести ясность, вы ищете реализовать последний шаг, т.е. преобразование объектного кода в исполняемый код?

person zengr    schedule 31.10.2011
comment
Ваши ссылки полезны. Не хватает одной вещи, так это части генерации кода. Что именно вы имеете в виду, говоря, что у них нет чистого машинного кода? - person AppleGrew; 01.11.2011
comment
Еще одно замечание. Я использую 7zip для извлечения различных разделов из exe или dll. Это очень просто. - person AppleGrew; 01.11.2011
comment
1. Когда вы говорите «часть генерации кода», вы имеете в виду, как создать файл ELF? 2. Ну, чистый машинный код - это не читаемый код. Но к файлу ELF прикреплены некоторые метаданные. Я обновлю свой ответ, тогда, возможно, мы сможем прочитать ответ. - person zengr; 01.11.2011
comment
Да, я хочу понять последний шаг. Мне довольно ясно, что означают ELF и PE. Под генерацией кода я подразумеваю только машинный код. Документы по ЧП не проливают на это никакого света. - person AppleGrew; 01.11.2011
comment
Предложил друг - inst.eecs.berkeley.edu/~cs164/fa11 . Выглядит неплохо. - person AppleGrew; 01.11.2011

Как и во многих его статьях, я бы сказал статью Мэтта Питрека о внутренностях PE остается лучшим введением в этот вопрос более чем через десять лет после написания.

person Ofek Shilon    schedule 29.05.2015
comment
Больше недоступно. Эта ссылка на его запись в Википедии все еще работает, но ей уже два десятилетия ... - person Andreas Haferburg; 27.10.2017

Iv'e использовал "Формат файлов Wotsit" в течение многих лет ... вплоть до дней MS-Dos :-) и назад, когда это был просто набор текстовых файлов, которые можно было загрузить из большинства систем BBS под названием "The Энциклопедия игровых программистов "

Сейчас он принадлежит людям, которые запускают Gamedev.Net, и, вероятно, это один из наиболее охраняемых секретов в Интернете.

Вы найдете формат EXE на этой странице: http://www.wotsit.org/list.asp?fc=5

Наслаждаться.

ОБНОВЛЕНИЕ июнь 2020 г. - ссылка выше, похоже, теперь мертва, я нашел страницу «EXE», указанную на этой странице веб-архива сайта wotsit: https://web.archive.org/web/20121019145432/http://www.wotsit.org/list.asp?Al=E

ОБНОВЛЕНИЕ 2 - Я сохраняю редактирование, как было, когда я добавил обновление ошибочно, спасибо тем, кто хотел его отредактировать, но по уважительной причине я его отклоняю:

1) Wotsit.org может в какой-то момент в будущем снова подключиться к Интернету. Если вы действительно попытаетесь посетить URL-адрес, вы обнаружите, что он не исчез, он все еще отвечает, он просто отвечает сообщение об ошибке. Это говорит мне о том, что кто-то поддерживает домен по какой-то причине.

2) Ссылки на архивы кажутся немного нервными, некоторые работают, некоторые нет, иногда кажется, что они работают, затем после обновления они не работают, затем снова работают. Я помню по опыту, когда wotsit все еще был в сети, у них был очень странный код обнаружения загрузки / связывания, и это, вероятно, привело к тому, что archive.org получил очень странные результаты, я действительно помню, что они занимали эту позицию из-за огромного количества Сторонние сайты пытаются нажиться на своем успехе, выдавая себя за аффилированных лиц, а затем напрямую ссылаясь на wotsit с сайта, заполненного рекламой.

До тех пор, пока домен wotsit не будет полностью удален из Интернета и даже DNS не ответит, самое время обернуть все в отдельные архивные ссылки, до тех пор это лучший способ сохранить ссылку.

person shawty    schedule 31.10.2011
comment
Только что попробовал сам, и да ваше право. Впервые вижу проблемы с сайтом. К сожалению, я ничем не могу помочь, я не управляю сайтом, думаю, вам нужно взглянуть и посмотреть, есть ли какая-либо ссылка справки / администратора, чтобы связаться с владельцами сайта. Как я уже сказал, им управляют люди, которые запускают Gamedev.Net, так что, может быть, стоит пойти туда и поспрашивать. - person shawty; 01.11.2011
comment
Вы все еще можете найти его на web.archive.org, но загрузка больше не работает. Поиск в Интернете формата файлов Bernd Luevelsmeyer pe может работать лучше. - person Andreas Haferburg; 27.10.2017
comment
Мне жаль, что он до сих пор не работает :-( На протяжении многих лет я сам вносил некоторые из этих форматных документов в проект. Где-то на чердаке у меня все еще есть целая куча документов, распечатанных на очень старом матричном принтере и хранится в большой папке-переплётчике. - person shawty; 27.10.2017
comment
@ user3789797 не думаете ли вы, что это было бы лучше служить ответом само по себе, а не комментарием к моему ответу, в конце концов, вы отвечаете на вопрос напрямую, а не добавляете что-либо дополнительно к комментариям к моему. - person shawty; 13.06.2021
comment
нет, не бойся. Это примерно то же самое, что и правда, но документы, которые я имел в виду, где исходные документы формата файла wottsists, а не крошечный проект PE, поэтому, как я говорю, вам лучше в качестве отдельного ответа. - person shawty; 14.06.2021

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

Поиск в VX Heavens по запросу "PE" дает целую кучу руководств по изменению файлов PE.

person Martin Beckett    schedule 31.10.2011
comment
Я не могу найти ничего полезного на VX Heavens. Там есть ссылки на, наверное, русские сайты. - person AppleGrew; 01.11.2011
comment
-EDIT- Обнаружил, что мне нужно искать из поля, чтобы попасть по ссылкам. Более прямая ссылка может быть forum.vxheavens.com/viewtopic.php?id=186 < / а> - person AppleGrew; 01.11.2011

Некоторая информация о том, как уменьшить размер PE-файлов: Tiny PE.

Минималистичный способ возиться с генерацией кода, если вы просто хотите попробовать несколько простых вещей, - это вывести файлы MS-DOS .COM, у которых нет заголовка или метаданных. К сожалению, вы будете ограничены 16-битным кодом. Этот формат по-прежнему довольно популярен для демонстраций. .

Что касается формата инструкций, то, насколько я помню, набор инструкций x86 имеет переменную длину, включая 1-байтовые инструкции. RISC-процессоры, вероятно, будут иметь инструкции фиксированной длины.

person Vlad    schedule 31.10.2011
comment
phreedom.org/research/tinype - person user3789797; 15.06.2021

Для Linux можно прочитать и запустить примеры из книги Джонатана Бартлетта «Программирование с нуля»:

http://www.cs.princeton.edu/courses/archive/spr08/cos217/reading/ProgrammingGroundUp-1-0-lettersize.pdf

Тогда, конечно, можно предпочесть взломать программы Windows. Но, возможно, первое дает лучший способ понять, что происходит на самом деле.

person John Donn    schedule 31.10.2011
comment
Я не вижу ничего, связанного с моим вопросом. - person AppleGrew; 01.11.2011
comment
из вашего вопроса: Все тексты о том, как создать компилятор, останавливаются после объяснения лексеров и синтаксических анализаторов. Они не объясняют, как создать машинный код. Я хочу понять непрерывный процесс. В цитируемой книге (см. Главу 3, посвященную программе, подобной Hello World) объясняется, как писать программы на ассемблере, компилировать их в машинный язык, а затем связывать их, создавая исполняемый файл. - person John Donn; 02.11.2011

Формат исполняемого файла зависит от ОС. Для Windows это PE32 (32 бит) или PE32 + (64 бит).

То, как будет выглядеть окончательный исполняемый файл, зависит от ABI (двоичного интерфейса приложения) ОС. ABI сообщает, как загрузчик ОС должен загружать исполняемый файл и как он должен перемещать его, будь то DLL или простой исполняемый файл и т. Д.

Каждый объектный файл (исполняемый файл, DLL или драйвер) содержит часть, называемую разделами. Здесь находится весь наш код, данные, таблицы переходов и т. Д.

Теперь, чтобы создать объектный файл, что и делает компилятор, вы должны не просто создать исполняемый машинный код, но также заголовки, таблицу символов, записи перемещения, таблицы импорта / экспорта и т. Д.

Часть генерации чистого машинного кода полностью зависит от того, насколько оптимизирован ваш код. Но для фактического запуска кода на ПК вам необходимо создать файл со всеми заголовками и соответствующими данными (проверьте MSDN для точного формата PE32 +), а затем поместить весь исполняемый машинный код (который сгенерировал ваш компилятор) в один разделов (обычно код находится в разделе с именем .text). Если вы создали файл, соответствующий формату PE32 +, значит, вы успешно создали исполняемый файл в Windows.

person Rohit Jacob    schedule 20.12.2020