wireshark lua debug.getinfo 为空

我现在正在用 Lua 编写 Wireshark 的一些解剖器。Lua 代码已经变得非常大了。因此,我把它分成了多个文件(模块)。我已经让它工作了。顺便说一句,我的目标是用户只需要将文件复制到插件目录中,这样每次启动 Wireshark 时都会自动加载分析器。

现在,要从“主文件”获得其他文件的访问权限,我需要这样做:

package.prepend_path(".\plugins\3.3\modulesDir") local mymodule = require "module"

这很好用,但有一些缺点。最重要的是,如果用户使用不同版本的 Wireshark,则需要更改 Lua 代码中的路径。如果是不同的目录(Linuy,Mac OS),也是一样的。

为了解决这个问题,我研究了如何获取当前 Lua 文件的路径,并得出了以下结论:

local moduleDir = debug.getinfo(2,"S").source:sub(2) moduleDir = moduleDir:match("(.*[/\\])")

这可在所有平台上使用,因此对于我想要的东西来说似乎是完美的解决方案。如果我使用 Wireshark>工具> Lua>评估它,它完美地工作。

但是:如果我将其放在 Lua 文件中(这是我的分析器),那么我会得到“尝试索引空值”的错误。我尝试了这条线的各种不同版本,但似乎始终会出现 debug 表为空的情况。我使用的是 Wireshark 3.3 版本。

有人有想法如何运行它吗?或者获取 Lua 文件所在目录的其他方法?谢谢您的帮助。

点赞
用户7746452
用户7746452

如果您正在寻找“全局配置目录”,则可以使用Dir.global_config_path()在这里您可以找到init.lua在此路径中,在这里是Lua函数的详细信息。

2020-03-09 11:21:26
用户2755698
用户2755698

在Windows上,我将我的Lua文件放在“个人Lua插件”目录中,它在Wireshark的“帮助->关于Wireshark->文件夹”对话框中查看时,只是%APPDATA%\Wireshark\plugins。所以,或许你只需要将你的文件夹从path\to\plugins\3.3\modulesDir移动到path\to\plugins\modulesDir

我相信你只需要:

package.prepend_path("modulesDir")

这将使您的Lua分析器和模块不仅与Wireshark 3.3开发版本一起工作,而且也可以适用于将来的版本。如果您的分析器由于某些原因无法与较旧版本的Wireshark一起工作,您可以随时做出以下操作:

if get_version() < "3.3" then
    return
end

最后,看看Hadriel Kaplan是如何解决他的protobuf.lua分析器所需模块在“modules”目录中的问题的。它基本上就是我上面描述的。请参见:https://github.com/128technology/protobuf_dissector

2020-03-09 13:44:32