diff --git a/build.sh b/build.sh index 477c251..b86066d 100755 --- a/build.sh +++ b/build.sh @@ -1,2 +1,2 @@ -g++ src/DosAtk.cpp -o DosAtk -lcurl +g++ src/DosAtk.cpp -o DosAtk -lcurl -lssl -lcrypto ./DosAtk "$@" diff --git a/src/DosAtk.cpp b/src/DosAtk.cpp index f6d4fe8..9a78688 100644 --- a/src/DosAtk.cpp +++ b/src/DosAtk.cpp @@ -572,12 +572,91 @@ int my_tcp_syn() return 0; } -int my_udp() +int my_dns() { - // Данная процедура сопостовляет производит port scanning атаку - printf("start my_udp"); // debug - printf("end my_udp"); // debug - return 2; + // Данная процедура сопостовляет доменное имя с IP + // Обрабатываем перменнкю domain, записываем в ip + // -4001 - ошибка инициализации CURL + // -4002 - ошибка запроса CURL + // -4003 - ошибка парсинга JSON + + CURL* curl; // объект curl + CURLcode res; // результат выполнения запроса + std::string response; // ответ DNS сервера + std::string url; // API DNS сервера + struct curl_slist* headers; // Заголовки + nlohmann::json json_data; // Ответ от dns сервера + int status; // Состояние работы процедуры + + status = 0; + curl = 0; + res = {}; + response = ""; + url = ""; + headers = {0}; + json_data = {0}; + + printf("start my_dns"); // debug + + // Инициализируем curl + curl = curl_easy_init(); + if (!curl) { + status = -4001; + } + else { + // Формируем 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 { + json_data = nlohmann::json::parse(response); + if (json_data.contains("Answer")) { + for (const nlohmann::json& record : json_data["Answer"]) { + if (record["type"] == 1) { // A-запись (IPv4) (Это же и проверка валидного IP) + ip = record["data"].get(); + break; + } + } + } + } catch (const std::exception& e) { + status = -4003; + } + } + } + + // Освобождаем ресурсы + curl_slist_free_all(headers); + curl_easy_cleanup(curl); + + if (!status) { + status = 1; + } + + printf("end my_dns"); // debug + return status; +} + +// 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; } /*