2

我完全是 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

在我通过 Evalutate 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...应该行。

谁能帮忙解释这个错误?
提前致谢。

4

1 回答 1

4

如果上面的代码在 Wireshark 的真实 Lua 脚本中,则可以正常工作......要么在个人插件目录中的文件中,要么通过“ ”命令行开关.lua加载。-X lua_script:<filename>

但是您不能在tools->evaluate窗口中注册新协议,因为到那时注册新协议(或新字段)为时已晚。不幸的是,Wireshark 报告的错误并不清楚这一点,因为它有点工作,但实际上它不起作用并且无法工作。

问题是新协议注册在内部分两个阶段进行:第一阶段是加载和执行 Lua 脚本时,将协议和字段添加到内部临时表中,然后在所有 lua 脚本加载后,第二阶段有新协议和字段从临时表移动到它们的最终运行时表并注册,然后wireshark 完成加载,您会看到GUI。当 Wireshark 首次启动时,第二阶段仅发生一次。但是运行tools->evaluate窗口毕竟发生了,所以为时已晚。

于 2014-08-12T18:23:21.190 回答