Реверс-инженеру на заметку: динамическое распределение памяти
В этой статье мы рассмотрим следующие виды динамического распределения памяти:
1. malloc.
2. calloc.
3. realloc.
Понимая эти аспекты, вы сможете быстрее продвинуться в сфере изучении реверс-инжиниринга.
Динамическое выделение памяти malloc
В первую очередь посмотрим наш код на языке программирования C:
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; }
Итак, в данной функции было выделено место под 11 символов посредством
Теперь посмотрим, как это выглядит в машинном коде. Но прежде обратите внимание на инструкции «nop». Они были размещены специально при подготовке статьи, чтобы разные части кода были более просты для понимания.
Машинный код динамического распределения памяти посредством malloc:
В процессе применения
Динамическое чистое выделение памяти calloc
Как и прежде, сначала смотрим на наш код:
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; }
Как и в случае с методом
Машинный код динамического распределения памяти посредством calloc:
Динамическое распределение памяти с помощью
Динамическое перераспределение памяти realloc
Смотрим код.
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; }
В данной функции память для одиннадцати символов мы выделяем посредством
В результате, «1337 h4x0r @nonymoose» копируется в только что перераспределённую область. В конечном итоге, происходит вывод на экран, и память освобождается.
Машинный код динамического распределения памяти посредством realloc:
В первую очередь, происходит выделение памяти посредством