checksumme berechnen...



  • Hallo,
    ich hab ein Programm geschrieben das mit Raw-Sockets arbeitet. Nun bekomm ich leider keine Antwort-Pakete zurück. zB: Syn wird versendet, nix kommt zurück(Ack sollte wieder her kommen). tcpdump gibt mir nun das aus:
    source.3045 > target.5000: S [bad tcp cksum f1d4!] 134123412:134123412 usw...

    Daraus schließe ich das die tcp_checksumme nicht richtig ist oder die Funktion nicht richtig rechnet.

    So berechne ich die Ip_checksumme:

    u_short in_checksum(u_short *addr, int len)
    {
    u_short i = 0;
    u_short *word = addr;
    u_long acc = 0;

    while(i++ < len / 2)
    acc += *(word++);

    return ~((u_short)&acc + ((u_short)&acc +1));
    }

    und so die Tcp_checksumme(methode aus einer Klasse):

    u_short tcp_checksum()
    {
    char header[32], *p = header;
    (unsigned long)p = send_ip->saddr;
    p += 4;
    (unsigned long)p = send_ip->daddr;
    *p = 0;
    p++;
    p = send_ip->protocol;
    p++;
    (unsigned short)p = htons(4 * send_tcp->doff);
    p+=2;
    memcpy(p, send_tcp, 4 * send_tcp->doff);
    return in_checksum((unsigned short
    )header, 32);
    }

    Implementierungen:

    send_ip->check = in_checksum( (unsigned short*)send_ip, sizeof(*send_ip));
    ........
    ........
    ........
    send_tcp->check = 0;
    send_tcp->check = this->tcp_checksum();

    Die beiden Checksummen-Funktionen hab ich aus dem Netz und versteh sie nicht wirklich. Kann mir mal einer bitte erklären was es mit diesen Checksummen auf sich hat? Und was stimmt denn mit meinen Checksummen nicht????



  • Abend.

    Schau dir mal RFC 1071 an. Abschnitt "4. Implementation Examples", "C".



  • N'abend patrick++, heute nicht auf ner Feier? 😞



  • Was geht das dich an?

    Ausserdem bin ich Krank *ausrede such*



  • Sorry, war nur irgendwie besorgt, das mit dir irgendwas nicht stimmt. Weil sonst bist du ja jedes Wochenende auf irgendwelchen verrückten Feten. :p



  • Was bei meiner tcp-checksumme nicht stimmt konnte ich bis jetzt noch immer nicht rausfinden. Ich testete mein Programm mit den verschiedentsten Ip-Checksummen-Funktionen aber es kommt immer wieder der selbe fehler: bad cksum!



  • hast du die tcp daten mitberechnet?



  • Wie es aussieht(siehe oben) hab ich die Daten nicht mitgerechnet.



  • Ich denke ich hab das Problem gefunden. In meinem Programm ist es möglich die Ip der zu versendenden Pakete manuell einzustellen(wenn man will). Tut man dies nicht dann ist die Checksumme falsch. Gibt man die Ip manuell an dann ist sie richtig. Wie löse ich nun dieses Problem? Gibts irgendwie eine möglichkeit die eigene Ip auszulesen? Ich hab übrigens eine dynamische Ip.



  • Dumme Frage: Wieso willst du eigentlich die Checksume per Hand kalkulieren?
    Der Kernel erledigt das normalerweise sowas für dich.



  • Ich dachte immer ich muß die Checksumme berechnen wenn ich meine eigenen Pakete versenden will. Das Programm soll Pakete mit den verschiedensten Flags(RST,PSH,ACK,FIN,usw) versenden. Lass ich den Teil wo man die Checksumme berechnet aus so wird auch keine berrechnet und tcpdump kann dann auch wieder die Fehlermeldung ausgeben(bad tcp cksum).



  • Also hat niemand eine Idee wie man an seine eigene Ip herankommt? (Außer einem häßlichem Script mit ifconfig und grep).


Anmelden zum Antworten