2017-05-10 1 views
-1

Ich schreibe eine PCAP-Datei in C++ ohne libpcap-Bibliothek verwenden. Die Paketstrukturen sind korrekt. Aber ich sehe, dass die Länge von IP-Paket falsch ist, und daher wird der Rest der Protokolle nicht angezeigt. Der Fehler wird in der angehängten Datei 'pcap file error image' angezeigt. Ich habe libpcap format wireshark usw. gesucht ... Aber ich sehe keine Lösung für mein Problem.IP-Paket von PCAP-Datei zeigt falsche Länge

pcap file error image

Hier ist mein Code

int iWritePcapHeader(){ 


     pcap_global_header_s.magic_number = 0xa1b2c3d4 ; 
     pcap_global_header_s.version_major = PCAP_VERSION_MAJOR ; 
     pcap_global_header_s.version_minor = PCAP_VERSION_MINOR; 
     pcap_global_header_s.thiszone = 0; // check here if timestamps of packets are not correct 
     pcap_global_header_s.sigfigs = 0; 
     pcap_global_header_s.snaplen = 65535; 
     pcap_global_header_s.network = 1; //Ethernet   

     return 0; 
    } 

    uint16_t uiIPHeader_Checksum(void *data, int len) 
    { 
     uint32_t sum=0; 
     size_t i; 
     for (i=0; i < len/2; ++i) 
      sum += ntohs(((uint16_t*)data)[i]); 
     while (sum & 0xFFFF0000) 
      sum = (sum & 0xFFFF)+(sum >> 16); 
     return ((uint16_t) ~sum); 
    } 

    int iWrite(
     const CString &rcsSrcAddress, unsigned long ulSrcPort, 
     const CString &rcsDestAddress, unsigned long ulDestPort, 
     enum E_PROTOCOL_TYPE eProtocolType, 
     const unsigned char *pucBytes, unsigned long ulNofBytes) 
    { 
     printf("iWrite %ul\n" , ulNofBytes); 

     iWritePcapHeader(); 

     //PCAP header for each data packet 
     SYSTEMTIME timews; 
     GetSystemTime(&timews); 
     PCAP_PKT_HEADER pcap_pkt_header_s ; 
     pcap_pkt_header_s.ts_sec = time(NULL); 
     pcap_pkt_header_s.ts_usec = (timews.wMilliseconds * 1000); 
     pcap_pkt_header_s.incl_len = ulNofBytes + sizeof(UDP_HEADER) + sizeof(IP_HEADER) + sizeof(ETHERNET_HEADER); 
     pcap_pkt_header_s.orig_len = ulNofBytes + sizeof(UDP_HEADER) + sizeof(IP_HEADER) + sizeof(ETHERNET_HEADER); 

     //Ethernet Header 
     ETHERNET_HEADER ethernet_header_s; 
     unsigned char macAddress[6] = {0x00,0x00,0x00,0x00,0x00,0x00};  // no mac available for now. Hence just fill in dummy data 
     memcpy(ethernet_header_s.dst,macAddress,6); 
     memcpy(ethernet_header_s.src,macAddress,6); 
     ethernet_header_s.type = 0x0800; 


     //IP_Header 
     IP_HEADER ip_header_s; 
     ip_header_s.ip_v = IPVERSION; 
     ip_header_s.ip_hl = 5; 
     ip_header_s.ip_tos = 0; 
     ip_header_s.ip_len = (uint16_t)(ulNofBytes + sizeof(UDP_HEADER) + sizeof(IP_HEADER)); 
     ip_header_s.ip_id = 0; 
     ip_header_s.ip_off = IP_DF; 
     ip_header_s.ip_ttl = 0x40; // 40(hex) = 64 , 80(hex) = 128 
     ip_header_s.ip_p = 0x11;                 
     ip_header_s.ip_src = inet_addr(rcsSrcAddress); 
     ip_header_s.ip_dst = inet_addr(rcsDestAddress);   
     ip_header_s.ip_sum = (uint16_t)(uiIPHeader_Checksum(&ip_header_s, sizeof(IP_HEADER))); 

     //UDP Header 
     UDP_HEADER udp_header_s; 
     udp_header_s.srcPort = ulSrcPort; 
     udp_header_s.dstPort = ulDestPort; 
     udp_header_s.length = (uint16_t)(ulNofBytes + sizeof(UDP_HEADER)); 

     if (eProtocolType == E_UDP) { 
      //UDP Header 
      UDP_HEADER udp_header_s; 
      udp_header_s.srcPort = ulSrcPort; 
      udp_header_s.dstPort = ulDestPort; 
      udp_header_s.length = (uint16_t)(ulNofBytes + sizeof(UDP_HEADER)); 

      // wiresharkPkt = pcap_pkt_header_s + ethernet_header_s + ip_header_s + udp_header_s + pucBytes ; 
      WIRESHARK_UDP_PKT_HEADER wireshark_udp_pkt_header; 
      wireshark_udp_pkt_header.pcap_pkt_header = pcap_pkt_header_s; 
      wireshark_udp_pkt_header.l2l3UDP_header.ethernet_header = ethernet_header_s; 
      wireshark_udp_pkt_header.l2l3UDP_header.ip_header = ip_header_s; 
      wireshark_udp_pkt_header.l2l3UDP_header.udp_header = udp_header_s; 

      fwrite(&pcap_global_header_s, sizeof(PCAP_GLOBAL_HEADER), 1, mpFile); 
      fwrite(&wireshark_udp_pkt_header, sizeof(WIRESHARK_UDP_PKT_HEADER), 1, mpFile); 
      fwrite(pucBytes, ulNofBytes, 1, mpFile); 
     } 
     else if (eProtocolType == E_TCP) 
     { 
      //TCP Header 


     } 

Antwort

0

Sowohl IP und UDP, ebenso wie viele andere Netzwerkprotokolle, verwenden Big-Endian-Byte-Reihenfolge. Und da Sie diesen Code wahrscheinlich auf Little-Endian-Maschinenwerten ausführen, die in ip_header_s.ip_len und udp_header_s.length geschrieben werden, wird falsch sein. Sie sollten die htons Funktion verwenden, um einen kurzen Wert vom Host in die Netzwerk-Byte-Reihenfolge zu konvertieren.

ip_header_s.ip_len = htons((uint16_t)(ulNofBytes + sizeof(UDP_HEADER) + sizeof(IP_HEADER))); 

Abgesehen von Byte-Reihenfolge, können Sie Ihren Code durch Überprüfung tatsächliche Größen von Strukturen und das Loswerden von magischen Zahlen verbessern. Auch Ihr Code ist komplett in C geschrieben, warum haben Sie C++ hinzugefügt?

+0

Danke für die Hilfe. Obwohl ich NTOHs benutzen musste, um es zu funktionieren !! Was das Tag betrifft, habe ich die im Programm verwendeten Klassen usw. weggelassen und nur die Methode eingefügt. Das Design ist ursprünglich in C++, hier ist es aber egal :) – AswathyPrasad