CAP文件是比較通用的一種文件格式,基本上大多數抓包軟件都支持以此格式將捕獲的網絡數據包存儲下來。
需要說明的是,CAP文件存儲下來的,一般都是網絡數據幀。不同網絡傳輸協議下的幀格式是有差異的,所以這里以以太網幀作討論。我所
分析的CAP包是由ethereal抓取的。tcpdump和windump抓的包格式基本一致。CAP文件是全十六進制數據文件而不是文本文件,所以其結構需要分析,由於我並不打算做專門的分析軟件,所以我只作對我來說有意義的
一些數據的分析。CAP里面的數據有些地方是和我們常規數據的順序一樣的,有些位置是標准的高位取反,根據該位置表示的數據類型確定。
CAP文件的前24個16進制位是頭文件相關的信息我們不用關心,隨后緊跟的八個位(后面所有的位都指兩個16進制數構成的一個十六進制位,如AC,B8就是兩個
16進制位),是抓包的時間戳標記,里面應該包括了年月日和具體到毫秒級別的時間,前4位高低位的互換再乘1000可得到當前的時間精確到秒,后4位是微妙,算法同前面。
隨后的8個位是比較重要的,其中前4個是我們抓取到的數據幀長度,同時也關系到我們如何在CAP文件中得到下一組數據幀位置。這四個位
每個的前兩位高位取反后表示數據幀的長度,第一組是軟件抓取到的數據幀長度,后面一組是網絡中實際數據幀的長度。一般來說第一組小於
等於第二組數據。這八個位結束后,就是幀的具體內容,長度就是前面的第一組數,這個長度的后面,就是CAP存的下一組幀數據,也就是說,
CAP文件里面並沒有規定捕獲的幀數據之間有什么間隔字符串,我們需要靠第一組數確定,下一組數據在文件中的起始位置。
下面的內容其實應該算是TCP/IP書里的標准內容,不過我還是繼續寫吧。
我們接着講后面負載的內容,6位的目標MAC地址,6位的源MAC地址,然后二位是三層協議類型,一般來說,我們關心的可能只有0800這代
表IP,隨后一位是IP協議的版本號,45表示的是V4版本,后一位是差分服務表示位,然后兩位是IP包長度,這一長度包括了IP包頭,隨后兩位
是鑒別代碼,隨后的標志第一個是數據分段標志,表示是否對數據進行分拆,00表示沒有設置,40表示設置為不拆分。隨后一位是拆分偏移量,
對於沒有拆分的數據沒有意義就是00。隨后一位有名的time to live值,不用多說,隨后一位是四層協議類型,TCP就是06,UDP是11,隨后兩
位是頭校驗碼,知道的人都懂。
隨后四位就是我們的源IP地址,接着四位是目標IP地址,這8位也是屬於IP包頭的。隨后兩位是源端口,接着兩位是目的端口(不管是TCP
還是UDP)
下面要區分的說,如果是TCP的話,
隨后的兩個四位數據分別是會話序號和回應序號,如果回應序號為0,很多時候意味着這是一個SYN,不過SYN專門有標志。接下來一位是
TCP包頭長度。這個長度由源端口開始算。再接下來一位就是應答標志位,如果是02表示是SYN,如果是12則表示是SYN,ACK,如果是10則表示
是ACK。然后的兩位是WINDOW SIZE,然后兩位是TCP包頭的校驗。
再接下來就是TCP包的負載內容了,這根據上層應用來說就更為復雜,這里不詳細討論。
接着說,如果是UDP包,端口號過了直接就是包負載長度兩位長和UDP包頭校驗碼兩位長,然后就是UDP包負載的內容了。
如何將抓取的文件保存到本地?
tcpdump tcp port 5432 -w ./postgres.cap
如何查看.cap文件?
tcpdump -r data8080.cap