Lua dissector在使用 tshark(Windows 10)时不起作用

我已经在 Wireshark 社区(链接)上发布了这个问题,目前还没有答案。


我有一堆我用 Lua 写的解剖工具,到目前为止我都是在 Wireshark 的 GUI 中使用它们 - 现在我想在 tshark 中使用它们(在 Windows 10 下)。问题是,当在 tshark 中调用其中一个解剖工具时(即使它已经被初始化),它不起作用。tshark 根本不输出任何数据包,而其他所有解剖工具都能正常工作。我正在使用以下代码从我的另一个解剖工具中调用解剖工具:

[...]
info("调用解剖工具")
Dissector.get("myproto"):call(payload_tvb, packet_info, tree)

而解剖工具本身看起来是这样的:

function myproto.init()
    info("初始化 myproto 解剖工具")
end
function myproto.dissector(buffer, packet_info, tree)
    info("解剖工具已成功调用")
    [...]
end

实际上没有什么特别之处。从日志中,我可以看到解剖工具已经被初始化了。但是当我用 tshark 打开一个 .pcapng 文件时,日志消息“解剖工具已成功调用”永远不会被打印出来,而在 Wireshark 的 GUI 中,它会被打印出来。

我没有看到任何错误消息,所以我不知道可能出了什么问题。getDissector 函数调用没有返回 nil,我已经检查过了。lua 文件放置在我的 AppData\Roaming\Wireshark\plugins 目录中,tshark 似乎没有在那里找到它们有问题。有人有什么想法,这个解剖工具可能出了什么问题吗?任何帮助都将不胜感激,提前感谢。

点赞
用户2755698
用户2755698

我不熟悉getDissector();难道你不应该使用[Dissector.get](https://wiki.wireshark.org/LuaAPI/Dissector#Dissector.get.28name.29)?

例如,我的lua分解器都是这样做的:

local data_handle = Dissector.get("data")

function my_proto.dissector(tvb, pinfo, tree)

    ...

    data_handle:call(...)

end

我不确定为什么它对你不起作用,但我可以提供一个工作示例,这可能会帮助您。下面有两个愚蠢的分解器_foo.lua_和_bar.lua_。如果您希望测试它,则可以使用发布在cloudshark上的[foo.pcapng](https://www.cloudshark.org/captures/965bd39c6694)样本捕获文件。 (我很久以前将其作为[此](https://ask.wireshark.org/questions/23519/ipv6-dissecting-throws-lua-ft-not-yet-supported-error-why)问题在ask.wireshark.org上的示例。)

首先,_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”附加到信息列中,以便您知道它被称为。在我的测试中,这都按预期工作。也许这个简单的示例会帮助您?

2017-03-16 16:02:13
用户1628819
用户1628819

你需要使用 -X 命令行参数将 lua 文件传递给 tshark。

当你打开 wireshark 时,这些脚本会自动加载,但是在运行 tshark 时不会自动加载。

2017-04-28 19:44:16