Reverse Engineering на языке C для самых маленьких

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Автор статьи - onioncoder
Создано специально для - xss.is

Доброго вечера форумчане, сегодня хочу рассмотреть Reverse Engineering на языке C.

С чего начинают изучение языков программирования? Правильно, с вывода "Hello, world!"
Напишем этот простенький код и разберем каждую строчку.

hello_world.c
C: Скопировать в буфер обмена
Код:
#include <stdio.h>

int main(int argc, char** argv) {
    puts("Hello, world!")
    return 0;
}

1) #include <stdio.h> — это важная строка в коде на языке C. Она позволяет нам использовать функции ввода или вывода. Без этой строки компилятор не сможет распознать функции и код не сможет нормально компилироваться.

2) int main(int argc, char** argv) { — эта строка объявляет функцию main, которая является "пропуском" в программу. int говорит нам, что функция возвращает целое число. Это значение обычно используется как код возврата программы (0 — успешное завершение, любое другое значение — ошибка. Дальше мы разберем это).
main: Имя функции, с которой начинается выполнение программы. Имя функции можете задавать любое которое будет удобнее вам.
int argc: argc (argument count) — это целочисленный параметр, который содержит количество аргументов командной строки, переданных программе, включая имя самой программы.
char** argv: argv (argument vector) — это массив строк (массив указателей на символы), который содержит сами аргументы командной строки.
{ — фигурная скобка обозначающая начало функции main.

3) puts("Hello, world!"); — эта строка вызывает функцию puts, которая выводит строку наш текст. "Hello, world!": Это наш текст, который будет выведен на экран.

4) return 0; — это оператор возврата, который сообщает об успехе (во втором пункте разобрали) и завершает выполнение функции main.

5) } — фигурная скобка обозначающая где заканчивается наша функция main.

Поздравляю, вы написали первый код на языке программирования C.
Давайте немного затронем компиляцию нашего кода. Компиляция выглядит так:
hello_world.c >> hello_world.o >> hello_world.elf
Скорее всего задались вопросом, а как скомпилировать? А вот так: $ gcc hello_world.c -o hello_world.elf
Что бы запустить скомпилированный код: $ ./hello_world.elf

Разбираем синтаксис
Числовые типы:
- char (1 bite -> -128 to 127)
- short (2 bites -> -32'768 to 32'767)
- int (4 bytes -> -2'147'483'648 to 2'147'483'647)
- long (8 bytes -> -2^63 to 2^63-1)
- float (4 bytes -> 6-7 знаков после запятой)
- double (8 bytes -> 15-16 знаков после запятой)

Строки:
Строка представляет из себя массив типа char, где последний элемент равен 0:
1734283521960.png



Как выводить значения переменных?
При помощи функции printf (для строчек можно использовать puts).
Пример: printf("%d", number);
%d - integer
%f - float
%lf - double
%x - integer in hexadecimal represintation
%s - string
%c - ASCII-char

А что такое const типы?
Приписка const у объявления типа означает, что его нельзя изменять после объявления. При попытке изменения вылетит segmentation fault (однако есть нюансы)
const_types.c

C: Скопировать в буфер обмена
Код:
#include <stdio.h>

const int CONSTANT = 2;

int main() {
    printf("%d\n", CONSTANT);
    *x += 1;
    printf("%d\n", CONSTANT);
    return 0;
}

Такой код выведет нам:
Код: Скопировать в буфер обмена
Код:
2
Segmentation fault (core dumped)

Что произошло до этого?
Это были указатели -> самая трудная для понимания часть.
Указатели хранят адрес, по которому лежат байты, а тип указателя говорит программе, как распознавать эти байты.
short *x = 0x400322; (второй адрес)
*x = 0x6948;
1734284956138.png



Перейдем к созданию функций.
Синтаксис инициализации функции выглядит следующим образом:
C: Скопировать в буфер обмена
Код:
return_type func_name(arg1_type arg1_name, ...) {
//    body code
}

Дам вам парочку примеров:
C: Скопировать в буфер обмена
Код:
void print_integer(int number) {
    printf("%d", number);
}

int return_3() {
    return 3;
}

int add_2(int number) {
    return number + 2;
}

Попрактиковаться вы можете тут (не реклама):
  1. https://leetcode.com/problems/length-of-last-word/
  2. https://leetcode.com/problems/contains-duplicate/
  3. https://leetcode.com/problems/power-of-two/
  4. https://leetcode.com/problems/valid-parentheses/
  5. https://leetcode.com/problems/longest-common-prefix
На этом у меня всё, спасибо за прочтение моей статьи и до новых встреч!
 
Сверху Снизу