2013-01-17 7 views
6

bplists를 기반으로 합리적으로 성공한 사파리 원격 디버그 프로토콜에 대한 해부학자를 작성하려고합니다 (현재 코드 : https://github.com/andydavies/bplist-dissector).Lua Wireshark Dissector에서 패킷 재구성

나는 패킷을 재구성하는 일이 어렵다.

는 일반적으로 프로토콜은 다음 패킷의 길이에 bplist와 다음 패킷을 포함하는 4 바이트 패킷을 전송한다.

불행하게도 일부 패킷을 아이폰 OS 시뮬레이터에서이 대회와 4 바이트를 따르지 않는 는 bplist 패킷의 앞 또는 이전 bplist 패킷의 끝에 태그가 지정되거나 데이터가 여러 bplist입니다.

나는 다음과 같이 desegment_lendesegment_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 바이트로 크기 바이트를 강제되어 여기에서하려고 해요하는 해부하기 하지만 여전히 작동하지 않는다. 나는 여전히 4 바이트 패킷을보고, 다음에 x 바이트 패킷을 따른다.

앞의 추가 4 바이트를 관리하는 다른 방법을 생각할 수도 있지만 프로토콜 끝에 패킷의 32 바이트 룩업 테이블이 있으므로 패킷을 정확하게 bplists로 연결해야합니다.

다음은 cap 예의 예입니다. http://www.cloudshark.org/captures/2a826ee6045b # 338은 bplist 크기가 데이터의 시작 부분에 있고 데이터에 여러 개의 plist가있는 패킷의 예입니다.

내가이 일을 제대로하고있는 것입니까 (웹에 관한 다른 질문을 찾고 있습니다) 또는 더 좋은 방법이 있습니까?

답변

4

TCP 해부학자는 packet-tcp.c tcp_dissect_pdus()을 가지는 TCP 스트림 내의 PDU를 해부 용있는

루프; PDU 은 PDU 길이를 결정하는 데 충분한 정보 인 을 포함하는 고정 길이의 데이터 청크로 구성되며 PDU 나머지가 뒤 따르는 것으로 가정합니다.

루아 API에는 이러한 기능이 없지만 좋은 예입니다.

또 다른 예입니다. 나는 1 년 전에 이것을 테스트에 사용했습니다 :

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

이렇게 해 주셔서 감사합니다. 어떻게 든 모든 패킷을 디코딩하지 않아서 다른 모양을 가질 필요가 없습니다! –

+1

꽤 오래된 게시물이지만, 미래에는 Wireshark 1.99.2부터 ** tcp_dissect_pdus를위한 ** 루아 API **가 있다는 것을 말할 가치가 있다고 생각합니다. 여기를보십시오 : [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__) –