ネットワークの解析には欠かせないオープンソースのパケットキャプチャソフト「Wireshark」
CentreCOMの「FS808TP V1」と組み合わせれば開発から出張まで活躍します。
素のままでも十分に使えるWiresharkですが、独自プロトコルの解析を行わせる方法を探していたところ、luaという組み込み言語でプロトコル解析が容易にできて、かなり便利にカスタマイズすることができました。
特に威力を発揮するのは、可変長のパケットが連続していて解析が困難な場合に、Wiresharkの解析画面で分割された状態で表示できることです。
参考にしたのはこちら(情報公開されている方に感謝します)
http://bearmini.net/blog/View.aspx?bid=1&aid=148
luaを使って1パケットを複数パケットに分割するスクリプトがこちら
リトルエンディアンの電文長項目から電文長を取得して可変長パケットを分割しています。
-- works as of Wireshark Version 1.0.5 do tcp_sample_proto = Proto("Test", "Test protocol dissector (TCP version)") tcp_sample_proto.dissector = function(buffer, pinfo, tree) local pos = 0; local num = 0; local top = tree:add( buffer(0, buffer:len()), "全部:" .. tostring(buffer:len())) while ((pos + 8) <= buffer:len()) do local ctrl_len = hl_chg(buffer, 6) if buffer:len() < (8 + ctrl_len) then top:add("need one more segment.", buffer:len() - (8 + ctrl_len)) return buffer:len() - (8 + ctrl_len) end num = num + 1; local subtree = top:add( buffer(pos,8 + ctrl_len), string.format("電文%02d len=%4d", num, 8 + ctrl_len) .. " [" .. all_pac(buffer(pos,8 + ctrl_len)) .. "]") local ctrl = subtree:add(buffer(pos,8), "コントロール部") ctrl:add( buffer(pos + 0,2), string.format("識別コード :0x%04X", hl_chg(buffer, pos + 0))) ctrl:add( buffer(pos + 2,2), string.format("ブロック番号:%d", hl_chg(buffer, pos + 2))) ctrl:add( buffer(pos + 4,2), string.format("最終ブロック:%d", hl_chg(buffer, pos + 4))) ctrl:add( buffer(pos + 6,2), string.format("データ長 :%d", ctrl_len)) pos = pos + 8 + ctrl_len; end if pos < buffer:len() then return DESEGMENT_ONE_MORE_SEGMENT end pinfo.cols.protocol = "コントロール部" --pinfo.cols.info = "コントロール部×" .. tostring(num) return pos end tcp_table = DissectorTable.get("tcp.port") for i, port in pairs( { 50004, 10001 } ) do tcp_table:add(port, tcp_sample_proto) end end function hl_chg(buffer, pos) return buffer(pos + 1,1):uint() * 0x100 + buffer(pos,1):uint() end function all_pac(buffer) local str = "" for i=0, math.min(buffer:len() - 1, 31) do str = str .. string.format("%02X,", buffer(i, 1):uint()) end return str end