Повторная сборка пакетов в Диссекторе 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)