在一个系统中,我有一个自定义协议,我想实现一个 Wireshark 解析器,以便我可以使用 Wireshark 来分析通信。
对象通过协议发送,我们称它们为“消息”。每条消息可能很大,可能高达 100 MB,也可能非常小,例如 50 字节。
每条消息都被分成大约 1 kB 的块,并用序列号和 guid 消息 id 进行标记,这些可以在另一端用于重新组合消息。
到目前为止,我已经成功地制作了一个解析器,它将单独将所有块记录到 Wireshark,但我想更进一步,并将所有消息(组装成消息的块)记录在 Wireshark 中。这可以做到吗?怎么做?是否有可能在我下面开发的解剖器之上实现一个解剖器?
如果可以在下面的基础上实现解析器,我如何确保它只会分析 myproto PDU?下面的解析器在特定的 tcp 端口上触发,但这不适用于第二阶段解析器...
myproto_proto = Proto("myproto", "My Protocol")
function myproto_proto.dissector(buffer, pinfo, tree)
pinfo.cols.protocol = "myproto"
local message_length = buffer(0, 4):le_uint()+4
if message_length>pinfo.len then
pinfo.desegment_len = message_length
pinfo.desegment_offset = 0
return;
end
local subtree = tree:add(myproto_proto, buffer(), "My Protocol Data")
local packet = subtree:add(buffer(0, message_length), "Chunk")
packet:add(buffer(0, 4), "Packet length: " .. buffer(0, 4):le_uint())
packet:add(buffer(32, 16), "Message ID")
packet:add(buffer(48, 4), "Block ID: " .. buffer(48, 4):le_uint())
packet:add(buffer(52, 4), "Max Block ID: " .. buffer(52, 4):le_uint())
packet:add(buffer(68, message_length-68-20), "Data")
pinfo.desegment_len = 0
pinfo.desegment_offset = message_length
return
end
tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(1234, myproto_proto)