pcap文件格式和wireshark解析


pcap文件頭

pcap文件頭參見官方說明 http://www.winpcap.org/docs/docs_412/html/structpcap__file__header.html

用python代碼表達結構如下,I是32位無符號數,下面的定義均采用32位方式

# bpf_u_int32 magic;  固定為0xA1B2C3D4,表示pcap包文件
# u_short version_major; 主版本號
# u_short version_minor; 分支版本號
# bpf_int32 thiszone; 時區
# bpf_u_int32 sigfigs;
# bpf_u_int32 snaplen; 每個包的最大長度
# bpf_u_int32 linktype; 鏈路層協議族
self.struct_pcap_file_header = '!I2H4I'
 

pcap每個包的頭

參見  http://www.winpcap.org/docs/docs_412/html/structpcap__pkthdr.html
# struct timeval ts;
# bpf_u_int32 caplen;
# bpf_u_int32 len;
self.struct_pcap_pkthdr = '!4I'
timeval是c的時間戳結構體,前面一個整型數是秒數偏置,后面一個整型數是微秒偏置,詳情可以查閱相關文檔
 

生成pcap文件

使用python簡單生成,寫入到test.pcap文件,寫入了兩個包到該文件,linktype設置為162,在wireshark源碼中表示保留給用戶的USER15 類型

# -*-coding:utf-8-*- 
"""
Author:yinshunyao
Date:2017/3/24 0024上午 10:47
"""
import unittest
import struct


class PacpTest(unittest.TestCase):
def setUp(self):
# pcap文件頭格式
# http://www.winpcap.org/docs/docs_412/html/structpcap__file__header.html
# bpf_u_int32 magic; 固定為0xA1B2C3D4,表示pcap包文件
# u_short version_major; 主版本號
# u_short version_minor; 分支版本號
# bpf_int32 thiszone; 時區
# bpf_u_int32 sigfigs;
# bpf_u_int32 snaplen; 每個包的最大長度
# bpf_u_int32 linktype; 鏈路層協議族
self.struct_pcap_file_header = '!I2H4I'
# pcap包頭格式
# http://www.winpcap.org/docs/docs_412/html/structpcap__pkthdr.html
# struct timeval ts;
# bpf_u_int32 caplen;
# bpf_u_int32 len;
self.struct_pcap_pkthdr = '!4I'

# 文件頭
self.file_header = struct.pack(
self.struct_pcap_file_header,
0xA1B2C3D4, 4, 1, 0, 0, 0xFFFF, 162 # USER15
)

def test_generate_pcap(self):
# 消息體內容
pkg_content1 = struct.pack('!2I', 100, 101)
pkg_content2 = struct.pack('!2I', 101, 100)
#
pkg_header = struct.pack(
self.struct_pcap_pkthdr, 0x4A5B1784, 0x00081C6D,
len(pkg_content1), len(pkg_content1)
)
with open('test.pcap', 'wb') as test:
test.write(self.file_header+pkg_header+pkg_content1+pkg_header+pkg_content2)

wireshark解析效果

用自定義的wireshark插件協議解析整體效果如下,后面具體介紹插件內容,可以看到Encapsulation type字段值是60,協議是USER15

這個值跟前面文件頭里面的link162的映射關系,在wireshark中完成,具體處理可以查看wireshark的C源碼。

協議名稱和消息體解析,需要捕獲這個數據流在自定義的協議插件中處理,下一章會提到。

兩個包的時間戳一樣,是因為前面寫入文件的包頭是一樣的。

image

wireshark lu解析腳本

    local serial_encap_table = DissectorTable.get("wtap_encap")
    --截取所有的bsap協議
    --USER0~USER15是45到60,可以自定義解析,參見源碼wtap.h
    serial_encap_table:add(60, p_bsap)

上面兩行代碼,截取type為60的文件和包進行解析。p_bsap是自定義的解析插件,詳細的使用方法和語言基礎參見wireshark的官方文檔lu部分

do
    --協議名稱是BSAP, 在Packet Details窗格顯示為
    local p_bsap = Proto("bsap2","Bristol Standard Asynchronous Protocol")
   
   
    --頭協議各個字段含義,需要放到此處注冊
    local f_src = ProtoField.uint32("bsap2.src","Source", base.DEC)
    local f_des = ProtoField.uint32("bsap2.des","Destination", base.DEC)
    p_bsap.fields = {f_src, f_des}   
   
    --指紋信息協議
    local p_finger = Proto("BSAP_FR", "BSAP Device Information")
   
    --獲取數據
    local data = Dissector.get("data")
   
    local device = {}
   
    local offset = 0
   
    --數據分析函數
    local function bsap_dissector(buf,pkg,root)
        local buf_len = buf:len()
        -- 協議信息展示a
        pkg.cols.protocol = "BSAP2"
        --添加頭
        local header = root:add(p_bsap, buf)   
        header:add(f_src, buf(0,4))
        header:add(f_des, buf(4,4))
        device = {['Source']=buf(0,4):uint()}
        pkg.cols.info = "Message: src is "..tostring(device['Source'])
        offset = buf_len
        return true
    end   
   
    --解析函數,注意,該function前面不能添加local
    function p_bsap.dissector(buf,pkg,root)
        --如果解析符合本協議
        if bsap_dissector(buf,pkg,root) then
            --有效的協議,未處理完的字段調用其他協議繼續解析
            local buf_len = buf:len()
            if offset + 1 < buf_len then
                data:call(buf(offset, buf_len-offset), pkg, root)
            end
           
        --如果解析不符合本協議,返回給主程序繼續遍歷其他協議
        else
            data:call(buf,pkg,root)
        end
    end
   
    local serial_encap_table = DissectorTable.get("wtap_encap")
    --截取所有的bsap協議
    --USER0~USER15是45到60,可以自定義解析,參見源碼wtap.h
    serial_encap_table:add(60, p_bsap)
end

 

 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM