2017-08-02 9 views
0

So habe ich diese Codezeile:C++ Konvertieren von String-Paket in iphdr - Was sollte das Format von String-Paket sein?

struct iphdr *ip_header = (struct iphdr*) packet.c_str(); 

von ip.h:

struct iphdr 
    { 
#if __BYTE_ORDER == __LITTLE_ENDIAN 
    unsigned int ihl:4; 
    unsigned int version:4; 
#elif __BYTE_ORDER == __BIG_ENDIAN 
    unsigned int version:4; 
    unsigned int ihl:4; 
#else 
# error "Please fix <bits/endian.h>" 
#endif 
    u_int8_t tos; 
    u_int16_t tot_len; 
    u_int16_t id; 
    u_int16_t frag_off; 
    u_int8_t ttl; 
    u_int8_t protocol; 
    u_int16_t check; 
    u_int32_t saddr; 
    u_int32_t daddr; 
    /*The options start here. */ 
    }; 

ich ein DNS-Paket mit wireshark gefangen genommen und ich habe diese Probe Paket:

0000 e0 8e 3c 1c c0 07 ac bc 32 83 84 d9 08 00 45 00 
0010 00 3f 51 45 00 00 40 11 aa b3 c0 a8 fe 65 c0 a8 
0020 fe fe 0e 76 00 35 00 2b d5 1c 9c 0a 01 00 00 01 
0030 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c 
0040 65 03 63 6f 6d 02 70 68 00 00 01 00 01 

Ich entfernte die Eth-Überschrift und so bin ich mit diesem:

0000 45 00 
0010 00 3f 51 45 00 00 40 11 aa b3 c0 a8 fe 65 c0 a8 
0020 fe fe 0e 76 00 35 00 2b d5 1c 9c 0a 01 00 00 01 
0030 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c 
0040 65 03 63 6f 6d 02 70 68 00 00 01 00 01 

Der erste Teil (45 00 00 3f 51 45 00 00 40 11) übersetzt dies:

45  0100 .... = Version: 4 
     .... 0101 = Header Length: 20 bytes (5) 
00  Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) 
00 3f Total Length: 63 
51 45 Identification: 0x5145 (20805) 
00 00 Flags: 0x00 
     Fragment offset: 0 
40  Time to live: 64 
11  Protocol: UDP (17) 

Meine Frage lautet: Was das Format des Zeichenfolgenvariable Pakets sein sollte? Ich habe dies versucht:

std::string packet = "45 00 00 3f 51 45 00 00 40 11"; 

aber für ip_header-> Protokoll ich 48 ‚0‘ statt 17.

Auch ich frage mich, warum ist das Protokoll nicht auf dem neunten Byte? Ich nahm an, dass es am 9. basierend auf der Struktur von iphdr sein sollte.

Würde ich sehr schätzen jemandes Hilfe. Danke vielmals!

+0

Das Paket sollte * Text * nicht enthalten. Was Sie in Wireshark sehen, ist eine hexadezimale Darstellung von Binärdaten. Die Daten selbst bestehen nicht aus diesen Zeichen. (Ähnlich wie das Wort "Kätzchen" ist kein Kätzchen.) – molbdnilo

Antwort

0

Ihre Grundannahme hat einige Probleme. Sie verwenden einen String und Sie gehen davon aus, dass wenn Sie ihn in eine Strukturdefinition umwandeln, er automatisch (und automatisch) in die richtige Binärdarstellung dieser Strukturdefinition konvertiert wird. Das ist nicht der Fall. Nehmen wir an, Sie haben eine Struktur 'struct Test { unsigned int t; }' und eine Zeichenfolge 'std::string st = "12"'. Und Sie tun 'struct Test *pt = st.c_str();'. Die ASCII-Darstellung von "12" wäre 0x31 0x32, so dass nun * pt auf einen Speicherplatz zeigt, der mit 31 32 beginnt. Dies führt zu Integer (angenommen, wir haben ein Big-Endian-System und nehmen an, dass das vorzeichenlose int zwei Bytes ist) 0x3132 (dezimal 12594).

Verwandte Themen