2016-07-28 28 views
2

私はいくつかのプロトコルのペイロードに入っているデータのためにLuaディセクタを書こうとしています。各パケットにはいくつかのシリアルデータが含まれています。データはCRで区切られた(0x0D/\r)パケットとして処理する必要がありますが、必ずしもプロトコルパケットと整列しているわけではありません。Wireshark Lua解剖再構築 - 以前のTvbのデータで解剖学者が呼び出されていません

私は解析するのに十分なデータがないと報告したときに、最後にデータを残して分解関数が呼び出されないという問題があります。例えば

、私は、次のプロトコル・パケットを持っていると言う:01 02 03 0D(最初のパケット)、11 12 13 21 22 23 24 0D(パケット2、パケット3):

1: 01 02 03 0D 
2: 11 12 13 
3: 21 22 23 24 0D 

そして私は2つのdissectable配列を有します。各パケットかかわら

  • 仕事、見つからない場合は\r
  • のオフセットを探して:このため

    私の戦略は、にある

    • 設定desegment_offset = 0
    • セットdesegment_len = DESEGMENT_ONE_MORE_SEGMENT(I以来、どれくらいのデータが残っているか分かりません)
    • 返信nilとtry aga
  • 次のパケットで途中で見つかった場合:
    • 設定desegment_offset改行のオフセットに、私は知らないので、次のパケットがテールデータ
    • セットdesegment_len = DESEGMENT_ONE_MORE_SEGMENTを(得ることができるので、左どのくらいのデータである)
    • 最後に見つかった場合
  • を返さないで、一人でdesegmentation paramsはを離れ、上運ぶ - 行全体は、DATの1行です
  • 我々は戻らなかった場合、0からのオフセットにバッファがデータの行全体である - この

例解析:(ペイロード長4上記の例で

function myproto.dissector(tvbuf, pinfo, treeitem) 

    original_dissector:call(tvbuf, pinfo, treeitem) 

    local endOffset = 0 

    -- find out if we have any complete chunks 
    while endOffset < tvbuf:len() do 

     if tvbuf(endOffset, 1):uint() == 0x0D then 
      break 
     end 

     endOffset = endOffset + 1 
    end 

    -- didn't find a complete line in the payload 
    -- ask for more 
    if endOffset == tvbuf:len() then 
     pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT 
     pinfo.desegment_offset = 0 
     print(' Incomplete, ask for more') 
     return 
    end 

    -- have more than needed so set offset for next dissection 
    if tvbuf:len() - 1 > endOffset then 
     pinfo.desegment_len = DESEGMENT_ONE_MORE_SEGMENT 
     pinfo.desegment_offset = offset 
     print(' Too much, leave some for later') 
    end 

    print("Whole line dissector:", tvbuf:len()) 
end 

を、3、5)、私は実際に4、3、8と予想されたときに、tvbufの長さで呼ばれていたディセクターを得ます。

私は、2番目のパケットの "incomplete、return"ブランチにヒットしますが、3番目のパケットは決して変更されません。

これは起こっていませんが、何が間違っていますか?

注:上記の方法は、1行に複数の\rのような場合には機能しませんが、この質問のようにレイアウトする方が簡単だと思います。

答えて

2

desegment_offsetdesegment_lengthのリアセンブリ機能は、親プロトコルに依存します。私はあなたのシリアルプロトコルはUSB上で動作し、実際には、USBプロトコルは、USBが通常パケット/メッセージベースであるため、リアセンブリを実装していないと思います。

Wiresharkは再アセンブリAPIをLuaディセクタに公開しません(現行の開発バージョンv2.3.0rc0にはまだ適用されています)。もしそうであれば、TCPのようなプロトコルはリアセンブリを実装します。 Luaを使用すると残念なことに、以前のデータを自分で追跡するディセクターの変数を作成する必要があります。

関連する問題