.pcap文件格式的再分析

當你在Windows或者Linux環境下用tcpdump命令抓取數據包時,你將得到如下格式的tcpdump文件:

文件頭| 數據包頭 | 鏈路層數據 | 數據包頭 | 鏈路層數據 | 數據包頭 | 鏈路層數據 |......

1. 文件頭:每一個文件都以一個24字節的文件頭開頭。前四個字節是tcpdump文件標誌“A1 B2 C3 D4”或爲“D4 C3 B2 A1”。

2. 數據包頭 | 鏈路層數據:文件頭之後,就是“數據包頭 | 鏈路層數據”爲一組的這樣一組組數據。

3. 數據包頭長度16個字節,它不是網路上真正傳輸的數據,它包含的信息主要是截獲這個包的時間等信息。數據包頭的第8-11和12-15字節(按編程習慣,第一個字節爲0字節)表示後面鏈路層數據包的長度。8-11字節是其理論長度,12-15字節爲其實際長度,如果存在截斷情況,兩者可能不同。如果在tcpdump命令中使用了 -s 0 參數,則8-11字節和12-15字節應該相等。

從數據包頭結束,到長度指明的字節數爲止,是實際在網絡中傳輸的鏈路層數據包。然後,就是下一個數據包頭。

4. 鏈路層數據

鏈路層數據包格式和傳輸的方式有關:局域網共享上網,則是RFC894以太網協議,少數情況下是RFC 1042和802.3協議;如果是Modem撥號上網,則是RFC 1055的SLIP協議;如果是ADSL,則是RFC 1548的PPP協議。RFC894/RFC 1042/RFC 1548這三種協議的格式都是:

包頭 | IP數據包 |(包尾)

對於RFC894,包頭長度爲14字節; ------>局域網方式上網;

對於RFC1042,包頭長度爲22字節;

對於RFC1548,包頭長度爲5字節;------>ADSL方式上網;

跨過這些包頭字節,就是IP數據包了。

5.IP數據包: IP數據包格式爲: IP包頭 | IP包數據

1)IP包頭的長度:IP包頭的長度由IP包的第0個字節決定,如果應用的是IPv4協議,則IP包頭的第0個字節總是“45”(高四位‘4’表示IPv4協議;低四位爲‘5’,則IP包頭的長度爲 5×4=20字節,頭的長度是以四字節爲單位的)。

2)IP包數據:跨過IP包頭的20個字節,就是IP包數據部分了。

IP包數據部分的長度,由IP包頭的第2-3個字節表示(第一個字節爲第0字節)。

IP包數據部分,也就是UDP部分;

6.UDP包格式: UDP包頭| UDP包數據

1)UDP包頭:固定的8個字節。第4-5字節是UDP包的長度(含8字節包頭);

2)UDP包數據:此部分爲網絡傳送的具體信息,加密、解密等都是處理該部分數據。在處理該部分數據之前,需要先層層剝離出UDP包原始數據。處理過之後,寫入新的文件中時,注意新數據的長度,根據需要重寫數據包頭表示長度的字節、IP包頭中表示長度的字節以及UDP包頭中表示長度的字節,同時要注意寫入時的字節序(大端or小端);

[轉載](ZZ)利用Winpcap的pcap_dump()保存的文件格式

 

pcap_dump()所保存.cap文件格式,應該也是按照tcpdump格式存儲的:

一上來是4字節的文件標示:D4 C3 B2 A1,或者說是一個整數0xA1B2C3D4按照主機序(高位在後低位在前)保存起來了。

接下來的4字節看起來像是版本號,但完全搞不清楚這個版本號是怎麼排的,我的電腦商安裝的是4.1Beta4版,這4個字節是:02 00 04 00。另外,Wireshark識別這一字段時認爲前兩字節是主版本號,我嘗試將這4字節改爲01 00 04 00,再打開文件時報錯說main version 1 unsupported……。

接下來是8字節的00,沒什麼好說的。

再下去是4字節記錄Winpcap抓包時所抓取的數據長度,也就是pcap_open()函數的第二個參數snaplen的值。例如snaplen=65535時,這4字節成爲FF FF 00 00.

然後4字節記錄網絡類型,如十進制1表示以太網,6表示令牌環網,15表示幀中繼硬件格式等等。一般在以太網環境下,這4個字節爲01 00 00 00.

以上幾個字段屬於文件頭部分,接着就是一個一個的數據包了。每個數據包前面還有相應的16字節標記信息,前8字節爲時間戳;然後4字節是捕獲到的數據長度,例如一個數據包實際長度爲60字節,但由於pcap_open()函數的第二個參數snaplen的值設置爲50,所以捕獲到的長度爲50,如果snaplen設置爲65535,那麼捕獲到的長度應爲實際數據包長60;再然後是該數據包的實際長度,用4字節表示;最後是數據包全文,從鏈路層數據開始記錄。一個數據包完了之後是下一個數據包,直到所有數據包記錄結束爲止。實際上就是把抓包函數的兩個參數struct pcap_pkthdr *header和const u_char *pkt_data寫到了文件裏。

只要你看過我的上篇文章,對照一下,你就會對pcap文件格式一目瞭然。

發佈了23 篇原創文章 · 獲贊 18 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章