0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: вывод, машинный код, вызов функций, реверс-инижниринг, построение программного кода, ввод</p>
1
<p>Теги: вывод, машинный код, вызов функций, реверс-инижниринг, построение программного кода, ввод</p>
2
<p>При использовании функции вывода переменные помещаются в стек, а потом применяются в качестве параметров. Понимание, как это выглядит на низком уровне, расширит ваши знания о работе программного обеспечения и, соответственно, позволит более эффективно заниматься его исследованием.</p>
2
<p>При использовании функции вывода переменные помещаются в стек, а потом применяются в качестве параметров. Понимание, как это выглядит на низком уровне, расширит ваши знания о работе программного обеспечения и, соответственно, позволит более эффективно заниматься его исследованием.</p>
3
<h2>Стандартная функция вывода</h2>
3
<h2>Стандартная функция вывода</h2>
4
<p>Для вывода данных задействуем функцию printf(). Стандартный вывод в нашем случае будет следующим:</p>
4
<p>Для вывода данных задействуем функцию printf(). Стандартный вывод в нашем случае будет следующим:</p>
5
<p>Теперь смотрим на машинный код. Вот, как выглядит вывод строкового литерала:</p>
5
<p>Теперь смотрим на машинный код. Вот, как выглядит вывод строкового литерала:</p>
6
<p>Как вы можете видеть, строковый литерал, в первую очередь, помещается в стек для вызова в качестве параметра printf(). Теперь давайте глянем на вывод одной из переменных:</p>
6
<p>Как вы можете видеть, строковый литерал, в первую очередь, помещается в стек для вызова в качестве параметра printf(). Теперь давайте глянем на вывод одной из переменных:</p>
7
<p>Тут можно отметить, что сначала переменная intvar пермещается в регистр EAX, который записывается в стек совместно со строковым литералом %i, применяемым для обозначения целочисленного вывода. Далее эти переменные берутся из стека и задействуются в качестве параметров при вызове printf().</p>
7
<p>Тут можно отметить, что сначала переменная intvar пермещается в регистр EAX, который записывается в стек совместно со строковым литералом %i, применяемым для обозначения целочисленного вывода. Далее эти переменные берутся из стека и задействуются в качестве параметров при вызове printf().</p>
8
<h2>Пользовательский ввод</h2>
8
<h2>Пользовательский ввод</h2>
9
<p>Теперь рассмотрим ввод пользователя посредством потока сin из C++. Но сначала глянем на наш код:</p>
9
<p>Теперь рассмотрим ввод пользователя посредством потока сin из C++. Но сначала глянем на наш код:</p>
10
<p>В данной функции мы лишь записываем строку в переменную sentence посредством функции C++ cin, а потом выводим предложение, используя оператор printf().</p>
10
<p>В данной функции мы лишь записываем строку в переменную sentence посредством функции C++ cin, а потом выводим предложение, используя оператор printf().</p>
11
<p>Как это выглядит в машинном коде? Смотрим функцию cin:</p>
11
<p>Как это выглядит в машинном коде? Смотрим функцию cin:</p>
12
<p>Обратите внимание, что сначала инициализируется строковая переменная sentence, потом осуществляется вызов cin с последующей записью введенных данных в sentence.</p>
12
<p>Обратите внимание, что сначала инициализируется строковая переменная sentence, потом осуществляется вызов cin с последующей записью введенных данных в sentence.</p>
13
<p>Итак, программа устанавливает содержимое переменной sentence в EAX, потом помещает EAX в стек, откуда значение нашей переменной станет применяться в качестве параметра для потока cin. Далее происходит вызов оператора потока >>. Его вывод помещается в ECX, который потом перемещается в стек для оператора printf():</p>
13
<p>Итак, программа устанавливает содержимое переменной sentence в EAX, потом помещает EAX в стек, откуда значение нашей переменной станет применяться в качестве параметра для потока cin. Далее происходит вызов оператора потока >>. Его вывод помещается в ECX, который потом перемещается в стек для оператора printf():</p>
14
<p>Итак, мы вкратце рассмотрели стандартный вывод функции и пользовательский ввод на низком уровне. Соответствующие знания являются базовыми и могут пригодиться тем, кто только начинает осваивать профессию реверс-инженера.</p>
14
<p>Итак, мы вкратце рассмотрели стандартный вывод функции и пользовательский ввод на низком уровне. Соответствующие знания являются базовыми и могут пригодиться тем, кто только начинает осваивать профессию реверс-инженера.</p>
15
<p><em>По материалам "<a>BOLO: Reverse Engineering - Part 1 (Basic Programming Concepts)</a>"</em>.</p>
15
<p><em>По материалам "<a>BOLO: Reverse Engineering - Part 1 (Basic Programming Concepts)</a>"</em>.</p>
16
16