1

在一个系统中,我有一个自定义协议,我想实现一个 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)
4

1 回答 1

1

假设您创建了第二个 dissector msgproto。由于您似乎没有在块和消息之间进行任何多路复用,因此您不需要设置解析器表。相反,最后myproto_proto.dissector你做一个

 msgproto.dissector:call(buffer(68, message_length-68-20):tvb, pinfo, tree)

这会将所有块数据传递给您的msgproto. 在消息协议解析器中,您可以使用块协议的字段,当然还有只包含一个块的数据的 tvb。您现在需要将这些块拼凑成一个巨大的 tvb。使msgproto有状态:

 local stateMap = {}
 function msgproto.init()
     stateMap = {}
 end

将您的 tvb 转换为 ByteArray 并stateMap与来自其他调用解析器的数组一起存储到其中。当您将所有数据组装到一个数组中后,我们将其称为oarrtvb:

    local otvb = ByteArray.tvb(oarr, "message data")
    -- starting from 0, need to pass a tvb range, not a tvb.
    stree:add(msgproto.fields.payload, otvb(0))

假设你有payloadtype 的字段Protofield.bytes。此代码将在 Wireshark 窗口底部的常规“框架”窗格旁边显示一个名为“消息数据”的新数据窗格。

我不确定 Wireshark 是否会喜欢您的超大缓冲区。除此之外,我非常相信上述方法会奏效。我没有按照这个确切的顺序使用所描述的技术,但我已经使用了所有描述的技术,例如制作一个新的字节窗格,其中填充了纯 Lua 中压缩的数据。

于 2014-10-08T19:22:31.790 回答