2010-11-19 8 views
1

Paket seçeneklerine ulaşmak için http://www.tcpdump.org/sniffex.c10 ile oynayın. (Pointer) (işaretsiz char) hafızasına, TCP başlığınaTCP seçeneklerini (tcphdr-> doff dışında) alma * char eth/ip/tcp packer gösterimi

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. veri + yapı ip noktaları
  2. veri + yapı ip + thdr-> * 4 puan, = başlangıç ​​TCP seçenekleri son yana çıkarma işleminde veri
  3. aşağıdaki yapı göz önüne alındığında

,

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 */ 
}; 

da tcpdump kodundaki bir referans vardır:

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); 

Yani, seçenekler yalan paket, bir kısmını okumak için, bu ihtiyaç vardır:

  1. paket belirtilenden uzunluk bir yapı uzunluğundan daha
  2. Oku N bayt sonra> olduğunu varsayalım (ethernet + ip + tcphdr) yapısının uzunluğu?
  3. Bu baytları kapatın, şimdi yükü okuyun.

Doğru? Sadece gerçek veriler yerine rastgele bir veri yükünün bayt dizisini okumak için beni kurtarır.

cevap

2

Seçenekler, data + sizeof(struct ip) + sizeof(struct tcphdr) ve txt arasındadır. Hiçbir seçenek olmayabilir, bu durumda bu işaretçiler eşit olacaktır.

1

Yorum "// veri uzunluğu?" yanlıştır ve "// bayt olarak TCP başlık uzunluğu" olmalıdır. If (hlen> sizeof (* tp)) stmt, herhangi bir seçenek olup olmadığını kontrol eder ve aynı zamanda rasgele bitlerin TCP başlığı olarak yanlış yorumlandığı durumu ele alır, çünkü TH_OFF() * 4, min. başlığı. Hlen’den ayrılmadan sonra (* tp), şimdi TCP seçeneklerinin boyutunu bayt cinsinden içerir. Kod daha sonra seçenekleri yürümeye devam edebilir. Hiçbir noktada "gerçek veri yerine rastgele bir yükün bayt dizisini" okur ya da en azından ne demek istediğimi vermez ...