Advertisement
Guest User

Untitled

a guest
Nov 27th, 2016
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.33 KB | None | 0 0
  1. #include <Winsock2.h>
  2. #include <Windows.h>
  3. #include <iostream>
  4.  
  5. #pragma comment(lib, "Ws2_32.lib")
  6.  
  7. #define SIO_RCVALL 0x98000001
  8. #define MAX_PACKET_SIZE 0x10000
  9.  
  10. typedef struct tagIPHeader
  11. {
  12.   unsigned char  ver_len;       // версия и длина заголовка
  13.   unsigned char  tos;           // тип сервиса
  14.   unsigned short length;        // длина всего пакета
  15.   unsigned short id;            // Id
  16.   unsigned short flgs_offset;       // флаги и смещение
  17.   unsigned char  ttl;           // время жизни
  18.   unsigned char  protocol;      // протокол
  19.   unsigned short xsum;          // контрольная сумма
  20.   unsigned long  src;           // IP-адрес отправителя
  21.   unsigned long  dest;          // IP-адрес назначения
  22.   unsigned short *params;       // параметры (до 320 бит)
  23.   unsigned char  *data;         // данные (до 65535 октетов)
  24. } IPHeader;
  25.  
  26. void ShowError()
  27. {
  28.         LPVOID lpMsgBuf = NULL;
  29.         int error = WSAGetLastError();
  30.         printf("error = %d\n", error);
  31.         FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
  32.             NULL,
  33.             error,
  34.             MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
  35.             (LPTSTR)&lpMsgBuf,0,NULL);
  36.         std::cout << (LPCTSTR)lpMsgBuf << std::endl;
  37.         LocalFree(lpMsgBuf);
  38. }
  39.  
  40. IPHeader* sniff(SOCKET sock)
  41. {
  42.     IPHeader *hdr;
  43.     char buffer[MAX_PACKET_SIZE];
  44.     int count = 0;
  45.  
  46.     count = recv(sock, buffer, sizeof(buffer), 0);
  47.     if (count >= (int)sizeof(IPHeader))
  48.     {
  49.         hdr = (IPHeader *)malloc(MAX_PACKET_SIZE);
  50.         memcpy(hdr, buffer, MAX_PACKET_SIZE);
  51.         return hdr;
  52.     }
  53.     else
  54.         return 0;
  55. }
  56.  
  57. int main()
  58. {
  59.         WSADATA wsaData;
  60.         char hostname[128];
  61.         HOSTENT* hostinfo;
  62.         SOCKADDR_IN sa;
  63.         sockaddr_in local_addr;
  64.         unsigned long flag = 1;
  65.  
  66.         if(WSAStartup(0x0202, &wsaData)){ ShowError(); }
  67.         else
  68.         {
  69.                 std::cout << "WSAStartup - OK" << std::endl;
  70.                 SOCKET sock;
  71.                 sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);   // Create raw socket
  72.                 if(sock == INVALID_SOCKET){ ShowError(); }
  73.                 {
  74.                         std::cout << "Raw scoket is created" << std::endl;
  75.                         //if(closesocket(sock) == SOCKET_ERROR) { ShowError(); }
  76.                 }
  77.  
  78.  
  79.                 gethostname(hostname, sizeof(hostname));
  80.                 hostinfo = gethostbyname(hostname);
  81.  
  82.                 ZeroMemory(&sa, sizeof(sockaddr));
  83.                 sa.sin_family = AF_INET;
  84.                 sa.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr_list[0])->s_addr;
  85.  
  86.                 local_addr.sin_family = AF_INET;
  87.                 local_addr.sin_port = htons(666);
  88.                 local_addr.sin_addr.s_addr = 0;
  89.                 if (bind(sock, (sockaddr *)&sa, sizeof(sa)) == SOCKET_ERROR)
  90.                 {
  91.                     ShowError();
  92.                 }
  93.  
  94.                 ioctlsocket(sock, SIO_RCVALL, &flag);
  95.  
  96.                 // Analyze packets
  97.                 while (true)
  98.                 {
  99.                         IPHeader* hdr = sniff(sock);
  100.                         // обработка IP-пакета
  101.                         if (hdr)
  102.                         {
  103.                                 unsigned char *byte_iterator = (unsigned char *)hdr;
  104.                                 for (int i = 0; i < sizeof(IPHeader); i++)
  105.                                 {
  106.                                         printf("%02x", *byte_iterator);
  107.                                         ++byte_iterator;
  108.                                 }
  109.                         }
  110.                         free(hdr);
  111.                 }
  112.                
  113.                 if(WSACleanup()) { ShowError(); }
  114.                 else
  115.                 { std::cout << "WSACleanup - OK" << std::endl;}
  116.         }
  117.        
  118.         return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement