Как читать/писать машинный код .exe вручную?

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

Формат Win32 exe на MSDN

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

Ответ 9

Просто по этому вопросу кто-то еще читает такие вещи, как CD 21?

Я помнил Сандру Баллок в одном шоу, на самом деле читая экран шестнадцатеричных чисел и выясняя, что делает программа. Похоже на текущую версию кода Matrix.

Если вы читаете такие вещи, как CD 21, как вы помните разные различные комбинации?

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

Каждая инструкция в машинном коде хранится в специальной области памяти внутри процессора. Ранние книги INTEL дали машинный код для своих инструкций, поэтому нужно попытаться получить такие книги, чтобы понять это. Очевидно, что сегодня машинный код не легко доступен. Что было бы хорошо, так это программа, которая может преобразовать шестнадцатеричный код в машинный. Или сделайте это вручную _ !! утомительный