Как именно работают исполняемые файлы? - PullRequest
12 голосов
/ 24 октября 2009

Я знаю, что исполняемые файлы содержат инструкции, но что это за инструкции? Если я хочу вызвать функцию API MessageBox, например, как выглядит инструкция?

Спасибо.

Ответы [ 4 ]

11 голосов
/ 24 октября 2009

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

Функциональный вызов MessageBox () - это последовательность инструкций, которая будет

1) иметь адрес функции, которая находится в DLL. Этот адрес вводится компилятором

2) инструкции по «переносу» параметров в стек

3) Фактический вызов функции

4) какая-то очистка (зависит от соглашения о вызовах).

Важно помнить, что EXE-файлы - это просто специально отформатированные файлы. У меня нет для вас разборки, но вы можете попробовать скомпилировать код, а затем открыть свой EXE в visual studio, чтобы увидеть разборку.

4 голосов
/ 24 октября 2009

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

mov ax, 2h

Имеет представление байтового кода:

B8 02 00

Байт-коды загружаются в ОЗУ и исполняются процессором, поскольку это его «язык». Ни один здравомыслящий, что я знаю программы в байт-коде, это было бы просто сложно. Сборка достаточно забавная, как она есть. Всякий раз, когда вы компилируете программу на языке более высокого уровня, она должна взять ваш код и превратить его в инструкции по сборке, вы просто представляете, как искаженный ваш код будет выглядеть после его компиляции. Не поймите меня неправильно, компиляторы великолепны, но разберите C ++ программу с помощью бесплатной IDA Pro, и вы поймете, о чем я говорю. То есть исполняемые файлы в двух словах, безусловно, есть книги, написанные на эту тему. Я не эксперт по Windows API, но кто-то еще может показать вам, как будет выглядеть инструкция для вызова Windows API «MessageBox». Должно быть только несколько строк сборки.

2 голосов
/ 24 октября 2009

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

Я не могу сказать конкретно о функции MessageBox, но предположил бы, что это LOT инструкций. Подумайте об этом: он должен нарисовать рамку и стилизовать ее так, как это делает ваш компьютер, и подключить даже обработчик, чтобы что-то происходило, когда пользователь нажимает кнопку, говорит Windows (или любой другой операционной системе) добавить ее в панель задач (или док, и т. д.) и многое другое.

0 голосов
/ 24 октября 2009

Это зависит от языка, на котором вы работаете. Но для многих это так же просто, как ...

msgbox("Your message goes here")

или

alert("Your message goes here")
...