diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..b2a3f9c --- /dev/null +++ b/src/Makefile @@ -0,0 +1,14 @@ +CXX = g++ +CXXFLAGS = -Iinclude/ + +all: dos + +# Сюда дописывать файлики для компиляции +dos: + $(CXX) $(CXXFLAGS) ./main.cpp ./my_check_params.cpp -o dos + +rebuild: + rm -f ./dos && make dos + +clean: + rm -f ./dos \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..bfd004a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,46 @@ +#include "my_check_params.hpp" + +Options opts; + +using namespace std; + +// Компиляция из директории вызвать команду make my_app +// Запуск: ./my_app [флаги и аргументы к ним] (начать можно с флага --help) +int main(int argc, char *argv[]) { + + int error = my_check_params(argc, argv); + if (error > 0) + { + if (opts.attack_type == "flood") { + cout << "type attack: " << opts.attack_type << "\n"; + cout << "domain: " << opts.domain << "\n"; + cout << "ip: " << opts.ip << "\n"; + cout << "port: " << opts.port << "\n"; + cout << "log file path: " << opts.log_file << "\n"; + } + else if (opts.attack_type == "scan") { + cout << "type attack: " << opts.attack_type << "\n"; + cout << "domain: " << opts.domain << "\n"; + cout << "ip: " << opts.ip << "\n"; + cout << "log file path: " << opts.log_file << "\n"; + } + + if (!opts.telegram_id.empty()) { + cout << "telegram_id: " << opts.telegram_id << "\n"; + } + + if (!opts.telegram_token.empty()) { + cout << "telegram_token: " << opts.telegram_token << "\n"; + } + + + } + else { + cout << "err code:" << error << "\n"; + } + + + + + return 0; +} \ No newline at end of file diff --git a/src/my_check_params.cpp b/src/my_check_params.cpp new file mode 100644 index 0000000..e45634d --- /dev/null +++ b/src/my_check_params.cpp @@ -0,0 +1,117 @@ +#include "my_check_params.hpp" + +// Гарантируется наличие минимума нужных аргументов для flood и scan +// Гарантируется, что после работы парсера мы получим только валидный тип атаки + +// Добавить: +// 1. Валидацию IP, port + +// Статус коды: +// 2 - Атака флуд, все нужные опции есть +// 1 - Атака порт скан, все нужные опции есть +// 0 - нужна помощь +// -1 - пользователь не ввел тип атаки или ввел неверный тип атаки +// -10 - Пользователь выбрал тип атаки порт сканнинг, но не ввел нужные параметры +// -20 - Пользователь выбрал тип атаки флуд, но не ввел нужные параметры +// -100 - неизвестная ошибка +// -101 - неизвестная опция или потерян аргумент, следует предложить вызвать флаг помощи +// -600 - пользователь ввел токен, но не id или наоборот +// Какие-то еще коды? +int my_check_params(int argc, char** argv) { + + int status = -100; + // Короткие опции (с двоеточием для параметров) + const char* short_options = "a:d:i:p:l:t:b:h"; + + // Длинные опции + const struct option long_options[] = { + {"attack", required_argument, NULL, 'a'}, + {"domain", required_argument, NULL, 'd'}, + {"ip", required_argument, NULL, 'i'}, + {"port", required_argument, NULL, 'p'}, + {"log", required_argument, NULL, 'l'}, + {"telegram", required_argument, NULL, 't'}, + {"token", required_argument, NULL, 'b'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} + }; + + int opt; + while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { + switch (opt) { + case 'a': + opts.attack_type = optarg; + break; + case 'd': + opts.domain = optarg; + break; + case 'i': + opts.ip = optarg; + break; + case 'p': + opts.port = optarg; + break; + case 'l': + opts.log_file = optarg; + break; + case 't': + opts.telegram_id = optarg; + break; + case 'b': + opts.telegram_token = optarg; + break; + case 'h': + // std::cout << "Usage: " << argv[0] << " [options]\n" + // << "Required:\n" + // << " -a, --attack TYPE Type of attack (scan|flood)\n" + // << " -d, --domain DOMAIN Target domain\n" + // << " -i, --ip IP Target IP\n" + // << " -p, --port PORT Port. Required only for flood type!\n" + // << "Optional:\n" + // << " -l, --log FILE Log file\n" + // << " -t, --telegram ID Telegram ID\n" + // << " -b, --token TOKEN Telegram bot token\n"; + status = 0; + break; + case '?': + // std::cerr << "Unknown option!\n.--help for info\n"; + status = -101; + break; + default: + status = -100; + break; + } + } + + // Проверка обязательных параметров + + if (status != 0 && status != -101) + { + if (opts.attack_type != "flood" && opts.attack_type != "scan") { + // std::cerr << "Error: Missing required parameters!\n--help for more info\n"; + status = -1; + } + else if (opts.attack_type == "scan" && (opts.domain.empty() || opts.ip.empty())) { + // std::cerr << "Error: Missing required parameters!\n--help for more info\n"; + status = -10; + } + else if (opts.attack_type == "flood" && (opts.domain.empty() || opts.ip.empty() || opts.port.empty())) { + // std::cerr << "Error: Missing required parameters!\n--help for more info\n"; + status = -20; + } + else if ((!opts.telegram_id.empty() && opts.telegram_token.empty()) || (opts.telegram_id.empty() && !opts.telegram_token.empty())) { + status = -600; + } + else if (opts.attack_type == "scan" && !opts.domain.empty() && !opts.ip.empty()) { + // std::cerr << "Error: Missing required parameters!\n--help for more info\n"; + status = 1; + } + else if (opts.attack_type == "flood" && !opts.domain.empty() && !opts.ip.empty() && !opts.port.empty()) { + // std::cerr << "Error: Missing required parameters!\n--help for more info\n"; + status = 2; + } + // Какие-то еще коды? + } + + return status; +} \ No newline at end of file diff --git a/src/my_check_params.hpp b/src/my_check_params.hpp new file mode 100644 index 0000000..3601bc1 --- /dev/null +++ b/src/my_check_params.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include +#include +#include +#include // Для struct option + + +struct Options { + std::string attack_type; // Обязательный параметр + std::string domain; // Обязательный параметр + std::string ip; // Обязательный параметр + std::string port; // Обязательный параметр (не обязательный для скана) + std::string log_file = "/var/logs/DosAtk"; // Значение по умолчанию, не обязательный + std::string telegram_id; // Не обязательный параметр + std::string telegram_token; // Не обязательный параметр +}; + +extern Options opts; // Теперь это глобальная переменная, где она должна определяться? + +// Прототип функции парсинга +int my_check_params(int argc, char** argv); \ No newline at end of file