// TODO: 部份內容須要修改app
首先新建一個文件,命名爲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
下面須要寫一些具體的代碼,首先是定義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協議應用顯示過濾器: