我有一个协议,它在非标准端口上使用SSL / TLS,并通过它传输非标准数据(而不是http)。我正在尝试制作一个wireshark解剖器(在lua中)来剖析这个协议。
我该怎么做?我可以注册一个在该端口上调用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密钥文件(Preferences-> Protocols-> SSL->主密钥文件),我可以看到数据包的解密内容,一切都很好。排序。
但是我想为我的协议创建字段并将它们放在协议树中。我如何获得ssl解剖器生成的解密数据?
更新:
我正试图尽我所能地混淆这一点;没有关于你应该如何做到这一点的教程。有点像Wireshark有一个基于由解剖器填充的字段/变量的编程模型,理论上应该可以查询这些变量以找到解剖器的输出。
为此,我一直在运行SSL解析器,然后查看它声明的字段,但实际上似乎并没有填充它们。当我在SSL解析器之后运行后解剖器时,没有设置任何看似有用的字段,如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。*)变量做测试为正(至少用握手pdus),但不包含解密内容的变量。
有没有人有任何想法?