просмотр содержимого udp пакета

Discussion in 'WASM.NETWORKS' started by DeaD_MoroZ, Aug 8, 2011.

  1. DeaD_MoroZ

    DeaD_MoroZ New Member

    Blog Posts:
    0
    Joined:
    Oct 30, 2009
    Messages:
    14
    приветствую! задача собственно следующая: нужно поймать содержимое всех udp пакетов от определённого порта. как отфильтровать пакеты от других, получить длину, назначение и тд я знаю... а вот как посмотреть содержимое? заранее спасибо за ответы.
    Хорошо было бы если бы объяснили на примере. вот пока что у меня есть:
    Code (Text):
    1. #include <stdio.h>
    2. #include <winsock2.h>
    3. #pragma comment(lib, "WS2_32.lib")
    4.  
    5. #define MAX_PACKET_SIZE    0x10000
    6. #define SIO_RCVALL         0x98000001
    7.  
    8. char Buffer[MAX_PACKET_SIZE];
    9. typedef struct IPHeader {
    10.   UCHAR   iph_verlen;  
    11.   UCHAR   iph_tos;    
    12.   USHORT  iph_length;  
    13.   USHORT  iph_id;      
    14.   USHORT  iph_offset;  
    15.   UCHAR   iph_ttl;      
    16.   UCHAR   iph_protocol;
    17.   USHORT  iph_xsum;    
    18.   ULONG   iph_src;    
    19.   ULONG   iph_dest;    
    20. } IPHeader;
    21.  
    22. char src[10];
    23. char dest[10];
    24. char ds[15];
    25. unsigned short lowbyte;
    26. unsigned short hibyte;
    27.  
    28. void main()
    29. {
    30.   WSADATA     wsadata;  
    31.   SOCKET      s;        
    32.   char        name[128];
    33.   HOSTENT*    phe;  
    34.   SOCKADDR_IN sa;
    35.   IN_ADDR sa1;    
    36.   unsigned long        flag = 1;
    37.  
    38.   WSAStartup(MAKEWORD(2,2), &wsadata);
    39.   s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
    40.   gethostname(name, sizeof(name));
    41.   phe = gethostbyname( name );
    42.   ZeroMemory( &sa, sizeof(sa) );
    43.   sa.sin_family = AF_INET;
    44.   sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
    45.   bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
    46.   ioctlsocket(s, SIO_RCVALL, &flag);
    47.   bool wrk = true;
    48.   while(wrk)
    49.   {
    50.     int count;
    51.     count = recv( s, Buffer, sizeof(Buffer), 0 );
    52.     if( count >= sizeof(IPHeader) )
    53.     {
    54.       IPHeader* hdr = (IPHeader *)Buffer;
    55.       if(hdr->iph_protocol == IPPROTO_UDP)
    56.     {
    57.     strcpy(src,"Пакет: ");
    58.     CharToOem(src,dest);
    59.     printf(dest);
    60.     printf("From ");
    61.     sa1.s_addr = hdr->iph_src;
    62.     printf(inet_ntoa(sa1));
    63.     printf(" To ");
    64.     sa1.s_addr = hdr->iph_dest;
    65.     printf(inet_ntoa(sa1));
    66.     printf(" Prot: ");
    67.     printf("UDP ");
    68.     printf("Size: ");
    69.     lowbyte = hdr->iph_length>>8;
    70.     hibyte = hdr->iph_length<<8;
    71.     hibyte = hibyte + lowbyte;
    72.     printf("%u",hibyte);
    73.     printf(" TTL:%u",hdr->iph_ttl);
    74.     printf("\n");
    75.     }
    76.     }
    77.   }
    78.   closesocket( s );
    79.   WSACleanup();
    80. }
     
  2. neutronion

    neutronion New Member

    Blog Posts:
    0
    Joined:
    Mar 31, 2010
    Messages:
    1,100
    В этой строке получаете значение тоже
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    Смотрите по какому смещению находятся данные в протоколе. ip-udp.
    ip насколько я помню 20 байт, сколько-то хидер udp. Для этого уже
    есть структуры описывающие upd.
     
  3. DeaD_MoroZ

    DeaD_MoroZ New Member

    Blog Posts:
    0
    Joined:
    Oct 30, 2009
    Messages:
    14
    вот структуру мне бы...
     
  4. _DEN_

    _DEN_ DEN

    Blog Posts:
    0
    Joined:
    Oct 8, 2003
    Messages:
    5,383
    Location:
    Йобастан
  5. neutronion

    neutronion New Member

    Blog Posts:
    0
    Joined:
    Mar 31, 2010
    Messages:
    1,100
    Некогда искать, смысл прост. Пакет является такой штукой:
    ip хидер + udp хидер + data.
    Размер ip постояннный: 20 байт. Разме udp хидера
    struct udpheader {
    unsigned short int uh_sport;
    unsigned short int uh_dport;
    unsigned short int uh_len;
    unsigned short int uh_check;
    }; /* total udp header length: 8 bytes (=64 bits) */

    после этого идут данные udp/

    В ip содержится длина пакета вместе с ip хидером.
    Берете размер пакета в ip вычитаете из него размер ip header и размер
    udp хидера, и получаете смещение на данные юдп.
    А также вычитанием ip.length - смещение на данные = размер данных.
    Все эти значения можно получать разными способами, можно использовать
    и поле len в пакете udp.
    Прочитайте внимательно
    протокол ip, он не большой и там все нормально расписано и юдп протокол.
    Они достаточно простые, вот tcp намного сложнее и хитрее. Если поймете,
    то структуры уже сами можете создавать какие хотите.