"Wireshark中的Lua协议解析器错误:'Tree item ProtoField/Protocol handle is invalid'"

我完全是 Lua 的新手,这是我第一次尝试编写 Wireshark 解析器。我希望使用 Lua 脚本分析不带加密的 SSH。我编写了一个脚本来检测数据包长度和填充长度,以进行第一步。以下是我的脚本:

do
    local p_test = Proto("test","Test.");

    local f_packet_length = ProtoField.uint32("packet_length")
    local f_padding_length = ProtoField.uint8("padding_length")

    p_test.fields = {
        f_packet_length,
        f_padding_length
    }

    function p_test.dissector(buf,pkt,root)
        local offset = 0
        local buf_len = buf:len()

        local t = root:add(p_test, buf:range(offset))

        t:add(f_packet_length,buf:range(offset,4))
        offset = offset+4
        t:add(f_padding_length,buf:range(offset,1))
        offset = offset+1

    end

    local tcp_table = DissectorTable.get("tcp.port")

    tcp_table:add(22,p_test)
end

通过评估 Lua 并应用测试过滤器运行代码后,我发现 Packet Details 中有一个错误:

Lua Error: [string "do..."]:19: Tree item ProtoField/Protocol handle is invalid (ProtoField/Proto not registered?)

第 19 行对应的是 t:add(f_packet_length ... 行。谁能帮忙解释这个错误?提前感谢。

点赞
用户3395060
用户3395060

如果以上代码在实际的 Lua 脚本中运行,例如在个人插件目录.lua 文件形式,或者通过“-X lua_script:<文件名>”命令行开关加载时,它将能够正常运行。

但你不能在 工具->评估 窗口中注册一个新的协议,因为那时注册新协议(或新字段)已经太晚了。不幸的是,Wireshark 报告的错误并没有清楚地说明这一点,因为它似乎半工作不休,实际上它并不工作,而且无法工作。

问题在于新协议注册在内部分为两个阶段:第一阶段是加载和执行 Lua 脚本时,向内部临时表中加入协议和字段,然后在所有 Lua 脚本都加载完成后,移动新协议和字段到它们的最终运行时表中并注册,在 Wireshark 完成加载并显示 GUI 之前的第二阶段。这第二阶段只会发生一次,也就是 Wireshark 首次启动时。但运行 工具->评估 窗口发生在这个之后,所以为时已晚。

2014-08-12 18:23:21