Повторная сборка пакетов в Диссекторе Lua Wireshark

Я пытаюсь написать диссектор для протокола удаленной отладки Safari, который основан на bplists и был достаточно успешным (текущий код здесь:https://github.com/andydavies/bplist-dissector).

я сталкиваюсь с трудностями при сборке пакетов.

обычно протокол отправляет пакет с 4 байтами, содержащий длину следующего пакета, затем пакет с bplist.

к сожалению, некоторые пакеты из симулятора iOS не следуют этому соглашению, и четыре байта либо помечены на передней части пакета bplist, либо на конце предыдущего пакета bplist, либо данные являются несколькими bplists.

Я попытался собрать их с помощью 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 байта от конца пакета, поэтому нужен способ точного сращивания пакета в bplists.

вот пример cap:http://www.cloudshark.org/captures/2a826ee6045b #338 является примером пакета, где размер bplist находится в начале данных, и есть несколько plists в данных.

Я делаю это правильно (глядя на другие вопросы на SO и примеры по всему интернету, я, кажется,) или есть лучший способ?

1 ответов


TCP Dissector пакет-tcp.c имеет tcp_dissect_pdus(), который

цикл для разбиения PDU в потоке TCP; предполагает, что 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)