1

http://www.tcpdump.org/sniffex.cをいじって、パケットオプションを取得します。

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. data + struct ipは、(ポインタ)(unsigned char)メモリ内のTCPヘッダーを指します
  2. data + struct ip + thdr-> doff*4はTCPオプションの終わりを指します=データの始まり

次の構造を考えると、

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

また、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);

したがって、オプションが存在するパケットの一部を読み取るには、次のことを行う必要があります。

  1. パケットで指定された長さが構造体の長さよりも大きいと想定します
  2. (ethernet + ip + tcphdr)構造体の長さの後にNバイトを読み取りますか?
  3. それらのバイトを削除し、ペイロードを読み取ります。

正しい?実際のデータの代わりにランダムなペイロードのバイトシーケンスを読み取ることは、単に私を沸騰させます。

4

2 に答える 2

2

オプションはとの間data + sizeof(struct ip) + sizeof(struct tcphdr)にありtxtます。オプションがない場合、これらのポインタは等しくなります。

于 2010-11-19T04:12:16.833 に答える
1

コメント「//データ長?」は正しくないため、「// TCPヘッダーの長さ(バイト単位)」である必要があります。if(hlen> sizeof(* tp))stmtは、オプションがあるかどうかをチェックし、ランダムビットがTCPヘッダーとして誤って解釈された場合も処理します。これは、TH_OFF()*4が最小サイズよりも小さくなる可能性があるためです。ヘッダ。hlenからsizeof(* tp)を減算すると、TCPオプションのサイズがバイト単位で含まれるようになります。その後、コードはオプションのウォークに進むことができます。「実際のデータの代わりにランダムなペイロードのバイトシーケンス」を読み取ることは決してありません。少なくとも、あなたが何を意味していると思うかはわかりません。

于 2010-11-19T05:25:05.197 に答える