使用lua編寫Wireshark(Ethereal)的dissector插件
dissector插件可以用來對特定的協議內容進行分析展示,在分析自己實現的應用層協議時還是很有用的。dissector插件一般用C來實現,具體如何實現可以參考Wireshark代碼目錄下面的/epan/dissectors中的源代碼和plugins目錄下面的源代碼。 一些簡單的對性能要求不高的dissector插件也可以使用Lua來實現。Wireshark已經嵌入了對Lua的支持。下面就是一個簡單的例子:
-- 定義協議,可以在wireshark中使用trivial過濾
trivial_proto = Proto("trivial","TRIVIAL","Trivial Protocol")
-- dissector函數
function trivial_proto.dissector(buffer,pinfo,tree)
--pinfo的成員可以參考用戶手冊
pinfo.cols.protocol = "TRIVIAL"
pinfo.cols.info = "TRIVIAL data"
local subtree = tree:add(trivial_proto,buffer(),"Trivial Protocol")
--不對應任何數據
subtree:add(buffer(0,0),"Message Header: ")
--版本號對應於第一個字節
subtree:add(buffer(0,1),"Version: " .. buffer(0,1):uint())
--類型對應於第二個字節
type = buffer(1,1):uint()
type_str = "Unknown"
if type == 1 then
type_str = "REQUEST"
elseif type == 2 then
type_str = "RESPONSE"
end
subtree:add(buffer(1,1), "Type: " .. type_str)
--從第三個字節開始是數據
size = buffer:len()
subtree:add(buffer(2,size-2), "Data: ")
end
tcp_table = DissectorTable.get("tcp.port")
--註冊到tcp的8888端口
tcp_table:add(8888,trivial_proto)
插件編寫完成後保持爲test.lua文件,我們就可以抓包測試一下了。首先請確認你的Wireshark支持lua,如果Wireshark目錄下面有init.lua文件就說明支持Lua。其次需要啓動對Lua的支持,默認不啓動對Lua的支持。編輯init.lua文件,註釋掉“disable_lua = true;”這一行,然後在文件的最後添加一行dofile("test.lua"),這樣Wireshark啓動時就會自動調用test.lua。也可以在命令行指定需要執行的腳本文件, 比如“wireshark -X lua_script:test.lua”。