我已经在Wireshark社区(Link)发布了这个问题,目前还没有答案。
我在Lua中编写了一堆解析器,到目前为止我在Wireshark GUI中使用过 - 现在我想将它们与tshark一起使用(在Windows 10下)。问题是我的一个解剖器在tshark中调用时不起作用(即使它被初始化)。即使所有其他解剖器工作正常,tshark根本不会输出任何数据包。我用其他一个解剖器打电话给解剖员
[...]
info("calling dissector")
Dissector.get("myproto"):call(payload_tvb, packet_info, tree)
虽然解剖器本身看起来像:
function myproto.init()
info("Initialization of myproto dissector")
end
function myproto.dissector(buffer, packet_info, tree)
info("dissector successfully called")
[...]
end
实际上没什么特别的。从日志中,我可以看到解剖器被初始化。但是当我用tshark打开一个.pcapng文件时,日志消息“dissector成功调用”永远不会被打印,而在Wireshark GUI中,它会打印出来。
我没有看到任何错误消息,所以我不知道问题可能是什么。 getDissector函数调用不返回nil,我检查了一下。 lua文件放在我的 AppData \ Roaming \ Wireshark \ plugins 目录中,tshark在那里找不到问题。有没有人知道这个解剖器可能有什么问题?感谢任何帮助,提前谢谢。
答案 0 :(得分:0)
我不熟悉getDissector()
;你不应该使用Dissector.get
吗?
例如,我的lua解剖器都是这样做的:
local data_handle = Dissector.get("data")
function my_proto.dissector(tvb, pinfo, tree)
...
data_handle:call(...)
end
我不确定为什么它不适合你,但我可以提供一个可以帮助你的工作示例。下面是2个愚蠢的解剖器, foo.lua 和 bar.lua 。如果您想测试它,可以使用在cloudshark上发布的foo.pcapng样本捕获文件。 (我很久以前在ask.wireshark.org上发布了this问题的例子。)
首先, foo.lua :
-- foo.lua
local p_foo = Proto("foo", "FOO Protocol")
local f_foo_val8 = ProtoField.uint8("foo.val8", "Value 8", base.OCT)
local f_foo_val16 = ProtoField.uint16("foo.val16", "Value 16", base.DEC)
local f_foo_val32 = ProtoField.uint32("foo.val32", "Value 32", base.HEX)
local f_foo_ipv4 = ProtoField.ipv4("foo.ipv4", "IPv4 Address")
local f_foo_ipv6 = ProtoField.ipv6("foo.ipv6", "IPv6 Address")
p_foo.fields = { f_foo_val8, f_foo_val16, f_foo_val32, f_foo_ipv4, f_foo_ipv6 }
bar_handle = Dissector.get("bar")
function p_foo.dissector(buf, pinfo, tree)
local foo_tree = tree:add(p_foo, buf(0,-1))
pinfo.cols.protocol:set("FOO")
foo_tree:add(f_foo_val8, buf(0, 1))
foo_tree:add(f_foo_val16, buf(1, 2))
foo_tree:add(f_foo_val32, buf(3, 4))
foo_tree:add(f_foo_ipv4, buf(7, 4))
foo_tree:add(f_foo_ipv6, buf(11, 16))
bar_handle:call(buf, pinfo, tree)
end
local udp_table = DissectorTable.get("udp.port")
udp_table:add(33333, p_foo)
-- end of foo.lua
...现在 bar.lua :
local p_bar = Proto("bar", "BAR Protocol")
function p_bar.dissector(buf, pinfo, tree)
pinfo.cols.info:append(", BAR")
end
-- end of bar.lua
好的,所以这里的一般想法是 foo.lua 按照我最初提供的示例进行正常解剖,但它现在也调用 bar 解剖器,这是非常简单,只需追加" BAR"到info列,所以你知道它被调用了。在我的测试中,这一切都按预期工作。也许这个简单的例子对你有帮助吗?
答案 1 :(得分:0)
您需要使用-X命令行参数将lua文件传递给tshark。
当您打开wireshark时脚本会自动加载,但在运行tshark时则不会。