HTML Diff
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