D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Автор статьи - onioncoder
Создано специально для - xss.is
Доброго вечера форумчане, сегодня хочу рассмотреть Reverse Engineering на языке C.
С чего начинают изучение языков программирования? Правильно, с вывода "Hello, world!"
Напишем этот простенький код и разберем каждую строчку.
hello_world.c
C: Скопировать в буфер обмена
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:
Как выводить значения переменных?
При помощи функции 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: Скопировать в буфер обмена
Такой код выведет нам:
Код: Скопировать в буфер обмена
Что произошло до этого?
Это были указатели -> самая трудная для понимания часть.
Указатели хранят адрес, по которому лежат байты, а тип указателя говорит программе, как распознавать эти байты.
short *x = 0x400322; (второй адрес)
*x = 0x6948;
Перейдем к созданию функций.
Синтаксис инициализации функции выглядит следующим образом:
C: Скопировать в буфер обмена
Дам вам парочку примеров:
C: Скопировать в буфер обмена
Попрактиковаться вы можете тут (не реклама):
На этом у меня всё, спасибо за прочтение моей статьи и до новых встреч!
Создано специально для - 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:
Как выводить значения переменных?
При помощи функции 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;
Перейдем к созданию функций.
Синтаксис инициализации функции выглядит следующим образом:
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;
}
Попрактиковаться вы можете тут (не реклама):
На этом у меня всё, спасибо за прочтение моей статьи и до новых встреч!