fix: log and msg core dumped #22 (#25)

Co-authored-by: root <root@simasuh.fvds.ru>
Reviewed-on: https://gitea.serafimdev.com/serafim/dos/pulls/25
This commit is contained in:
serafim 2025-05-02 20:13:29 +03:00
parent de3085f043
commit 8cfe964c89
1 changed files with 68 additions and 31 deletions

View File

@ -116,6 +116,19 @@ int my_check_params()
std::localtime(&now_time_t)->tm_sec, // Секунды std::localtime(&now_time_t)->tm_sec, // Секунды
ms.count()); // Миллисекунды ms.count()); // Миллисекунды
char buffer[100];
snprintf(buffer, sizeof(buffer),
"Starting DosAtk at %04d-%02d-%02d %02d:%02d:%02d.%03ld",
std::localtime(&now_time_t)->tm_year + 1900, // Год (с 1900)
std::localtime(&now_time_t)->tm_mon + 1, // Месяц (0-11)
std::localtime(&now_time_t)->tm_mday, // День месяца
std::localtime(&now_time_t)->tm_hour, // Часы
std::localtime(&now_time_t)->tm_min, // Минуты
std::localtime(&now_time_t)->tm_sec, // Секунды
ms.count()); // Миллисекунды
log_msg = std::string(buffer);
// Обрабатываем аргументы командной строки с помощью getopt_long // Обрабатываем аргументы командной строки с помощью getopt_long
// Цикл продолжается, пока getopt_long возвращает валидные опции (-1 означает конец опций) // Цикл продолжается, пока getopt_long возвращает валидные опции (-1 означает конец опций)
while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) {
@ -142,36 +155,41 @@ int my_check_params()
telegram_token = optarg; // Сохраняем токен бота Telegram telegram_token = optarg; // Сохраняем токен бота Telegram
break; break;
case 'h': // Обработка опции -h (--help) case 'h': // Обработка опции -h (--help)
printf("end my_check_params\n"); // debug
return 0; // Устанавливаем статус "показать справку" return 0; // Устанавливаем статус "показать справку"
break; break;
case '?': // Обработка неизвестной опции case '?': // Обработка неизвестной опции
printf("end my_check_params\n"); // debug
return -101; // Устанавливаем статус "неизвестная опция" return -101; // Устанавливаем статус "неизвестная опция"
break; break;
} }
} }
if (status != 0 && status != -101) // Проверяем корректность введенных параметров if (attack_type != "flood" && attack_type != "scan") { // Проверяем валидность типа атаки
{ printf("end my_check_params\n"); // debug
if (attack_type != "flood" && attack_type != "scan") { // Проверяем валидность типа атаки return -1; // Некорректный тип атаки
return -1; // Некорректный тип атаки }
} else if (attack_type == "scan" && domain.empty() && ip.empty()) { // Для port scanning нужен домен или IP
else if (attack_type == "scan" && domain.empty() && ip.empty()) { // Для port scanning нужен домен или IP printf("end my_check_params\n"); // debug
return -10; // Не указана цель для сканирования return -10; // Не указана цель для сканирования
} }
else if (attack_type == "flood" && domain.empty() && ip.empty()) { // Для флуд-атаки нужен домен или IP else if (attack_type == "flood" && domain.empty() && ip.empty()) { // Для флуд-атаки нужен домен или IP
return -20; // Не указана цель для флуда printf("end my_check_params\n"); // debug
} return -20; // Не указана цель для флуда
else if ((!telegram_id.empty() && telegram_token.empty()) || // Если указан telegram token то нужен и id }
(telegram_id.empty() && !telegram_token.empty())) { // Если указан telegram id то нужен и token else if ((!telegram_id.empty() && telegram_token.empty()) || // Если указан telegram token то нужен и id
return -600; // Неполные данные для Telegram (telegram_id.empty() && !telegram_token.empty())) { // Если указан telegram id то нужен и token
} printf("end my_check_params\n"); // debug
else if (attack_type == "scan") { // Если все проверки пройдены и тип атаки - сканирование return -600; // Неполные данные для Telegram
return 1; // Валидные параметры для сканирования }
} else if (attack_type == "scan") { // Если все проверки пройдены и тип атаки - сканирование
printf("end my_check_params\n"); // debug
return 1; // Валидные параметры для сканирования
}
else if (attack_type == "flood") { // Если все проверки пройдены и тип атаки - флуд else if (attack_type == "flood") { // Если все проверки пройдены и тип атаки - флуд
return 2; // Валидные параметры для флуда printf("end my_check_params\n"); // debug
} return 2; // Валидные параметры для флуда
} }
printf("end my_check_params\n"); // debug printf("end my_check_params\n"); // debug
@ -369,7 +387,7 @@ bool is_numeric(const std::string& s)
int my_msg() int my_msg()
{ {
printf("begin my_msg"); // debug printf("begin my_msg\n"); // debug
// Объявление // Объявление
struct curl_slist* headers; // Заголовки HTTP-запроса struct curl_slist* headers; // Заголовки HTTP-запроса
@ -392,7 +410,7 @@ int my_msg()
// Проверка наличия обязательных параметров Telegram // Проверка наличия обязательных параметров Telegram
if (telegram_token.empty() || telegram_id.empty()) if (telegram_token.empty() || telegram_id.empty())
{ {
status = 0; // Интеграция с Telegram не настроена (отсутствует токен или ID) return 0; // Интеграция с Telegram не настроена (отсутствует токен или ID)
} }
if (!curl) if (!curl)
@ -446,7 +464,7 @@ int my_msg()
status = 4; // Ошибка сервера status = 4; // Ошибка сервера
} }
printf("end my_msg"); // debug printf("end my_msg\n"); // debug
return status; return status;
} }
@ -576,6 +594,8 @@ void my_fin()
std::cout << "DosAtk stopped at " << std::put_time(std::localtime(&end_time_t), "%Y-%m-%d %H:%M:%S") std::cout << "DosAtk stopped at " << std::put_time(std::localtime(&end_time_t), "%Y-%m-%d %H:%M:%S")
<< "." << std::setfill('0') << std::setw(3) << milliseconds.count() << std::endl; << "." << std::setfill('0') << std::setw(3) << milliseconds.count() << std::endl;
log_msg = "";
// Завершаем программу с кодом состояния // Завершаем программу с кодом состояния
std::exit(status); std::exit(status);
} }
@ -589,7 +609,7 @@ int my_tcp_syn() {
* -201 - ошибка создания raw-сокета * -201 - ошибка создания raw-сокета
* -202 - ошибка отправки SYN-пакета * -202 - ошибка отправки SYN-пакета
*/ */
printf("start my_tcp_syn"); // debug printf("start my_tcp_syn\n"); // debug
// === Объявление локальных переменных === // === Объявление локальных переменных ===
int sock; // Основной raw-сокет для отправки пакетов int sock; // Основной raw-сокет для отправки пакетов
@ -705,18 +725,23 @@ int my_tcp_syn() {
if (sendto(sock, packet, sizeof(packet), 0, 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++; n_fail_requests++;
printf("end my_tcp_syn\n"); // debug
log_msg = "Failed to send tcp syn msg";
return -202; return -202;
} else { } else {
n_ok_requests++; n_ok_requests++;
} }
// 9. Проверка завершения // 9. Проверка завершения
if ((n_ok_requests + n_fail_requests) >= 1000) { if ((n_ok_requests + n_fail_requests) >= 10000) {
log_msg = "Sent 10000 requests, stopping attack";
printf("end my_tcp_syn\n"); // debug
return 2; return 2;
} }
close(sock); close(sock);
printf("end my_tcp_syn"); // debug printf("end my_tcp_syn\n"); // debug
log_msg = "Sent tcp syn msg";
return 0; return 0;
} }
@ -751,11 +776,18 @@ int my_dns()
headers = {0}; headers = {0};
json_data = {0}; json_data = {0};
printf("start my_dns"); // debug printf("start my_dns\n"); // debug
if (!ip.empty())
{
printf("end my_dns\n"); // debug
return 0;
}
// Инициализируем curl // Инициализируем curl
curl = curl_easy_init(); curl = curl_easy_init();
if (!curl) { if (!curl)
{
status = -4001; status = -4001;
} }
else { else {
@ -803,7 +835,7 @@ int my_dns()
status = 1; status = 1;
} }
printf("end my_dns"); // debug printf("end my_dns\n"); // debug
return status; return status;
} }
@ -839,6 +871,11 @@ int main(int arg_ctr, char **arg_ptr)
status = my_check_params(); // Проверяем параметры командной строки status = my_check_params(); // Проверяем параметры командной строки
if (my_log()) // Если записать лог не удалось
{
my_msg(); // Отправляем сообщение
}
switch (status) // Обрабатываем результат проверки параметров switch (status) // Обрабатываем результат проверки параметров
{ {
case 1: // Режим сканирования портов (UDP) case 1: // Режим сканирования портов (UDP)