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

// TODO: 部份內容須要修改app

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解析表。ui

寫完以後,將foo.lua拷貝到plugins/<版本號>目錄便可,而後用文件打開以前抓的foo協議的Pcap文件foo.pcap。this

 

是的,wireshark沒有提示錯誤,然而什麼變化也沒有:固然,由於咱們沒有編寫實際的解析代碼。編碼

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

 

2. 完善

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

-- 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個參數是字段的全名,另外還有一些可選參數表示進制,掩碼之類,這裏略去。插件

而後編寫具體的解析函數:code

-- 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協議應用顯示過濾器:

相關文章
相關標籤/搜索