ICMP Header Probleme



  • Ich baue gerade in mein Netzwerkmodul eine Ping-Funktion ein auf Basis von
    http://www.c-worker.ch/tuts/raw_icmp.php

    Problem ist, dass ich nicht C nutze. Also ich habe das ganze in meiner Sprache nachgebastelt und konnte nun die meisten Fehlerquellen ausschließen. Der Echo Request wird richtig gesendet usw. und dann bleibt er bei recvfrom stehen, wartet das Timeout ab und dann kommt SOCKET_ERROR mit WSAGetLastError() = 0.

    Ich denke, das Problem liegt bei ICMP genauer bei der Checksum. So sieht der Buffer aus, den ich versende:
    http://vertex.dreamfall.at/icmp.gif

    Bzw. nochmal alles unter der Lupe:

    08 00 34 1B DC 07 00 00 05 46 B2 00 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00
    
    Type      = 0x08 -> ECHO_REPLY
    Code      = 0x00
    Checksum  = 0x341B
    ID        = 0xDC07 -> CurrentProcessId()
    Sequency  = 0x0000
    Timestamp = 0x0546 -> GetTickCount()
    Data      = 0xB20048656C6C6F2C20776F726C642100 -> "Hello, world!"
    

    Die Prüfsumme wird so berechnet:
    http://eth0.graegert.com/index.php?page=96#ICMP Header Checksum

    Das habe ich nochmal manuell gemacht:
    Checksum Feld zu 0x0000 setzen, Einer-Komplement bilden:

    08 00 -> F7 FF ->  63487
    00 00 -> FF FF ->  65535
    DC 07 -> 23 F8 ->   9208
    00 00 -> FF FF ->  65535
    05 46 -> FA B9 ->  64185
    B2 00 -> 4D FF ->  19967
    48 65 -> B7 9A ->  47002
    6C 6C -> 93 93 ->  37779
    6F 2C -> 90 D3 ->  37075
    20 77 -> DF 88 ->  57224
    6F 72 -> 90 8D ->  37005
    6C 64 -> 93 9B ->  37787
    21 00 -> DE FF ->  57087
    

    Die ganzen Komplemente nun zusammenaddieren ergibt 598876 dezimal bzw. 10010010001101011100 binär. Die letzten 16 Bit herausfiltern damit das in ein Short passt: 0010001101011100 und dann davon das Einer-Komplement bilden:
    1101110010100011 ergibt 0xDCA3 was von 0x341B abweicht.

    Setze ich 0xDCA3 als Checksumme geht es übrigens auch nicht. Also habe ich mich vllt. auch hier verrechnet.

    Kann mir jemand mit dem C Code die Prüfsumme berechnen? Ist der Header überhaupt richtig aufgebaut?

    mfg olli

    Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping google.de bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.



  • Vertex schrieb:

    Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping google.de bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.

    dann schau dir mal an, was wireshark zu deinen paketen sagt.
    wireshark erkennt auch falsche prüfsummen...
    🙂



  • Hehe, ja, auf die Idee hätte ich wohl kommen müssen ^^ Wireshark hat es angezeigt "Checksum: 0xca14 [incorrect, should be 0x14ca]" es lag also an der Byteorder. Hatte zudem den Pointer immer mit Buffer :+ 2 erhöht dabei hätte es Buffer :+ 1 sein müssen(ich war von 2 ausgegangen, da er ja immer um 2 Byte verschoben werden musste)


Anmelden zum Antworten