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; // Текущий порт