我正在为Wireshark编写一个Lua解剖器,用于复杂的协议。该协议具有包含msgType字段的消息头。我想为每种消息类型编写一个子分解器,每个子分解器存储在单独的源文件中。
我的顶级脚本是general.lua,它解剖消息头并创建解剖器表:
DissectorTable.new("myProtocol.Message")
dofile(DATA_DIR.."cplane.lua")
cplane.lua是消息类型'cplane'的子分解器,并包含以下代码:
my_dissector_table = DissectorTable.get("myProtocol.Message")
my_dissector_table:add(0x02, myProtocol_cplane_proto)
这两个脚本都在Wireshark的插件目录的同一子目录中。
加载插件时出现错误:
Lua: Error during loading:
[string "C:\Program Files (x86)\Wireshark\plugins\2.4...."]:9: bad argument
#1 to 'get' (DissectorTable_get: no such dissector_table)
Lua: Error during loading:
[string "C:\Program Files (x86)\Wireshark\plugins\2.4...."]:170: bad
argument #1 to 'dofile' (dofile: file does not exist)
我该如何解决?问题与脚本的加载顺序有关吗?是否需要dofile()调用?
答案 0 :(得分:1)
由于插件目录中的所有脚本均已加载,因此不必使用dofile
。但是,加载顺序不是固定的(至少没有记录为固定的)。目前,Lua插件是在其他解剖器之后加载的,因此尝试在“全局范围”中查找解剖器表仅适用于内置解剖器,例如tcp.port
:
local myproto = Proto("myproto", "My Protocol")
function myproto.dissector(tvb, pinfo, tree)
...
end
-- Register with a built-in dissector table
DissectorTable.get("tcp.port"):add(1234, myproto)
要使用自定义解剖器表进行注册,必须推迟此注册。在C解剖器中,您可以将注册放入proto_reg_handoff_PROTOABBREV
(其中PROTOABBREV
应该相应地替换),但是在Lua中则没有这样的功能。
您可以得到的最接近的是“ init”例程(Proto
类的属性,proto.init
)。在剖析任何数据包之前,打开捕获文件时将调用这些方法。示例:
function myproto.init()
DissectorTable.get("your-custom-table"):add(1234, myproto)
end
答案 1 :(得分:0)
Lua: Error during loading: [string "C:\Program Files (x86)\Wireshark\plugins\2.4...."]:9: bad argument #1 to 'get' (DissectorTable_get: no such dissector_table)
答案:此错误意味着找不到Dissector表。原因可能是路径不正确或文件执行的顺序。
Lua: Error during loading: [string "C:\Program Files (x86)\Wireshark\plugins\2.4...."]:170: bad argument #1 to 'dofile' (dofile: file does not exist)
答案:对我来说,输入完全正确的路径可以消除此错误