ho dato solo una occhiata sommaria al tuo codice...
Il campo doff (data offset) prelevato dall'header tcp è composto da 4 bit e contiene la lunghezza dell'header (option comprese) espressa in unità di 32-bit (4 byte). Questo significa che l'header (option comprese) è lungo (4*doff) bytes.
Detto questo mi sembra che il calcolo dell'inizio dei dati sia totalmente sbagliato nel tuo codice.
Tu scrivi:
che non ha senso perchè consideri due volte l'header tcp, calcolandolo comunque in modo errato.codice:unsigned int startdata = m+sizeof(struct iphdr)+sizeof(struct tcphdr)+tcp->doff;
Premetto che non ho verificato praticamente ma il codice esatto dovrebbe essere:
infatti sommi la lunghezza dell'header ip (fisso) + lunghezza header tcp (variabile a causa delle option)codice:unsigned int startdata = m+sizeof(struct iphdr)+4*tcp->doff;
L'unica parte variabile dell'header sono le option. Se queste esistono sono posizionate subito prima dei dati.
Se non ci fossero option l'header sarebbe lungo esattamente 20 byte.
Se (4*tcp->doff)>20 (ovvero se (tcp->doff)>5 ) sei sicuro che ci sono delle option e che queste cominciano da
Il campo option non è definito nel tuo header per cui devi accedervi in modo manuale...codice:unsigned int startoptions = m+sizeof(struct iphdr)+20;
Da startoptions fino a (startdata-1)
Ripeto, non ho verificato se funziona esattamente... ma dovrebbe essere così

Rispondi quotando