From b794b1c507d0f4af7f9fbad023928261738d2def Mon Sep 17 00:00:00 2001 From: dr-wh0 <79003667309@yandex.ru> Date: Mon, 28 Apr 2025 17:33:02 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20my=5Flog()=20=D0=B8=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=B0=20build.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.py | 20 +++++++++++ src/DosAtk.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 102 insertions(+), 15 deletions(-) create mode 100755 build.py diff --git a/build.py b/build.py new file mode 100755 index 0000000..909fa40 --- /dev/null +++ b/build.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +import os +import sys +import subprocess + +log_path = "/var/log/DosAtk" +if not os.path.exists(log_path): + if os.getuid() == 0: # Если уже root + os.system("mkdir -p /var/log && touch /var/log/DosAtk") + os.system("chmod 666 /var/log/DosAtk") + else: + os.system("sudo mkdir -p /var/log && sudo touch /var/log/DosAtk 2>/dev/null || true") + os.system("sudo chmod 666 /var/log/DosAtk 2>/dev/null || true") + +# Компиляция +if subprocess.call(["g++", "src/DosAtk.cpp", "-o", "DosAtk", "-lcurl", "-lssl", "-lcrypto"]) != 0: + sys.exit(1) + +# Запуск с аргументами +os.execvp("./DosAtk", ["./DosAtk"] + sys.argv[1:]) \ No newline at end of file diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index e33bf19..2541b0a 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -27,6 +27,8 @@ #include // Базовые функции (C) #include // Работа со строками (C) #include // Сетевые функции, интернет-адреса +#include // Для создания директории mkdir +#include // Работа с файловыми потоками /* ██████╗ ██████╗██╗ ██╗ ██╗ █████╗ ██████╗ ███████╗ @@ -291,7 +293,7 @@ bool is_numeric(const std::string& s) return true; } -void my_msg() +int my_msg() { printf("begin my_msg"); // debug @@ -371,13 +373,79 @@ void my_msg() } printf("end my_msg"); // debug + return status; } int my_log() { // Данная функция записывает в файл лога сообщение - printf("start my_log"); // debug - printf("end my_log"); // debug + printf("start my_log\n"); // debug + + // === Объявление локальных переменных === + std::ofstream log_stream; // Поток для работы с файлом + std::string current_log_name; // Текущее имя лог-файла + struct stat file_stat; // Информация о файле + std::chrono::system_clock::time_point now; // Текущее время + std::time_t now_time_t; // Время в time_t + std::tm now_tm; // Время в tm структуре + char time_buf[20]; // Буфер для времени + std::string rotated_log_name; // Новое имя файла при ротации + int stat_result; // Результат проверки stat + std::chrono::milliseconds ms; // Миллисекунды + + const size_t max_log_size = 10485760; // Лимит размера лога (10MB) + + // === Инициализация переменных === + now = std::chrono::system_clock::now(); + now_time_t = std::chrono::system_clock::to_time_t(now); + localtime_r(&now_time_t, &now_tm); + memset(time_buf, 0, sizeof(time_buf)); + strftime(time_buf, sizeof(time_buf), "%Y%m%d_%H%M%S", &now_tm); + current_log_name = log_file; + rotated_log_name = log_file + "_" + time_buf; + memset(&file_stat, 0, sizeof(file_stat)); + stat_result = stat(log_file.c_str(), &file_stat); + ms = std::chrono::duration_cast( + now.time_since_epoch()) % 1000; + + // === Основная логика === + // Если путь к лог-файлу не указан + if(log_file.empty()) { + return 0; + } + + // Открытие файла в режиме добавления + log_stream.open(log_file, std::ios::app | std::ios::ate); + + // Проверка успешности открытия файла + if(!log_stream.is_open()) { + return 1; + } + + // Запись сообщения в лог + log_stream << "[" << std::put_time(&now_tm, "%Y-%m-%d %H:%M:%S") + << "." << std::setfill('0') << std::setw(3) << ms.count() << "] " + << log_msg << std::endl; + + // Проверка размер файла и выполняем ротацию + if(stat_result == 0 && file_stat.st_size > max_log_size) { + log_stream.close(); // Закрываем файл перед ротацией + + // Переименование файла + if(rename(log_file.c_str(), rotated_log_name.c_str()) != 0) { + return 1; + } + + // Открытие нового лог-файла + log_stream.open(log_file, std::ios::app); + if(!log_stream.is_open()) { + return 1; + } + } + + log_stream.close(); + + printf("end my_log\n"); // debug return 0; } @@ -387,7 +455,7 @@ void my_fin() // Объявления time_t end_time_t; // Время завершения выполненя программы - std::chrono::milliseconds duration; // Длительность выполнения программы + std::chrono::milliseconds duration; // Длительность выполнения программы std::chrono::hours hours; // Компонента часов времени завершения std::chrono::minutes minutes; // Компонента минут времени завершения std::chrono::seconds seconds; // Компонента секунд времени завершения @@ -450,15 +518,15 @@ int my_tcp_syn() { printf("start my_tcp_syn"); // debug // === Объявление локальных переменных === - int sock; // Основной raw-сокет для отправки пакетов - int one; // Флаг для setsockopt + int sock; // Основной raw-сокет для отправки пакетов + int one; // Флаг для setsockopt // Структуры для адресов - struct sockaddr_in target_addr; // Адрес цели + struct sockaddr_in target_addr; // Адрес цели // Параметры подключения - uint16_t target_port; // Порт цели (в сетевом порядке байт) + uint16_t target_port; // Порт цели (в сетевом порядке байт) // Структуры заголовков - struct iphdr ip_header; // IP-заголовок пакета - struct tcphdr tcp_header; // TCP-заголовок пакета + struct iphdr ip_header; // IP-заголовок пакета + struct tcphdr tcp_header; // TCP-заголовок пакета // Псевдозаголовок для контрольной суммы struct { uint32_t saddr; @@ -468,8 +536,8 @@ int my_tcp_syn() { uint16_t tcp_len; } pseudo_header; // Буферы данных - char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы - char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет + char temp_buf[sizeof(pseudo_header) + sizeof(tcphdr)]; // Буфер для контрольной суммы + char packet[sizeof(iphdr) + sizeof(tcphdr)]; // Итоговый пакет // Переменные для встроенного расчета контрольной суммы uint16_t *checksum_ptr; @@ -573,18 +641,17 @@ int my_tcp_syn() { return 2; } - close(sock); printf("end my_tcp_syn"); // debug return 0; } -void my_udp() { +int my_udp() { // Выполняет UDP портовое сканирование well-known портов int status; int sockfd; // Дескриптор сокета struct sockaddr_in target_addr; // Адрес цели - static int port_idx; // Текущий индекс порта + static int port_idx; // Текущий индекс портаS static const int ports[]; // Список портов static const int ports_total; int curr_port; // Текущий порт -- 2.40.1 From aaf689f78cf86e247be8a8e17f5d76116bcc3fc6 Mon Sep 17 00:00:00 2001 From: dr-wh0 <79003667309@yandex.ru> Date: Mon, 28 Apr 2025 20:48:15 +0300 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20src/DosAtk.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DosAtk.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 2541b0a..a9a631f 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -39,8 +39,8 @@ ╚═════╝ ╚═════╝╚══════╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════ */ -int argc; // Количество аргументов при вызове программы -char **argv; // Массив строк с агрументами +int argc; // Количество аргументов при вызове программы +char **argv; // Массив строк с агрументами std::string attack_type; // Тип атаки: scan или syn std::string domain; // Доменное Имя std::string ip; // Ip жертвы @@ -255,7 +255,7 @@ std::string escape_json(const std::string& s) case '\n': result += "\\n"; break; // Экранирование новой строки case '\r': result += "\\r"; break; // Экранирование возврата каретки case '\t': result += "\\t"; break; // Экранирование табуляции - default: result += c; break; // Все остальные символы добавляем как есть + default: result += c; break; // Все остальные символы добавляем как есть } } @@ -649,14 +649,14 @@ int my_tcp_syn() { int my_udp() { // Выполняет UDP портовое сканирование well-known портов int status; - int sockfd; // Дескриптор сокета - struct sockaddr_in target_addr; // Адрес цели - static int port_idx; // Текущий индекс портаS - static const int ports[]; // Список портов + int sockfd; // Дескриптор сокета + struct sockaddr_in target_addr; // Адрес цели + static int port_idx; // Текущий индекс порта + static const int ports[]; // Список портов static const int ports_total; - int curr_port; // Текущий порт - const char dummy_data[]; // Данные для отправки - ssize_t send_result; // Результат отправки + int curr_port; // Текущий порт + const char dummy_data[]; // Данные для отправки + ssize_t send_result; // Результат отправки // Инициализация структуры адреса memset(&target_addr, 0, sizeof(target_addr)); -- 2.40.1 From 9375bb7b9c973686a18ab0066e8deeb4a37b30ce Mon Sep 17 00:00:00 2001 From: Serafim Date: Mon, 28 Apr 2025 21:49:16 +0300 Subject: [PATCH 3/4] fix: rename var --- src/DosAtk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index de1d33b..30b219d 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -228,7 +228,7 @@ int my_udp() { target_addr.sin_port = htons(curr_port); // Преобразование IP - if (inet_pton(AF_INET, global_ip, &target_addr.sin_addr) <= 0) { + if (inet_pton(AF_INET, ip, &target_addr.sin_addr) <= 0) { n_fail_requests++; status = -501; // Код ошибки: неверный IP if (sockfd != -1) close(sockfd); -- 2.40.1 From 068559ef5a562d023ae8df114ab86bdb482a2cdf Mon Sep 17 00:00:00 2001 From: dr-wh0 <79003667309@yandex.ru> Date: Mon, 28 Apr 2025 18:55:41 +0000 Subject: [PATCH 4/4] Fix ip and my_diag error --- src/DosAtk.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 30b219d..c35a89f 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -228,7 +228,7 @@ int my_udp() { target_addr.sin_port = htons(curr_port); // Преобразование IP - if (inet_pton(AF_INET, ip, &target_addr.sin_addr) <= 0) { + if (inet_pton(AF_INET, ip.c_str(), &target_addr.sin_addr) <= 0) { n_fail_requests++; status = -501; // Код ошибки: неверный IP if (sockfd != -1) close(sockfd); @@ -263,7 +263,7 @@ int my_udp() { return status; } -void my_diag(int status) +void my_diag() { // Данная функция вызывается в случае ошибки на каком-то этапе и на основании поступившего кода, // формирует сообщение с описанием произошедшей ошибки -- 2.40.1