Как читать / писать машинный код .exe вручную? - PullRequest
12 голосов
/ 16 апреля 2009

Я не очень хорошо знаком с компилятором магии. Для меня превращение читаемого человеком кода (или не действительно читаемых инструкций по сборке) в машинный код - для меня ракетостроение в сочетании с колдовством.

Я ограничусь темой этого вопроса до исполняемых файлов Win32 (.exe). Когда я открываю эти файлы в специализированном средстве просмотра, я могу найти строки (обычно 16 байт на символ), разбросанные по разным местам, но остальное - просто мусор. Я полагаю, что нечитаемая часть (большинство) - это машинный код (или, возможно, ресурсы, такие как изображения и т. Д.).

Есть ли простой способ считывания машинного кода? Открывая исполняемый файл как поток файлов и читая его побайтно, как можно превратить эти отдельные байты в сборку? Есть ли прямое отображение между этими байтами инструкции и инструкцией по сборке?

Как пишется .exe? Четыре байта на инструкцию? Больше? Меньше? Я заметил, что некоторые приложения могут создавать исполняемые файлы просто так: например, в ACD See вы можете экспортировать серию изображений в слайд-шоу. Но это не обязательно должен быть слайд-шоу SWF, ACD See также способен создавать EXEcutable презентации. Как это сделать?

Как понять, что происходит внутри EXE-файла?

Ответы [ 13 ]

15 голосов
/ 16 апреля 2009

OllyDbg - это потрясающий инструмент, который разбирает EXE-файл на читаемые инструкции и позволяет выполнять инструкции по одному. Он также сообщает, какие функции API использует программа и, если возможно, аргументы, которые она предоставляет (при условии, что аргументы находятся в стеке).

Вообще говоря, инструкции процессора имеют переменную длину, некоторые - один байт, другие - два, некоторые - три, некоторые - четыре и т. Д. Это в основном зависит от типа данных, которые ожидает инструкция. Некоторые инструкции являются обобщенными, например, «mov», который сообщает CPU о перемещении данных из регистра CPU в место в памяти или наоборот. В действительности существует много разных команд mov, для обработки 8-битных, 16-битных, 32-битных данных, для перемещения данных из разных регистров и т. Д.

Вы можете взять учебное пособие по языку ассемблера для компьютера доктора Пола Картера , которое представляет собой бесплатную книгу начального уровня, в которой рассказывается о сборке и работе процессора Intel 386. Большинство из них применимо даже к современным потребительским процессорам Intel.

Формат EXE является специфическим для Windows. Точка входа (то есть первая исполняемая инструкция) обычно находится в том же месте в файле EXE. Все это сложно объяснить сразу, но предоставленные мною ресурсы должны помочь вылечить хотя бы часть вашего любопытства! :)

6 голосов
/ 16 апреля 2009

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

5 голосов
/ 16 апреля 2009

Содержимое файла EXE описано в Portable Executable . Он содержит код, данные и инструкции для ОС по загрузке файла.

Существует соотношение 1: 1 между машинным кодом и сборкой. Программа дизассемблера выполнит обратную операцию.

На i386 нет фиксированного количества байтов на инструкцию. Некоторые из них являются однобайтовыми, некоторые намного длиннее.

5 голосов
/ 16 апреля 2009

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

Формат раздела зависит от того, что в нем. Раздел кода содержит машинный код в соответствии с исполняемой целевой архитектурой. В наиболее распространенных случаях это Intel x86 или AMD-64 (так же, как EM64T) для двоичных файлов Microsoft PE. Формат машинного кода - CISC и восходит к 8086 и более ранним. Важным аспектом CISC является то, что размер инструкций не является постоянным, вы должны начать читать в нужном месте, чтобы извлечь из него что-то ценное. Intel публикует хорошие руководства по набору команд x86 / x64.

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

И, кроме того, есть MSIL EXE: исполняемые файлы .NET с промежуточным языком Microsoft, они содержат не машинный код, а код .NET CIL. Спецификации для этого доступны онлайн в ECMA.

Их можно просматривать с помощью такого инструмента, как Reflector.

4 голосов
/ 16 апреля 2009

Вы можете использовать отладку из командной строки, но это сложно.

C:\WINDOWS>debug taskman.exe
-u
0D69:0000 0E            PUSH    CS
0D69:0001 1F            POP     DS
0D69:0002 BA0E00        MOV     DX,000E
0D69:0005 B409          MOV     AH,09
0D69:0007 CD21          INT     21
0D69:0009 B8014C        MOV     AX,4C01
0D69:000C CD21          INT     21
0D69:000E 54            PUSH    SP
0D69:000F 68            DB      68
0D69:0010 69            DB      69
0D69:0011 7320          JNB     0033
0D69:0013 7072          JO      0087
0D69:0015 6F            DB      6F
0D69:0016 67            DB      67
0D69:0017 7261          JB      007A
0D69:0019 6D            DB      6D
0D69:001A 206361        AND     [BP+DI+61],AH
0D69:001D 6E            DB      6E
0D69:001E 6E            DB      6E
0D69:001F 6F            DB      6F
2 голосов
/ 08 мая 2009

Чтобы получить представление, установите точку останова для некоторого интересного кода, а затем перейдите в окно ЦП.

Если вас интересует больше, проще скомпилировать короткие фрагменты с помощью Free Pascal, используя параметр -al.

FPC позволяет выводить сгенерированный ассемблер во множестве форматов ассемблера (TASM, MASM, GAS), используя параметр -A, и вы можете иметь исходный код паскаля, чередующийся в комментариях (и более), для простой перекрестной ссылки. *

Поскольку это ассемблер, сгенерированный компилятором, в отличие от ассемблера из дизассемблированного .exe, он более символичен и более прост для понимания.

2 голосов
/ 16 апреля 2009

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

Пара книг, которые помогут вам понять: -

1 голос
/ 25 сентября 2009

Знакомство с сборкой низкого уровня (и я имею в виду сборку низкого уровня, а не «макросы» и тому подобное), вероятно, является обязательным. Если вы действительно хотите читать непосредственно необработанный машинный код, обычно вы используете для этого шестнадцатеричный редактор. Однако, чтобы понять, что делают инструкции, большинство людей использует дизассемблер, чтобы преобразовать его в соответствующие инструкции по сборке. Если вы один из тех, кто хочет понять сам язык машин, я думаю, вам нужны Руководства разработчика программного обеспечения для архитектуры Intel® 64 и IA-32 *1002*. Том 2 специально охватывает набор инструкций, который относится к вашему запросу о том, как читать сам машинный код и как сборка относится к нему.

1 голос
/ 17 апреля 2009

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

.

(я понятия не имею, что такое ACD See, поэтому примите это с большой долей соли, но я делаю знаю, что некоторые программы создаются таким образом.)

1 голос
/ 16 апреля 2009

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

...