2017-03-31 2 views
0

Müssen ein Werkzeug schreiben, wo ich das gesamte ICMPv6-Paket erstellen muss. Ich kann nicht scheinen, den Code zu bekommen, um korrekte ICMPv6 Prüfsumme zu erzeugen. Ich habe versucht, die checksum(void * buffer, int bytes) Funktion aus den folgendenKann die ICMPV6-Prüfsumme nicht bekommen

Calculating checksum of ICMPv6 Packet in C

Ich habe einen wireshark-Capture, dass ich die Prüfsumme zu verifizieren verwenden. Der ursprüngliche Paketinhalt sieht aus wie

0000 33 33 00 00 00 01 38 ea a7 89 be 59 86 dd 60 00 0010 00 00 00 20 3a ff fe 80 00 00 00 00 00 00 88 c5 0020 75 41 aa 0c 58 ee ff 02 00 00 00 00 00 00 00 00 0030 00 00 00 00 00 01 88 00 b8 cc 20 00 00 00 fe 80 0040 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee 02 01 0050 38 ea a7 89 be 59

Die richtigen Prüfsumme ofcourse aus dem Paket 0xb8cc ist. Das obige Paket ist das gesamte IPv6-Paket, aber der relevante Inhalt des Pakets beginnt mit der Quelladresse, die fe 80 00 00 00 00 00 00 88 c5 75 41 aa 0c 58 ee ist. Der ICMPv6-Header beginnt bei 88 00.

Ich denke, dass die Checksummenfunktion aus dem obigen Link korrekt sein kann, aber der Puffer, den ich zur Berechnung der Prüfsumme aufbaut, ist wahrscheinlich falsch. Im Anschluss an den RFCs konstruierte I der Puffer durch Quelle addr Verketten, dest addr, Paketlänge (32 = 00 20), Next-Header (58 = 3a), Rest von ICMPv6 Paket, das mir den Endpuffer von

uint8_t packet[] = { 0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 , 0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee, 0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, 0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01, 0x00 , 0x20 ,0x3a , 0x88 ,0x00 , 0x00 ,0x00 , 0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 , 0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 , 0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea , 0xa7 , 0x89 ,0xbe , 0x59 }; gibt Ich rufe die Prüfsummenfunktion als

fprintf (stdout, "% x \ n", ~ Prüfsumme (Paket, sizeof (Paket)));

aber Prüfsummenwert, den ich bekomme, ist ffffd174. Vernachlässigend die ersten 2 Bytes, bekomme ich 7510.

Irgendwelche Ideen, was ich falsch mache? Ich denke, dass es ein Endian-Problem in der Prüfsummenfunktion geben könnte, aber ich habe auch den Pseudo-Header falsch konstruiert.

Antwort

0

Das Problem herausgefunden, also die Korrektur posten, falls jemand anderes danach sucht.

Problem war, wie ich nextheader zu den Eingabedaten zur Prüfsummenfunktion hinzugefügt habe. Ich musste Nextheader mit einem 0x00 Byte voranstellen. Die letzten 32 Bits im Pseudo-Header-Teil sollen Nullen sein, gefolgt vom nächsten Header. Da die ersten 16 Bits nur zu 0 addiert werden, war es ausreichend, nur ein Null-Byte vor dem nächsten Header hinzuzufügen. Die Eingangsdaten für die Prüfsummenfunktion waren also

uint8_t packet[] = { 
      0xfe , 0x80 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, // src 
      0x88 , 0xc5 ,0x75 , 0x41 ,0xaa , 0x0c ,0x58 , 0xee, 
      0xff , 0x02 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00, // dst 
      0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x00 ,0x00 , 0x01, 
      0x00 , 0x20 , // length 32 
      0x00 , 0x3a , // next header 58 
      0x88 , // type 
      0x00 , // code 
      0x00 , 0x00 , // checksum 
      0x20 , 0x00 ,0x00 , 0x00 ,0xfe , 0x80 ,0x00 , 0x00 , // body 
      0x00 , 0x00 ,0x00 , 0x00 ,0x88 , 0xc5 ,0x75 , 0x41 , 
      0xaa , 0x0c ,0x58 , 0xee ,0x02 , 0x01 ,0x38 , 0xea , 
      0xa7 , 0x89 ,0xbe , 0x59 
    }; 
Verwandte Themen