diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index 233550f..b5dcc23 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -9,6 +9,8 @@ #include // Определение констант сетевых интерфейсов (IFNAMSIZ) #include // Управление сокетами и интерфейсами (ioctl) #include // Флаги файловых дескрипторов (fcntl) +#include +#include // ====== DCL глобальные переменные ====== // @@ -404,13 +406,82 @@ void my_fin() std::exit(status); } + +using json = nlohmann::json; +// curl --http2 "https://dns.google/resolve?name=example.com&type=A" +// curl --http2 --header "accept: application/dns-json" "https://1.1.1.1/dns-query?name=cloudflare.com" --next --http2 --header "accept: application/dns-json" "https://1.1.1.1/dns-query?name=yandex.com" void my_dns() { // Данная процедура сопостовляет доменное имя с IP + // Обрабатываем перменнкю domain, записываем в ip + // -4001 - ошибка инициализации CURL + // -4002 - ошибка запроса CURL + // -4003 - ошибка парсинга JSON + + status = 0; + CURL* curl = 0; // объект curl + CURLcode res = {}; // результат выполнения запроса + std::string response; // ответ DNS сервера + std::string url = ""; // API DNS сервера + struct curl_slist* headers = {0}; // Заголовки + printf("start my_dns"); // debug + + // Инициализируем curl + curl = curl_easy_init(); + if (!curl) { + status = -4001; + } + + // Формируем URL для Cloudflare DoH + url = "https://1.1.1.1/dns-query?name=" + domain + "&type=A"; + + // Настройки CURL + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response); + curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // HTTP/2 + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // Проверка SSL + + // Устанавливаем заголовок + headers = curl_slist_append(headers, "accept: application/dns-json"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + + // Выполняем запрос + res = curl_easy_perform(curl); + if (res != CURLE_OK) { + status = -4002; + } else { + // Парсим JSON и извлекаем IP + try { + auto json_data = json::parse(response); + if (json_data.contains("Answer")) { + for (const auto& record : json_data["Answer"]) { + if (record["type"] == 1) { // A-запись (IPv4) + ip = record["data"].get(); + break; + } + } + } + } catch (const std::exception& e) { + status = -4003; + } + } + + // Освобождаем ресурсы + curl_slist_free_all(headers); + curl_easy_cleanup(curl); + printf("end my_dns"); // debug } +// Callback для записи ответа от сервера +size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) { + size_t total_size = size * nmemb; + output->append((char*)contents, total_size); + return total_size; +} + void my_tcp_syn() { // Данная процедура выполняет TCP SYN Flood атаку