【问题标题】:Reassembling packets in a Lua Wireshark Dissector在 Lua Wireshark Dissector 中重新组装数据包
【发布时间】:2013-01-01 11:38:00
【问题描述】:

我正在尝试为基于 bplists 的 Safari 远程调试协议编写解析器,并且相当成功(当前代码在这里:https://github.com/andydavies/bplist-dissector)。

不过,我在重新组装数据包时遇到了困难。

协议通常会发送一个包含下一个数据包长度的 4 个字节的数据包,然后是包含 bplist 的数据包。

不幸的是,来自 iOS 模拟器的一些数据包不遵循此约定,这四个字节要么被标记在 bplist 数据包的前面,要么被标记到前一个 bplist 数据包的末尾,或者数据是多个 bplist。

我尝试使用desegment_lendesegment_offset 重新组装它们,如下所示:

  function p_bplist.dissector(buf, pkt, root)  

    -- length of data packet
    local dataPacketLength = tonumber(buf(0, 4):uint())
    local desiredPacketLength = dataPacketLength + 4

    -- if not enough data indicate how much more we need
    if desiredPacketLen > buf:len() then
      pkt.desegment_len = dataPacketLength
      pkt.desegment_offset = 0
      return
    end

    -- have more than needed so set offset for next dissection
    if buf:len() > desiredPacketLength then
      pkt.desegment_len = DESEGMENT_ONE_MORE_SEGMENT
      pkt.desegment_offset = desiredPacketLength
    end

    -- copy data needed 
    buffer = buf:range(4, dataPacketLen)

    ...

我在这里尝试做的总是强制将大小字节作为要解析的数据包的前四个字节,但它不起作用我仍然看到一个 4 字节的数据包,然后是 x 字节数据包。

我可以想到其他方法来管理前面额外的四个字节,但协议包含一个查找表,它距离数据包末尾 32 个字节,因此需要一种将数据包准确拼接到 bplist 中的方法。

这是一个示例上限:http://www.cloudshark.org/captures/2a826ee6045b#338 是一个数据包示例,其中 bplist 大小位于数据的开头,并且数据中有多个 plist。

我这样做是否正确(查看关于 SO 的其他问题,以及我似乎在网络上的示例)还是有更好的方法?

【问题讨论】:

    标签: lua wireshark wireshark-dissector


    【解决方案1】:

    TCP Dissector packet-tcp.c 有 tcp_dissect_pdus(),它

    用于剖析 TCP 流中的 PDU 的循环;假设一个 PDU 由包含足够信息的固定长度数据块组成 确定 PDU 的长度,然后确定 PDU 的其余部分。

    lua api 中没有这样的功能,但它是一个很好的例子。

    还有一个例子。我在一年前用它进行测试:

    local slicer = Proto("slicer","Slicer")
    function slicer.dissector(tvb, pinfo, tree)
        local offset = pinfo.desegment_offset or 0
    
        local len = get_len() -- for tests i used a constant, but can be taken from tvb
    
        while true do
            local nxtpdu = offset + len
    
            if nxtpdu > tvb:len() then
                pinfo.desegment_len = nxtpdu - tvb:len()
                pinfo.desegment_offset = offset
                return
            end
    
            tree:add(slicer, tvb(offset, len))
    
            offset = nxtpdu
    
            if nxtpdu == tvb:len() then
                 return
            end
        end
    end
    local tcp_table = DissectorTable.get("tcp.port")
    tcp_table:add(2506, slicer)
    

    【讨论】:

    • 感谢这帮助我更进一步,不知何故我没有解码所有的数据包,所以需要再看看!
    • 尽管这是相当老的帖子,但对于未来,我认为值得说明的是,从 Wireshark 1.99.2 开始,一个用于 tcp_dissect_pdus 的 Lua API。看看这里:wireshark.org/docs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2011-10-30
    • 2023-04-09
    相关资源
    最近更新 更多