はじめに
パケットダイアグラムというパケットの構造を図で表示してくれる機能がWireshark ver. 3.4以降で追加されました。
その機能で自作プロトコルのフォーマットを表示してくれるか気になったので確認してみました。
注意点があるものの、自作プロトコルも表示してくれました。
これで自作プロトコルやWiresharkに入ってない新しいプロトコルのパケット解析が若干楽になりそうです。
動作環境
- Windows10 Home
- Wireshark ver. 3.6.3
- 日本語表示
大まかな流れ
- LuaでPacket dissectorを記載、プラグインに登録
- パケットダイアグラムの表示を有効化
Packet dissector作成と配置
適当に下記のLuaスクリプト(Packet dissector)を作成し、「C:\Program Files\Wireshark\plugins」配下に「.lua」形式で保存した。
original_proto = Proto("original_proto","Original Protocol (description)")
original_proto.fields.len = ProtoField.uint16("my_proto.len","Length")
original_proto.fields.data = ProtoField.bytes("my_proto.data","Data", base.SPACE)
CONSTANT = {
PORT_NUM = 20000
}
function original_proto.dissector(buffer, pinfo, tree)
pinfo.cols.protocol = "ORIGPROTO"
local subtree = tree:add(original_proto, buffer(), "Original Protocol")
local len = buffer(0, 2)
local data = buffer(2, len:le_uint())
subtree:add_le(original_proto.fields.len, len)
subtree:add(original_proto.fields.data, data)
end
udp_table = DissectorTable.get ("udp.port")
udp_table:add (CONSTANT.PORT_NUM, original_proto)
local len = buffer(0, 2):le_uint()
のようにリトルエンディアン関連の変換を入れると、パケットダイアグラムに当該項目(Length)が表示されなくなるため注意が必要。
変換したい場合はデータをいったん変数に入れ、変数に対して変換処理を追加すればよい
(上記例ではlocal data = buffer(2, len:le_uint())
)
パケットダイアグラムの有効化
メニューより、[編集(E)]->[設定...(P)]->[外観]->[レイアウト]で下記の画像が表示される。
表示部3にてパケットダイアグラムを選択し、[OK]を選択
パケット表示の確認
Wiresharkを導入したPCに向かって、適当なLinux端末(Raspberry pi OS)上で下記のコマンドでパケットを送信した。
echo 040001020304 | xxd -r -p | nc -u 192.168.0.1 20000
下記のように、独自プロトコルのパケットフォーマットが表示されることを確認した。
さいごに
最近入ったばかりの機能なので、入れ子構造になるような複雑なプロトコルフォーマットでも表示されるかは不明です。
上部に表示されているIPプロトコルの表示を見る限り、何かしらの記載方法がありそうですが、本記事での確認はここまでにします。