2010-11-19 10 views
1

Jouer avec http://www.tcpdump.org/sniffex.c pour obtenir des options de paquet.Obtention des options TCP (au-delà de tcphdr-> doff) à partir de la représentation * char eth/ip/tcp packer

void payload (char *data) { // data contains full copied packet source without ethernet header. 
char *ptr = NULL; 
//ptr = data; 
//struct ip *pip = (struct ip *) ptr; 

ptr = data + sizeof(struct ip); 
struct tcphdr *thdr = (struct tcphdr *) ptr; 

ptr = data + sizeof(struct ip) + (thdr->doff*4); 
char *txt = (char *) ptr; 
// *txt can be fprint/cout'ed, returned OK. 
} 
  1. données + de points ip struct à en-tête TCP dans (pointeur) (unsigned char) mémoire
  2. données + struct ip + thdr-> Doff * 4 points pour terminer des options TCP = de début de la données

Compte tenu de la structure suivante,

typedef u_int tcp_seq; 

struct sniff_tcp { 
     u_short th_sport;    /* source port */ 
     u_short th_dport;    /* destination port */ 
     tcp_seq th_seq;     /* sequence number */ 
     tcp_seq th_ack;     /* acknowledgement number */ 
     u_char th_offx2;    /* data offset, rsvd */ 
#define TH_OFF(th)  (((th)->th_offx2 & 0xf0) >> 4) 
     u_char th_flags; 
     #define TH_FIN 0x01 
     #define TH_SYN 0x02 
     #define TH_RST 0x04 
     #define TH_PUSH 0x08 
     #define TH_ACK 0x10 
     #define TH_URG 0x20 
     #define TH_ECE 0x40 
     #define TH_CWR 0x80 
     #define TH_FLAGS  (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR) 
     u_short th_win;     /* window */ 
     u_short th_sum;     /* checksum */ 
     u_short th_urp;     /* urgent pointer */ 
}; 

il y a également une référence dans le code TCPDump:

tp = (struct tcphdr *)bp; // packet header. 
    hlen = TH_OFF(tp) * 4; // data length? 

    if (hlen > sizeof(*tp)) { 
       register const u_char *cp; 
       register u_int i, opt, datalen; 
       register u_int len; 
       hlen -= sizeof(*tp); 

Ainsi, pour lire une partie du paquet, où les options se trouvent, il est nécessaire de:

  1. On suppose que la longueur spécifiée dans le paquet est> une longueur de la structure
  2. octets Lire N après (ethernet + ip + tcphdr) longueur de la structure?
  3. Supprimez ces octets, lisez maintenant la charge utile.

Correct? Il me suffit de lire la séquence d'octets d'une charge utile au lieu de données réelles.

Répondre

2

Les options sont comprises entre data + sizeof(struct ip) + sizeof(struct tcphdr) et txt. Il peut n'y avoir aucune option, auquel cas ces pointeurs seront égaux.

1

Le commentaire "// longueur des données?" est incorrect et devrait être "// longueur d'en-tête TCP en octets". Le if (hlen> sizeof (* tp)) stmt vérifie s'il y a des options et gère également le cas où les bits aléatoires sont interprétés comme un entête TCP, car cela peut produire un TH_OFF() * 4 inférieur à la taille min du entête. Après avoir déduit sizeof (* tp) de hlen, il contient maintenant la taille des options TCP en octets. Le code peut ensuite procéder à la marche des options. À aucun moment, il ne lit "une séquence d'octets de données utiles au lieu de données réelles", ou du moins pas ce que je pense que vous voulez dire ...