Wireshark 解析器工作原理与 TLS/SSL

我有一个使用非标准端口和传输非标准数据(不是 http)的 SSL/TLS 协议。我正在尝试使用 lua 制作一个 Wireshark 解析器来解析这个协议。

我该如何做?我可以注册一个针对该端口的 tcp 片段进行调用的解析器

local dissector_table_tcp = DissectorTable.get("tcp.port")
dissector_table_tcp:add(1234, myprotocol)

接着我可以让 SSL 解析器将所有片段解码为 SSL

function myprotocol.dissector(tvb, pinfo, root)

    local ssl_dissector = Dissector.get("ssl")
    local ssl_dissected_len = ssl_dissector:call(tvb, pinfo, root)
    pinfo.cols.protocol:set("My Protocol")

在这一点上,如果我在 Wireshark 中设置了一个 premaster key 文件(首选项->协议->SSL->主密钥文件),我就可以看到数据包的解密内容,并且一切顺利。有点顺利。

但是我希望为我的协议创建字段,并将它们放入协议树中。我该如何获取 SSL 解析器生成的已解密数据?

更新:

我正在尽力尝试搞清楚这件事,没有确切的教程告诉你应该如何做。

从某种程度上看,Wireshark 有一个基于字段/变量且由解析器填充的编程模型,理论上应该可以查询这些变量以查找解析器的输出。

为此,我一直在运行 SSL 解析器,然后查看它声明的字段,但它似乎没有填充它们。当我在 SSL 解析器之后运行 post-dissector 时,似乎没有任何有用的字段被设置,例如 ssl.segments 或 ssl.segment.data:

protocol_foo = Proto("foo", "Foo protocol")
port = 4172

g_field_segment = Field.new("ssl.segment")
g_field_segment_data = Field.new("ssl.segment.data")
g_field_segments = Field.new("ssl.segments")
g_field_reassembled_data = Field.new("ssl.reassembled.data")

function protocol_foo.dissector(tvb, pinfo, root)

    print("====== protocol_foo")

    for k,v in pairs({ g_field_segment, g_field_segment_data, g_field_segments, g_field_reassembled_data }) do
        if v() ~= nil then
            print("Field " .. v.name .. " is NOT nil")
        else
            print("Field " .. v.name .. " is nil")
        end
    end

end

-- post-dissector registration
local ssl_dissector = Dissector.get("ssl")
local dissector_table_tcp = DissectorTable.get("tcp.port")
dissector_table_tcp:add(port, ssl_dissector)
register_postdissector(protocol_foo)

当我在我的协议上运行这段代码时,这些 ssl.segment* 变量中没有一个测试为真;许多变量(如 ssl.handshake.*)变量确实测试为真(至少在握手协议数据单元中是这样),但没有解密内容的变量测试为真。

大家有什么想法吗?

点赞