Wiresharkでプロトコルの解析

ネットワークの解析には欠かせないオープンソースのパケットキャプチャソフト「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

Author: kachi

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です