{开源项目}wireshark lua插件解析协议包

{开源项目}之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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值