问题描述
我正在为自定义协议编写一个wireshark解剖器。该协议有两个变体,在查看转储时通常无法区分。所以通常用户会简单地选择正确的变体进行解码。
这两个变体共享相当多的 ProtoField
和很多结构,这就是为什么我希望只编写一次大部分解剖代码,然后有两个顶级解剖器调用这些组件。
粗略的想法是:
local custom_var1 = Proto("custom_var1","My custom protocol Variant 1")
local custom_var2 = Proto("custom_var2","My custom protocol Variant 2")
-- my actual header and data blocks are a lot more complex than single integers of course
local header = ProtoField.uint8("custom.head","Header")
local data1 = ProtoField.uint64("custom.data1","Data 1")
local data2 = ProtoField.uint32("custom.data2","Data 2")
local data3 = ProtoField.uint8("custom.data3","Data 3")
custom_var1.fields = {header,data1,data2}
custom_var2.fields = {header,data2,data3}
local function dissect_header(tvb,tree)
tree:add(header,tvb(0,1))
end
local function dissect_data1(tvb,tree)
tree:add(data1,8))
end
local function dissect_data2(tvb,tree)
tree:add(data2,4))
end
local function dissect_data3(tvb,tree)
tree:add(data3,1))
end
function custom_var1.dissector(tvb,pinfo,root)
pinfo.cols.protocol:set(custom_var1.name)
local tree = root:add(custom_var1,13))
dissect_header(tvb(0),tree)
dissect_data1(tvb(1),tree)
dissect_data2(tvb(9),tree)
end
function custom_var2.dissector(tvb,root)
pinfo.cols.protocol:set(custom_var2.name)
local tree = root:add(custom_var2,14))
dissect_header(tvb(0),tree)
dissect_data2(tvb(1),tree)
dissect_data1(tvb(5),tree)
dissect_data3(tvb(13),tree)
end
tcp_port = DissectorTable.get("tcp.port")
tcp_port:add(31337,custom_var1)
tcp_port:add(31337,custom_var2)
我的问题:当我将lua文件放入我的插件目录并启动wireshark时,我看到一个带有Wireshark Debug Console
消息的18:08:56.505 Err LUA PANIC: fields can be registered only once
(黑色背景而不是白色,带有lua控制台)在我可以做任何其他事情之前,跟着 Press any key to exit
。按下一个键后,wireshark立即存在。
如何编写两个共享字段的解剖器,而不会有太多代码重复?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)