Wireshark達人への道 第十五歩 完結!?Dissector作成の勉強

本連載は、筆者がWiresharkの達人となるまでを追うドキュメンタリー作品である。

Wireshark達人への道 第十四歩で、独自パケットの作成方法をご紹介しました。

第十五歩目は様々な人が紹介しているWiresharkのDissector作成方法を勉強したいと思います。

独自パケットの作成方法からDissector作成までを紹介しているサイトはありませんので、私が勉強していくと同時に読者の皆様も一緒に確認していただけると幸いです。

尚、完結とありますがDissectorの作成が完結という意味で、本企画の完結という意味ではございません。

復習として、前回作成した独自プロトコルの仕様を記述しておきます。

独自プロトコルのサイズを8バイトとし、中身は以下の記載です。前半4バイトをlength。後半4バイトは文字列です。

#独自プロトコル仕様 UDP
#8バイトで文字列はabcdの例
#0X00000008 0X61626364

今回Dissector作成の勉強で参考にしたサイトは、Cyberdefenceのサイトです。筆者の環境では、Wireshark Dissectorと検索するとトップ2に表示されました。

参考サイト

WiresharkのDissectorを使った独自プロトコル解析をやさしく解説してみました

記事タイトルがやさしく解説とある通り、これ以上分かりやすい説明は不可能です。

Cyberdefenceのサイトを必ず一読ください。

筆者が作成した独自プロトコルとの違いは、TCP がUDPになっているところだけです。違いが分かるようにDissectorを張っておきます。

-- mieruka_study.lua プログラム
proto = Proto("mieruka","mieruka独自プロトコル")

mieruka_size_F = ProtoField.new("独自プロトコルのサイズ","mieruka.mieruka_size",ftypes.UINT32)  
mieruka_data_F = ProtoField.new("独自プロトコルの文字列","mieruka.mieruka_data",ftypes.STRING)  

proto.fields = {mieruka_size_F, mieruka_data_F}

function proto.dissector(buffer, pinfo, tree)
    pinfo.cols.protocol = "MIERUKA"
    local subtree = tree:add(proto, buffer())
    subtree:add(mieruka_size_F, buffer(0,4))
    subtree:add(mieruka_data_F, buffer(4,4))
end

tcp_table = DissectorTable.get("udp.port") --- udp.portにすること
tcp_table:add(6363, proto)

作成したmieruka_study.luaを筆者の環境ですと、C:\Users\”ユーザー名”\AppData\Roaming\Wireshark\plugins にフォルダを作成して、保存しました。

保存する際は、UTF-8で保存することに注意してください。それ以外ですと文字化けします。

図1 独自プロトコルを解析機にかけたところ

図1の通り、独自プロトコルを解析できました。表示フィルタも動作します。コードも短くて分かり易いですね。

今後はluaの勉強をしていきたいと思います。

(Visited 986 times, 1 visits today)
The following two tabs change content below.
【好きなもの】 インフラ技術が好き。古いものが好き。 【生きてきたフィールド】 システム運用、ソフトウェア開発、ミドルウェア検証、OSSサポート、プリセールスエンジニア、プロジェクトマネジメント 【このサイトでの役割】 サイト管理者。