2012年2月6日 星期一

pcap檔案格式


pcap檔案格式是bpf保存原始資料包的格式,很多軟體都在使用,比如tcpdumpwireshark等等,
瞭解pcap格式可以加深對原始資料包的瞭解,自己也可以手工構造任意的資料包進行測試。

pcap檔的格式為:
  檔頭    24位元組
  資料包頭 + 資料包  資料包頭為16位元組,後面緊跟資料包
  資料包頭 + 資料包  ……

pcap.h裡定義了檔頭的格式
struct pcap_file_header {
        bpf_u_int32 magic;
        u_short version_major;
        u_short version_minor;
        bpf_int32 thiszone;     /* gmt to local correction */
        bpf_u_int32 sigfigs;    /* accuracy of timestamps */
        bpf_u_int32 snaplen;    /* max length saved portion of each pkt */
        bpf_u_int32 linktype;   /* data link type (LINKTYPE_*) */
};
看一下各欄位的含義:
 magic   4位元組 pcap檔標識 目前為“d4 c3 b2 a1”
 major   2位元組 主版本號     #define PCAP_VERSION_MAJOR 2
 minor   2位元組 次版本號     #define PCAP_VERSION_MINOR 4
 thiszone4位元組 時區修正     並未使用,目前全為0
 sigfigs 4位元組 精確時間戳記   並未使用,目前全為0
 snaplen 4位元組 抓包最大長度 如果要抓全,設為0x0000ffff65535),
          tcpdump -s 0就是設置這個參數,缺省為68位元組
 linktype4位元組 鏈路類型    一般都是1ethernet

|    magic    |major  | minor |   thiszone  |   sigfigs   |   snaplen   |  linktype   |
| d4 c3 b2 a1 | 02 00 | 04 00 | 00 00 00 00 | 00 00 00 00 | ff ff 00 00 | 01 00 00 00 |

資料包頭的格式
struct pcap_pkthdr {
        struct timeval ts;      /* time stamp */
        bpf_u_int32 caplen;     /* length of portion present */
        bpf_u_int32 len;        /* length this packet (off wire) */
};
struct timeval {
        long            tv_sec;         /* seconds (XXX should be time_t) */
        suseconds_t     tv_usec;        /* and microseconds */
};
 ts    8位元組 抓包時間 4位元組表示秒數,4位元組表示微秒數
 caplen4位元組 保存下來的包長度(最多是snaplen,比如68位元組)
 len   4位元組 資料包的真實長度,如果檔中保存的不是完整資料包,可能比caplen

瞭解了pcap檔案格式,就可以自己手工構造任意資料包了,可以以錄好的包為基礎,
用十六進位編輯器打開進行修改。

沒有留言: