HTML Diff
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. Далее происходит вызов оператора потока &gt;&gt;. Его вывод помещается в ECX, который потом перемещается в стек для оператора printf():</p>
13 <p>Итак, программа устанавливает содержимое переменной sentence в EAX, потом помещает EAX в стек, откуда значение нашей переменной станет применяться в качестве параметра для потока cin. Далее происходит вызов оператора потока &gt;&gt;. Его вывод помещается в 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