【发布时间】:2013-01-01 11:38:00
【问题描述】:
我正在尝试为基于 bplists 的 Safari 远程调试协议编写解析器,并且相当成功(当前代码在这里:https://github.com/andydavies/bplist-dissector)。
不过,我在重新组装数据包时遇到了困难。
协议通常会发送一个包含下一个数据包长度的 4 个字节的数据包,然后是包含 bplist 的数据包。
不幸的是,来自 iOS 模拟器的一些数据包不遵循此约定,这四个字节要么被标记在 bplist 数据包的前面,要么被标记到前一个 bplist 数据包的末尾,或者数据是多个 bplist。
我尝试使用desegment_len 和desegment_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