私はいくつかのプロトコルのペイロードに入っているデータのために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
のような場合には機能しませんが、この質問のようにレイアウトする方が簡単だと思います。