一.簡介
pcap文件是常用的數據報存儲格式,可以理解為就是一種文件格式,只不過里面的數據是按照特定格式存儲的,所以我們想要解析里面的數據,也必須按照一定的格式。普通的記事本打開pcap文件顯示的是亂碼,用安裝了HEX-Editor插件的Notepad++打開,能夠以16進制數據的格式顯示,用wireshark這種抓包工具就可以正常打開這種文件,愉快地查看里面的網絡數據報了,同時wireshark也可以生成這種格式的文件。當然這些工具只是我經常使用的,還有很多其它能夠查看pcap文件的工具。
二.pcap文件格式
如上圖所示,pcap文件的總體結構就是文件頭-數據包頭1-數據包1-數據包頭2-數據包2等形式,為什么要這么設計,看完下面的你就懂了。
1.Pcap Header
文件頭,每一個pcap文件只有一個文件頭,總共占24(B)字節,以下是總共7個字段的含義。
Magic(4B):標記文件開始,並用來識別文件和字節順序。值可以為0xa1b2c3d4或者0xd4c3b2a1,如果是0xa1b2c3d4表示是大端模式,按照原來的順序一個字節一個字節的讀,如果是0xd4c3b2a1表示小端模式,下面的字節都要交換順序。現在的電腦大部分是小端模式。
Major(2B):當前文件的主要版本號,一般為0x0200
Minor(2B):當前文件的次要版本號,一般為0x0400
ThisZone(4B):當地的標准事件,如果用的是GMT則全零,一般全零
SigFigs(4B):時間戳的精度,一般為全零
SnapLen(4B):最大的存儲長度,設置所抓獲的數據包的最大長度,如果所有數據包都要抓獲,將值設置為65535
LinkType(4B):鏈路類型。解析數據包首先要判斷它的LinkType,所以這個值很重要。一般的值為1,即以太網
常用的LinkType(鏈路類型):
0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 "raw IP", with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux "cooked" capture
114 LocalTalk
2.Packet Header
數據包頭可以有多個,每個數據包頭后面都跟着真正的數據包。以下是Packet Header的4個字段含義
Timestamp(4B):時間戳高位,精確到seconds,這是Unix時間戳。捕獲數據包的時間一般是根據這個值
Timestamp(4B):時間戳低位,能夠精確到microseconds
Caplen(4B):當前數據區的長度,即抓取到的數據幀長度,由此可以得到下一個數據幀的位置。
Len(4B):離線數據長度,網路中實際數據幀的長度,一般不大於Caplen,多數情況下和Caplen值一樣
3.Packet Data
Packet是鏈路層的數據幀,長度就是Packet Header中定義的Caplen值,所以每個Packet Header后面都跟着Caplen長度的Packet Data。也就是說pcap文件並沒有規定捕獲的數據幀之間有什么間隔字符串。Packet數據幀部分的格式就是標准的網絡協議格式了。
最后來個實例,pcap文件的16進制格式
紅色部分是Pcap Header,藍色部分是Packet Header,當然這是從pcap文件的起始部分開始的。希望別嫌棄這扭曲的線條
Pcap Header的Magic:d4 c3 b2 a1,表示是小端模式,后面的字節從后往前讀。
Pcap Header的Major:02 00,計算機讀的應該是00 02。最大存儲長度SnapLen:ff ff 00 00 ,同理計算機讀的應該是00 00 ff ff,所以是2的16次方減一,是65535個字節。LinkType:01 00 00 00 ,實際是00 00 00 01,是以太網類型。
藍色部分的Packet Header我就不一一說了,重點關注Caplen:c5 01 00 00,計算機讀的是00 00 01 c5,轉換成十進制就是453,所以后面的453個字節都是一個數據幀。之后就又是一個Pcap Header,如此循環。
同樣的文件用wireshark打開看一下:
可以看到第一個數據幀,就是453個字節。還可以看底下的數據幀的16進制原始數據和上面藍色部分之后的數據是不是一樣。