Reensamblaje de paquetes en un disector de Lua Wireshark
wireshark-dissector (1)
Intento escribir un disector para el protocolo de depuración remota de Safari, que se basa en bplists y ha tenido un éxito razonable (el código actual está aquí: https://github.com/andydavies/bplist-dissector ).
Sin embargo, estoy teniendo problemas al reensamblar paquetes.
Normalmente, el protocolo envía un paquete con 4 bytes que contiene la longitud del siguiente paquete, luego el paquete con el bplist.
Desafortunadamente, algunos paquetes del simulador iOS no siguen esta convención y los cuatro bytes están etiquetados en la parte frontal del paquete bplist, o en el extremo del paquete bplist anterior, o los datos son múltiples listas de bp.
Intenté volver a desegment_len
usando desegment_len
y desegment_offset
siguiente manera:
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)
...
Lo que trato de hacer aquí es forzar siempre que los bytes de tamaño sean los primeros cuatro bytes de un paquete para diseccionar pero no funciona Todavía veo un paquete de 4 bytes, seguido de un paquete de bytes x .
Puedo pensar en otras formas de administrar los cuatro bytes adicionales en el frente, pero el protocolo contiene una tabla de búsqueda que es de 32 bytes desde el final del paquete, así que necesito una manera de empalmar el paquete con precisión en bplists.
Aquí hay un límite de ejemplo: http://www.cloudshark.org/captures/2a826ee6045b # 338 es un ejemplo de un paquete donde el tamaño del bplist está al comienzo de los datos y hay múltiples listas en los datos.
¿Estoy haciendo esto bien (buscando otras preguntas sobre SO, y me parece que hay ejemplos en la web) o hay una mejor manera?
Dissector TCP packet- tcp.c tiene tcp_dissect_pdus (), que
Bucle para diseccionar PDU dentro de una secuencia TCP; asume que una PDU consiste en un fragmento de longitud fija de datos que contiene suficiente información para determinar la longitud de la PDU, seguido por el resto de la PDU.
No existe tal función en lua api, pero es un buen ejemplo de cómo hacerlo.
Un ejemplo más Lo usé hace un año para las pruebas:
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)