使用tshark时不调用Lua解剖器(Windows 10)

时间:2017-03-15 10:46:17

标签: lua wireshark tshark wireshark-dissector

我已经在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在那里找不到问题。有没有人知道这个解剖器可能有什么问题?感谢任何帮助,提前谢谢。

2 个答案:

答案 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时则不会。