2013-01-17 39 views
6

bplistsに基づいており、合理的に成功したSafariリモートデバッグプロトコル用のディセクタを作成しようとしています(現在のコードはhttps://github.com/andydavies/bplist-dissectorです)。Lua Wireshark Dissectorでパケットを再組み立てする

私はパケットを再組み立てするのが難しいです。

通常プロトコルは、中bplistの持つパケット、その後、次のパケットの長さを含む4バイトのパケットを送信します。

あいにくのiOSシミュレータからのいくつかのパケットは、この大会と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バイトにsizeバイトを強制的に常にありますしかしそれは私がまだxバイトパケットの後に続く4バイトパケットを見ることを働かせません。

余分な4バイトを前面に管理する他の方法も考えられますが、プロトコルにはパケットの最後から32バイトのルックアップテーブルが含まれているため、パケットを正確にスプライスにスプライスする必要があります。

キャップの例を次に示します。http://www.cloudshark.org/captures/2a826ee6045b#338は、bplistサイズがデータの先頭にあり、データに複数のplistがあるパケットの例です。

私はこの権利を守っていますか(それについての他の質問やウェブ上の例を見ています)、より良い方法がありますか?

答えて

4

TCP解剖packet-tcp.cは、TCPストリーム内のPDUを切開するため

ループtcp_dissect_pdus()を有しています。 PDU は、PDUの長さを決定するのに十分な情報 を含む固定長チャンクから成り、残りのPDUがそれに続くと仮定します。

lua apiにはこのような機能はありませんが、それを実行する良い例です。

さらに1つの例です。私はこれを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'のための** Lua 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__) –

関連する問題