lua wireshark wireshark-dissector

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)