詳解使用Lua編寫Wireshark的Dissector插件
使用Lua編寫Wireshark的Dissector插件是本文要介紹的內(nèi)容,Dissector 插件可以用來對特定的協(xié)議內(nèi)容進(jìn)行分析展示,在分析自己實現(xiàn)的應(yīng)用層協(xié)議時還是很有用的。 dissector 插件一般用 C 來實現(xiàn),具體如何實現(xiàn)可以參考 Wireshark 代碼目錄下面的 \epan\dissectors 中的源代碼和 plugins 目錄下面的源代碼。
一些簡單的對性能要求不高的 dissector 插件也可以使用 Lua 來實現(xiàn)。 Wireshark 已經(jīng)嵌入了對 Lua 的支持。
下面就是一個簡單的例子:
定義協(xié)議,可以在wireshark中使用trivial過濾
- trivial_proto = Proto("trivial","TRIVIAL","Trivial Protocol")
dissector函數(shù)
- 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")
不對應(yīng)任何數(shù)據(jù)
- subtree:add(buffer(0,0),"Message Header: ")
版本號對應(yīng)于***個字節(jié)
- subtree:add(buffer(0,1),"Version: " .. buffer(0,1):uint())
類型對應(yīng)于第二個字節(jié)
- 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)
從第三個字節(jié)開始是數(shù)據(jù)
- 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 文件,我們就可以抓包測試一下了。
首先請確認(rèn)你的 Wireshark 支持 lua ,如果 Wireshark 目錄下面有 init.lua 文件就說明支持 Lua 。其次需要啟動對 Lua 的支持,默認(rèn)不啟動對 Lua 的支持。編輯 init.lua 文件,注釋掉“ disable_lua = true; ”這一行,然后在文件的***添加一行 dofile("test.lua") ,這樣 Wireshark 啟動時就會自動調(diào)用 test.lua 。也可以在命令行指定需要執(zhí)行的腳本文件, 比如“ wireshark -X lua_script:test.lua ”。
小結(jié):詳解使用Lua編寫Wireshark的Dissector插件的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對你有所幫助!