Advertisement
dxvmxnd

Untitled

Mar 18th, 2025
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <winsock2.h>
  3. #include <ws2tcpip.h>
  4. #include <iphlpapi.h>
  5. #include <chrono>
  6. #include <iomanip>
  7.  
  8. #pragma comment(lib, "ws2_32.lib")
  9. #pragma comment(lib, "iphlpapi.lib")
  10.  
  11. using namespace std;
  12.  
  13. // ICMP-заголовок
  14. struct ICMPHeader {
  15. unsigned char type; // тип
  16. unsigned char code; // код
  17. unsigned short checksum; // контрольная сумма
  18. unsigned short id; // идентификатор
  19. unsigned short sequence; // номер последовательности
  20. };
  21.  
  22. // вычисление контрольной суммы
  23. unsigned short calculate_checksum(unsigned short* buffer, int size) {
  24. unsigned long checksum = 0;
  25. while (size > 1) {
  26. checksum += *buffer++;
  27. size -= sizeof(unsigned short);
  28. }
  29. if (size == 1) {
  30. checksum += *(unsigned char*)buffer;
  31. }
  32. checksum = (checksum >> 16) + (checksum & 0xFFFF);
  33. checksum += (checksum >> 16);
  34. return (unsigned short)(~checksum);
  35. }
  36.  
  37. int main() {
  38. // инициализация Winsock
  39. system("chcp 1251");
  40. WSADATA wsaData;
  41. if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
  42. cerr << "Ошибка: не удалось инициализировать Winsock." << endl;
  43. return 1;
  44. }
  45.  
  46. string target_ip;
  47. cout << "Введите IP-адрес целевого узла: ";
  48. cin >> target_ip;
  49.  
  50. // создание RAW-сокета
  51. SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  52. if (sock == INVALID_SOCKET) {
  53. cerr << "Ошибка: не удалось создать RAW-сокет. Код ошибки: " << WSAGetLastError() << endl;
  54. WSACleanup();
  55. return 1;
  56. }
  57.  
  58. // настройка адреса назначения
  59. sockaddr_in dest_addr;
  60. dest_addr.sin_family = AF_INET;
  61. dest_addr.sin_port = 0;
  62. inet_pton(AF_INET, target_ip.c_str(), &dest_addr.sin_addr);
  63.  
  64. // настройка таймаута для сокета
  65. int timeout = 1000;
  66. setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
  67.  
  68. ICMPHeader icmp_request;
  69. char recv_buffer[1024];
  70.  
  71. for (int ttl = 1; ttl <= 30; ++ttl) {
  72. // установка TTL
  73. setsockopt(sock, IPPROTO_IP, IP_TTL, (const char*)&ttl, sizeof(ttl));
  74.  
  75. cout << ttl;
  76. bool reached_target = false;
  77. string last_ip = "";
  78.  
  79. for (int packet = 1; packet <= 3; ++packet) { /*отправка пакета */
  80. // заполнение ICMP-запроса
  81. memset(&icmp_request, 0, sizeof(icmp_request));
  82. icmp_request.type = 8; // Echo Request
  83. icmp_request.code = 0;
  84. icmp_request.id = (unsigned short)GetCurrentProcessId();
  85. icmp_request.sequence = ttl * 3 + packet; // номер последовательности
  86. icmp_request.checksum = calculate_checksum((unsigned short*)&icmp_request, sizeof(icmp_request));
  87.  
  88. // время отправки
  89. auto start_time = chrono::high_resolution_clock::now();
  90.  
  91. // отправка ICMP-запроса
  92. int sent_bytes = sendto(sock, (const char*)&icmp_request, sizeof(icmp_request), 0, (sockaddr*)&dest_addr, sizeof(dest_addr));
  93. if (sent_bytes == SOCKET_ERROR) {
  94. cerr << "Ошибка отправки пакета. Код ошибки: " << WSAGetLastError() << endl;
  95. cout << " *";
  96. continue;
  97. }
  98.  
  99. // ожидание ответа
  100. sockaddr_in reply_addr;
  101. int reply_addr_len = sizeof(reply_addr);
  102. int received_bytes = recvfrom(sock, recv_buffer, sizeof(recv_buffer), 0, (sockaddr*)&reply_addr, &reply_addr_len);
  103.  
  104. // время получения ответа
  105. auto end_time = chrono::high_resolution_clock::now();
  106. double elapsed_time = chrono::duration<double, milli>(end_time - start_time).count();
  107.  
  108. if (received_bytes > 0) {
  109. // преобразование IP-адреса в строку через inet_ntop
  110. char ip_str[INET_ADDRSTRLEN];
  111. inet_ntop(AF_INET, &reply_addr.sin_addr, ip_str, sizeof(ip_str));
  112.  
  113. // Сохраняем IP-адрес
  114. last_ip = string(ip_str);
  115.  
  116. // вывод информации о времени
  117. cout << "\t" << fixed << setprecision(2) << elapsed_time << " ms";
  118.  
  119. // Если это целевой узел, отмечаем, что достигли цели
  120. if (reply_addr.sin_addr.S_un.S_addr == dest_addr.sin_addr.S_un.S_addr) {
  121. reached_target = true;
  122. }
  123. }
  124. else {
  125. // Таймаут
  126. cout << "\t*";
  127. }
  128. }
  129.  
  130.  
  131. if (!last_ip.empty()) {
  132. cout << "\t" << last_ip;
  133. }
  134.  
  135. cout << endl;
  136.  
  137. // Если целевой узел достигнут, прекращаем работу
  138. if (reached_target) {
  139. cout << "Целевой узел достигнут." << endl;
  140. break;
  141. }
  142. }
  143.  
  144. // закрытие сокета и очистка Winsock
  145. closesocket(sock);
  146. WSACleanup();
  147. return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement