【wireshark】插件開發(三):Lua插件 Dissector


// TODO: 部分內容需要修改

1. 骨架

首先新建一個文件,命名為foo.lua,注意此文件的編碼方式不能是帶BOM的UTF8,否則wireshark加載它時會出錯(不識別BOM):

-- @brief Foo Protocol dissector plugin
-- @author zzq
-- @date 2015.08.12

-- create a new dissector
local NAME = "foo"
local PORT = 9877
local foo = Proto(NAME, "Foo Protocol")


-- dissect packet
function foo.dissector (tvb, pinfo, tree)
end

-- register this dissector
DissectorTable.get("udp.port"):add(PORT, foo)

這是一個lua解析器的骨架:創建解析器對象、解析器函數、將解析器注冊到wireshark解析表。

寫完之后,將foo.lua拷貝到plugins/<版本號>目錄即可,然后用文件打開之前抓的foo協議的Pcap文件foo.pcap。

 

是的,wireshark沒有提示錯誤,然而什么變化也沒有:當然,因為我們沒有編寫實際的解析代碼。

依次打開”Internals”、”Dissector tables“菜單,選中”Interger tables”標簽頁,下拉滾動條,找到“UDP port“樹節點,展開,再往下來,會發現FOO協議赫然在列,證明foo插件確實被正確加載了:

 

2. 完善

下面需要寫一些具體的代碼,首先是定義foo協議的各個字段:

-- create fields of foo
local fields = foo.fields
fields.type = ProtoField.uint8 (NAME .. ".type", "Type")
fields.flags = ProtoField.uint8 (NAME .. ".flags", "Flags")
fields.seqno = ProtoField.uint16(NAME .. ".seqno", "Seq No.")
fields.ipaddr = ProtoField.ipv4(NAME .. ".ipaddr", "IPv4 Address")

根據foo協議字段類型的不同,分別調用ProtoField的不同方法創建它們,其中第一個參數是字段的縮寫,第2個參數是字段的全名,另外還有一些可選參數表示進制,掩碼之類,這里略去。

然后編寫具體的解析函數:

-- dissect packet
function foo.dissector (tvb, pinfo, tree)
    local subtree = tree:add(foo, tvb())
    local offset = 0
    
    -- show protocol name in protocol column
    pinfo.cols.protocol = foo.name
    
    -- dissect field one by one, and add to protocol tree
    local type = tvb(offset, 1)
    subtree:add(fields.type, type)
    subtree:append_text(", type: " .. type:uint())
    offset = offset + 1
    
    subtree:add(fields.flags, tvb(offset, 1))
    offset = offset + 1
    subtree:add(fields.seqno, tvb(offset, 2))
    offset = offset + 2
    subtree:add(fields.ipaddr, tvb(offset, 4))
end

wireshark約定解析器函數接口有3個參數,第一個是報文數據buffer tvb,第2個是報文信息結構pinfo,第3個是協議解析樹tree。

subtree = tree:add(foo, tvb())為foo協議往協議解析樹上添加了一個新節點subtree;

pinfo.cols.protocol = foo.name把wireshark報文列表上的”Protocol“列的文本置為foo協議名稱”Foo”;

接下來,根據Foo協議的規范依次解析各字段,並把它們的信息加入到協議解析樹。

編寫完成后把新的foo.lua拷貝到插件目錄,重啟wireshark打開foo.pcap,顯示效果如下:

也可以對foo協議應用顯示過濾器:

 


免責聲明!

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



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