0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>В этой статье мы рассмотрим следующие виды<strong>динамического распределения памяти</strong>: 1. malloc. 2. calloc. 3. realloc.</p>
1
<p>В этой статье мы рассмотрим следующие виды<strong>динамического распределения памяти</strong>: 1. malloc. 2. calloc. 3. realloc.</p>
2
<p>Понимая эти аспекты, вы сможете быстрее продвинуться в сфере изучении реверс-инжиниринга.</p>
2
<p>Понимая эти аспекты, вы сможете быстрее продвинуться в сфере изучении реверс-инжиниринга.</p>
3
<h2>Динамическое выделение памяти malloc</h2>
3
<h2>Динамическое выделение памяти malloc</h2>
4
<p>В первую очередь посмотрим наш код на языке программирования C:</p>
4
<p>В первую очередь посмотрим наш код на языке программирования C:</p>
5
int malloc_ex() { char *mem_alloc; // выделяем память под 11 символов mem_alloc = malloc(11 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "Hello World"); printf("malloc-mem_alloc: %s\n", mem_alloc); // освобождаем выделенную память free(mem_alloc); return 0; }<p>Итак, в данной функции было выделено место под 11 символов посредством malloc(), а потом в выделенное пространство памяти была скопирована строка "Hello World".</p>
5
int malloc_ex() { char *mem_alloc; // выделяем память под 11 символов mem_alloc = malloc(11 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "Hello World"); printf("malloc-mem_alloc: %s\n", mem_alloc); // освобождаем выделенную память free(mem_alloc); return 0; }<p>Итак, в данной функции было выделено место под 11 символов посредством malloc(), а потом в выделенное пространство памяти была скопирована строка "Hello World".</p>
6
<p>Теперь посмотрим, как это выглядит в машинном коде. Но прежде обратите внимание на инструкции "nop". Они были размещены специально при подготовке статьи, чтобы разные части кода были более просты для понимания.</p>
6
<p>Теперь посмотрим, как это выглядит в машинном коде. Но прежде обратите внимание на инструкции "nop". Они были размещены специально при подготовке статьи, чтобы разные части кода были более просты для понимания.</p>
7
<p><em>Машинный код динамического распределения памяти посредством malloc:</em></p>
7
<p><em>Машинный код динамического распределения памяти посредством malloc:</em></p>
8
<p>В процессе применения malloc() размер выделенной памяти поначалу помещается в регистр edi. Потом системная функция _malloc вызывается в целях выделения памяти, а затем выделенное пространство памяти сохраняется в переменной ptr. Далее "Hello World" разбивается на "Hello Wo" и "rld", т. к. строка копируется в выделенную область памяти. И, в конце концов, осуществляется вывод на экран снова скопированной строки "Hello World" с последующим освобождением памяти посредством функции _free.</p>
8
<p>В процессе применения malloc() размер выделенной памяти поначалу помещается в регистр edi. Потом системная функция _malloc вызывается в целях выделения памяти, а затем выделенное пространство памяти сохраняется в переменной ptr. Далее "Hello World" разбивается на "Hello Wo" и "rld", т. к. строка копируется в выделенную область памяти. И, в конце концов, осуществляется вывод на экран снова скопированной строки "Hello World" с последующим освобождением памяти посредством функции _free.</p>
9
<h2>Динамическое чистое выделение памяти calloc</h2>
9
<h2>Динамическое чистое выделение памяти calloc</h2>
10
<p>Как и прежде, сначала смотрим на наш код:</p>
10
<p>Как и прежде, сначала смотрим на наш код:</p>
11
int calloc_ex() { char *mem_alloc; // выделяем память под 11 символов mem_alloc = calloc(11 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "Hello World"); printf("calloc-mem_alloc: %s\n", mem_alloc); // освобождаем выделенную память free(mem_alloc); return 0; }<p>Как и в случае с методом malloc(), место для одиннадцати символов выделяется, а в указанное пространство копируется строка "Hello World". Потом вновь перемещённый "Hello World" распечатывается с последующим освобождением выделенного пространства памяти.</p>
11
int calloc_ex() { char *mem_alloc; // выделяем память под 11 символов mem_alloc = calloc(11 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "Hello World"); printf("calloc-mem_alloc: %s\n", mem_alloc); // освобождаем выделенную память free(mem_alloc); return 0; }<p>Как и в случае с методом malloc(), место для одиннадцати символов выделяется, а в указанное пространство копируется строка "Hello World". Потом вновь перемещённый "Hello World" распечатывается с последующим освобождением выделенного пространства памяти.</p>
12
<p><em>Машинный код динамического распределения памяти посредством calloc:</em></p>
12
<p><em>Машинный код динамического распределения памяти посредством calloc:</em></p>
13
<p>Динамическое распределение памяти с помощью calloc() по сути, выглядит в машинном коде почти так же, как и в случае с malloc(). Пространство для одиннадцати символов выделяется посредством системной функции _calloc. Потом строка "Hello World" разбивается на "Hello Wo" и "rld", так как она копируется во вновь выделенное пространство памяти. Далее происходит вывод на экран вновь перемещённой строки “Hello World" с последующим освобождением выделенной области памяти посредством функции _free.</p>
13
<p>Динамическое распределение памяти с помощью calloc() по сути, выглядит в машинном коде почти так же, как и в случае с malloc(). Пространство для одиннадцати символов выделяется посредством системной функции _calloc. Потом строка "Hello World" разбивается на "Hello Wo" и "rld", так как она копируется во вновь выделенное пространство памяти. Далее происходит вывод на экран вновь перемещённой строки “Hello World" с последующим освобождением выделенной области памяти посредством функции _free.</p>
14
<h2>Динамическое перераспределение памяти realloc</h2>
14
<h2>Динамическое перераспределение памяти realloc</h2>
15
<p>Смотрим код.</p>
15
<p>Смотрим код.</p>
16
int realloc_free() { char *mem_alloc; // выделяем память под 11 символов mem_alloc = malloc(11 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "Hello World"); printf("malloc-mem_alloc: %s\n", mem_alloc); // выделяем память под 11 символов mem_alloc = realloc(mem_alloc, 21 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "1337 h4x0r @nonymoose"); printf("realloc-free-mem_alloc realloc: %s\n", mem_alloc); // освобождаем выделенную память free(mem_alloc); return 0; }<p>В данной функции память для одиннадцати символов мы выделяем посредством malloc(). Потом в только что выделенную область памяти копируется "Hello World", что происходит прежде, чем указанное расположение памяти перераспределится для соответствия 21 символу.</p>
16
int realloc_free() { char *mem_alloc; // выделяем память под 11 символов mem_alloc = malloc(11 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "Hello World"); printf("malloc-mem_alloc: %s\n", mem_alloc); // выделяем память под 11 символов mem_alloc = realloc(mem_alloc, 21 * sizeof(char)); // записываем в память строку "Hello World" strcpy(mem_alloc, "1337 h4x0r @nonymoose"); printf("realloc-free-mem_alloc realloc: %s\n", mem_alloc); // освобождаем выделенную память free(mem_alloc); return 0; }<p>В данной функции память для одиннадцати символов мы выделяем посредством malloc(). Потом в только что выделенную область памяти копируется "Hello World", что происходит прежде, чем указанное расположение памяти перераспределится для соответствия 21 символу.</p>
17
<p>В результате, "1337 h4x0r @nonymoose" копируется в только что перераспределённую область. В конечном итоге, происходит вывод на экран, и память освобождается.</p>
17
<p>В результате, "1337 h4x0r @nonymoose" копируется в только что перераспределённую область. В конечном итоге, происходит вывод на экран, и память освобождается.</p>
18
<p><em>Машинный код динамического распределения памяти посредством realloc:</em></p>
18
<p><em>Машинный код динамического распределения памяти посредством realloc:</em></p>
19
<p>В первую очередь, происходит выделение памяти посредством malloc(). Потом, когда выведется на экран только что перемещённая строка "Hello World", будет вызван realloc() для переменной ptr (она представляет в коде переменную mem_alloc ), а также передан новый размер 0x15 (21). Далее "1337 h4x0r @nonymoose" разобьётся на "1337 h4x", "0r @nony", "moos" и "e", так как он копируется в только что перераспределённую область памяти. В конце концов, пространство будет освобождено посредством функции _free.</p>
19
<p>В первую очередь, происходит выделение памяти посредством malloc(). Потом, когда выведется на экран только что перемещённая строка "Hello World", будет вызван realloc() для переменной ptr (она представляет в коде переменную mem_alloc ), а также передан новый размер 0x15 (21). Далее "1337 h4x0r @nonymoose" разобьётся на "1337 h4x", "0r @nony", "moos" и "e", так как он копируется в только что перераспределённую область памяти. В конце концов, пространство будет освобождено посредством функции _free.</p>
20
<p><em><a>Источник</a></em></p>
20
<p><em><a>Источник</a></em></p>
21
21