2013-01-17 7 views
6

Próbuję napisać program do protokołu zdalnej debugowania Safari, który jest oparty na listach binarnych i odniósł znaczny sukces (obecny kod jest tutaj: https://github.com/andydavies/bplist-dissector).Ponowne składanie pakietów w urządzeniu Lua Wireshark Dissector

Wpadam jednak w trudność przy ponownym składaniu pakietów.

Normalnie protokół wysyła pakiet z 4 bajtów zawierających długość następnego pakietu, a następnie pakiet z bplist w.

Niestety, niektóre pakiety z symulatora iOS nie wykonuj tej konwencji i cztery bajty są albo oznaczone na przedniej stronie pakietu bplist, albo na końcu poprzedniego pakietu bplist, albo dane są wieloma listami bplist.

Próbowałem ponownym ich użyciem desegment_len i desegment_offset następująco:

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) 

    ... 

Co ja próbuje zrobić tutaj jest zawsze zmusić rozmiar bajtów za pierwsze cztery bajty pakietu przeznaczonego do rozcięta ale to nie działa nadal widzę pakiet 4 bajty, a następnie pakiet bajtowy x.

Potrafię wymyślić inne sposoby zarządzania dodatkowymi czterema bajtami na froncie, ale protokół zawiera tabelę odnośników, która wynosi 32 bajty od końca pakietu, więc potrzebna jest metoda dokładnego złożenia pakietu w pakiety bplist.

Oto przykładowa czapka: http://www.cloudshark.org/captures/2a826ee6045b # 338 to przykład pakietu, w którym rozmiar bplisty znajduje się na początku danych, aw danych jest wiele plików plist.

Czy robię to dobrze (patrząc na inne pytania na temat SO i przykłady w Internecie, jak się wydaje) lub czy istnieje lepszy sposób?

Odpowiedz

4

TCP paraszyta packet-tcp.c ma tcp_dissect_pdus(), która

pętli dla preparowania PDU w strumieniu TCP; zakłada się, że jednostka PDU składa się z fragmentu danych o ustalonej długości, który zawiera wystarczającą ilość informacji, aby ustalić długość PDU, a następnie resztę PDU.

Nie ma takiej funkcji w lua api, ale jest to dobry przykład jak to zrobić.

Jeszcze jeden przykład. Użyłem tego rok temu do testów:

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) 
+0

Dzięki za to pomógł mi dostać się dalej, jakoś nie dekoduję wszystkich pakietów, więc trzeba spojrzeć jeszcze raz! –

+1

Mimo że jest to dość stary post, w przyszłości uważam, że warto napisać, że począwszy od Wireshark 1.99.2, tam ** jest ** API Lua dla 'tcp_dissect_pdus'. Zajrzyj tutaj: [wireshark.org/docs](https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Proto.html#lua_fn_dissect_tcp_pdus_tvb__tree__size__func__func___desegment__) –