{开源项目}之wireshark lua插件websocket内容分析json
lua解析websockets内容为json
-- wireshark lua 分析websocket协议内容为json数据
-- 第一个参数是协议名称会体现在过滤器中
-- 第二个参数是协议的描述信息,无关紧要
local cj=Proto("cj", "cj proto")
--(用于在解析树中的字段定义) base表示以什么方式展现,有base.DEC, base.HEX, base.OCT, base.DEC_HEX, base.DEC_HEX or base.HEX_DEC
local f_proto = ProtoField.uint8("cj.protocol", "Protocol", base.DEC, vs_protos)
local f_dir = ProtoField.uint8("cj.direction", "Direction", base.DEC, { [1] = "incoming", [0] = "outgoing"})
local f_text = ProtoField.string("cj.text", "Text")
-- 将字段添加都协议中
cj.fields = { f_proto, f_dir, f_text }
-- 获取一个数据解析协议
local data_dis = Dissector.get("data")
local fields = {}
local args = {"websocket","data" }
for i, arg in ipairs(args) do
fields[i] = Field.new(arg)
end
--真正的解析处理过程, buf:数据包, pktinfo: 抓包展示列表, tree:协议解析展示树
--[[
pktinfo.cols.protocol:set("rtp-ps") --列表中显示修改
pktinfo.cols.packet_len:set("0")
pktinfo.cols.info:set(info .. ", all length:" .. buf:len() )
tree:add(buf(offset,1), "PES Len:" .. peslen) --没有字段时自定义添加展示树
]]
function cj.dissector(buf, pktinfo, tree)
local iswebsocket=false
local websocketfield={ fields[1]() }
local dataf={ fields[2]() }
if #websocketfield> 0 then
local finfo=dataf[1]
if finfo ~=nil then
local v=finfo.value
local tvbuf=ByteArray.tvb(v)
print(typeof(v), "value:" , v)
pktinfo.cols.protocol:set("CJ")
pktinfo.cols.info="this is cj proto"
local subtree = tree:add(cj, tvbuf)
local json=Dissector.get("json");
json:call(tvbuf, pktinfo, tree)
end
end
end
register_postdissector(cj)
指定端口的协议解析
local udp_port = DissectorTable.get("udp.port") --给UDP端口添加解析协议
udp_port:add(3702, onvif_proto)
```lua
local disstcp=DissectorTable.get("tcp.port") --给tcp端口添加协议
disstcp:add(1234, cj)
遍历解析器
--遍历所有解析器
for k,v in pairs(DissectorTable.list()) do
print(">>" .. v)
end
调用具体的协议进行解析
--子解码器获取
local dis=DissectorTable.get("media_type")
print(typeof(dis))
local dis=dis:get_dissector("image/jpg")
print(typeof(dis))
DissectorTable.get("sctp.ppi"):get_dissector(3), -- m3ua
--c中 register_dissector 的解码器才能通过Dissector获取
dissector_add_string("name","..", handle); 这样的只能通过
DissectorTable.get("name"):get_dissector(..)
register_dissector_table("name") --这里注册到 DissectorTable
dissector_try_uint_new(subdissector_table, low_port, ...) tcp端口协议子解码
--packet-http.c 解析media_type时,获取dissector
dissector_get_string_handle(
media_type_subdissector_table
local list=Field.list() --能获取所有的,很多上万个
]]
具体参考wireshark官网:
https://wiki.wireshark.org/
https://wiki.wireshark.org/Lua
https://wiki.wireshark.org/Lua/Examples
https://wiki.wireshark.org/LuaAPI
全部lua api: https://www.wireshark.org/docs/wsdg_html_chunked/wsluarm_modules.html