0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Понимание, как применяются и выглядят в машинном коде массивы, позволит вам продвинуться в изучении такого направления, как реверс-инжиниринг. В этой статье мы будем использовать для дизассемблирования 64-битную версию IDA Pro и язык программирования "Си", что следует учитывать, если вы захотите выполнить все действия самостоятельно. Итак, вперёд!</p>
1
<p>Понимание, как применяются и выглядят в машинном коде массивы, позволит вам продвинуться в изучении такого направления, как реверс-инжиниринг. В этой статье мы будем использовать для дизассемблирования 64-битную версию IDA Pro и язык программирования "Си", что следует учитывать, если вы захотите выполнить все действия самостоятельно. Итак, вперёд!</p>
2
<p>В первую очередь, рассмотрим код массивов:</p>
2
<p>В первую очередь, рассмотрим код массивов:</p>
3
void BasicArrays() { // объявляем массив с константным размером int litArray[10]; // объявляем массив с динамическим размером (массив переменного размера) int ArraySize = 10; int varArray[ArraySize]; // объявляем массив с предопределёнными значениями int objArray[10] = {0,1,2,3,4,5,6,7,8,9}; // записываем элемент массива по индексу litArray[0] = 1337; // выполняем чтение элемента из массива int leet = litArray[0]; // создаём матрицу с константным размером int litMatrix[13][37]; // создаём матрицу переменного размера int rows = 13; int cols = 37; int varMatrix[rows][cols]; // вводим значения в матрицу varMatrix[4][20] = 1337; // получаем значения элемента матрицы int MatrixLeet = varMatrix[4][20]; }<p>Итак, перед нами всего 12 строк кода, но на<strong>практике они превращаются в весьма внушительный блок машинного кода</strong>. Что же, будем рассматривать машинный код более тщательно:</p>
3
void BasicArrays() { // объявляем массив с константным размером int litArray[10]; // объявляем массив с динамическим размером (массив переменного размера) int ArraySize = 10; int varArray[ArraySize]; // объявляем массив с предопределёнными значениями int objArray[10] = {0,1,2,3,4,5,6,7,8,9}; // записываем элемент массива по индексу litArray[0] = 1337; // выполняем чтение элемента из массива int leet = litArray[0]; // создаём матрицу с константным размером int litMatrix[13][37]; // создаём матрицу переменного размера int rows = 13; int cols = 37; int varMatrix[rows][cols]; // вводим значения в матрицу varMatrix[4][20] = 1337; // получаем значения элемента матрицы int MatrixLeet = varMatrix[4][20]; }<p>Итак, перед нами всего 12 строк кода, но на<strong>практике они превращаются в весьма внушительный блок машинного кода</strong>. Что же, будем рассматривать машинный код более тщательно:</p>
4
// объявляем массив с константным размером int litArray[10];<p>Дизассемблированный вид объявления массива с литералом:</p>
4
// объявляем массив с константным размером int litArray[10];<p>Дизассемблированный вид объявления массива с литералом:</p>
5
<p>В процессе инициализации массива с константным размером компилятор инициализирует длину нашего массива через локальную переменную. При этом в процессе компиляции выделяется место лишь под одно значение массива litArray[0].</p>
5
<p>В процессе инициализации массива с константным размером компилятор инициализирует длину нашего массива через локальную переменную. При этом в процессе компиляции выделяется место лишь под одно значение массива litArray[0].</p>
6
<p>Именно оно и станет использоваться (вы можете увидеть это на нижеследующем скриншоте). Данный приём даёт возможность компилятору существенно повысить производительность приложений.</p>
6
<p>Именно оно и станет использоваться (вы можете увидеть это на нижеследующем скриншоте). Данный приём даёт возможность компилятору существенно повысить производительность приложений.</p>
7
// объявляем массив с динамическим размером (массив переменного размера) int ArraySize = 10; int varArray[ArraySize];<p>Машинный код:</p>
7
// объявляем массив с динамическим размером (массив переменного размера) int ArraySize = 10; int varArray[ArraySize];<p>Машинный код:</p>
8
<p>Для начала длина массива сохраняется в локальную переменную<strong>ArraySize</strong>, потом вычисляется минимальное и максимальное индексное значение и длина всего массива, потом под неё выделяется память.</p>
8
<p>Для начала длина массива сохраняется в локальную переменную<strong>ArraySize</strong>, потом вычисляется минимальное и максимальное индексное значение и длина всего массива, потом под неё выделяется память.</p>
9
// объявляем массив с предопределёнными значениями int objArray[10] = {0,1,2,3,4,5,6,7,8,9};<p>Машинный код:</p>
9
// объявляем массив с предопределёнными значениями int objArray[10] = {0,1,2,3,4,5,6,7,8,9};<p>Машинный код:</p>
10
<p>Во время объявления массива с предопределёнными значениями компилятор выполняет сохранение каждого значения в свою переменную, представленную индексом массива (к примеру objArray4 = objArray[4]).</p>
10
<p>Во время объявления массива с предопределёнными значениями компилятор выполняет сохранение каждого значения в свою переменную, представленную индексом массива (к примеру objArray4 = objArray[4]).</p>
11
// записываем элемент массива по индексу litArray[0] = 1337;<p>Машинный код:</p>
11
// записываем элемент массива по индексу litArray[0] = 1337;<p>Машинный код:</p>
12
<p>Точно так же, как и в случае с предопределёнными значениями, компилятор создаст новую переменную для указанного индексного значения при инициализации элемента массива посредством индекса.</p>
12
<p>Точно так же, как и в случае с предопределёнными значениями, компилятор создаст новую переменную для указанного индексного значения при инициализации элемента массива посредством индекса.</p>
13
// читаем элемента из массива int leet = litArray[0];<p>Машинный код:</p>
13
// читаем элемента из массива int leet = litArray[0];<p>Машинный код:</p>
14
<p>Во время извлечения элемента массива значение элемента будет взято по указанному индексу и записано в необходимую переменную.</p>
14
<p>Во время извлечения элемента массива значение элемента будет взято по указанному индексу и записано в необходимую переменную.</p>
15
// создаём матрицу динамического размера int rows = 13; int cols = 37; int varMatrix[rows][cols];<p>Машинный код:</p>
15
// создаём матрицу динамического размера int rows = 13; int cols = 37; int varMatrix[rows][cols];<p>Машинный код:</p>
16
<p>В процессе создания матрицы поначалу её размер устанавливается согласно значениям row и col. Далее рассчитываются минимальный и максимальный индексы для столбцов и строк, используемых при расчёте базового местоположения и общего размера матрицы в памяти.</p>
16
<p>В процессе создания матрицы поначалу её размер устанавливается согласно значениям row и col. Далее рассчитываются минимальный и максимальный индексы для столбцов и строк, используемых при расчёте базового местоположения и общего размера матрицы в памяти.</p>
17
// вводим значения в матрицу varMatrix[4][20] = 1337;<p>Машинный код:</p>
17
// вводим значения в матрицу varMatrix[4][20] = 1337;<p>Машинный код:</p>
18
<p>В процессе ввода в матрицу поначалу определяем местоположение нужного элемента массива с применением базового местоположения матрицы. Далее содержимое указанного элемента массива устанавливаем на желаемое входное значение (т. е. 1337).</p>
18
<p>В процессе ввода в матрицу поначалу определяем местоположение нужного элемента массива с применением базового местоположения матрицы. Далее содержимое указанного элемента массива устанавливаем на желаемое входное значение (т. е. 1337).</p>
19
// получаем значение элемента матрицы int MatrixLeet = varMatrix[4][20];<p>Машинный код:</p>
19
// получаем значение элемента матрицы int MatrixLeet = varMatrix[4][20];<p>Машинный код:</p>
20
<p>В процессе извлечении значения из матрицы производятся те же вычисления, что и при внесении в неё значения. Но при этом ничего не записывается, т. к. содержимое извлекается и записывается в необходимую переменную (к примеру, MatrixLeet).</p>
20
<p>В процессе извлечении значения из матрицы производятся те же вычисления, что и при внесении в неё значения. Но при этом ничего не записывается, т. к. содержимое извлекается и записывается в необходимую переменную (к примеру, MatrixLeet).</p>
21
<p>Теперь, когда у нас есть понимание, как массивы применяются и выглядят в машинном коде, можно переходить к указателям. Но об этом поговорим в следующий раз.</p>
21
<p>Теперь, когда у нас есть понимание, как массивы применяются и выглядят в машинном коде, можно переходить к указателям. Но об этом поговорим в следующий раз.</p>
22
<p><a>Источник</a></p>
22
<p><a>Источник</a></p>
23
23