Wireshark で GIOP/IIOP トラフィックを解析するためのカスタムディセクタを簡単に作成する方法
はじめに: idl2wrs とは? 🤔
idl2wrs
は、CORBA (Common Object Request Broker Architecture) のインターフェース定義言語 (IDL) ファイルを入力として受け取り、その IDL に基づいた GIOP (General Inter-ORB Protocol) / IIOP (Internet Inter-ORB Protocol) トラフィックをデコードできる Wireshark ディセクタの C 言語ソースコードを生成するツールです。
簡単に言うと、特定の CORBA アプリケーションが通信する内容を Wireshark で詳しく見たい場合に、そのアプリケーションの IDL ファイルがあれば、このツールを使って専用の解析器 (ディセクタ) を自動生成できるということです。これにより、複雑な CORBA 通信のトラブルシューティングや学習が容易になります。
このツールは、Wireshark の標準ディストリビューションに含まれています。
- CORBA 通信のトラブルシューティングを支援するため。
- 特定の IDL 型がオクテットストリーム内でどのように表現されるかを理解するため。
- CORBA の学習教材として、実際の通信内容を学生に示すため。
- 素晴らしいオープンソースプロジェクトである Wireshark に貢献するため (開発者の動機より 😄)。
idl2wrs
は、実際には omniidl
という IDL コンパイラを利用して IDL ファイルを解析し、Wireshark の GIOP API (packet-giop.[ch]
) を使って通信データをデコードするための C コード (具体的には get_CDR_xxx
関数の呼び出し) を生成します。
idl2wrs
は内部的に以下の主要なファイルで構成されています:
README.idl2wrs
: 説明ドキュメントwireshark_be.py
: 主要なコンパイラバックエンド (IDL Visitor Class を含む)wireshark_gen.py
: C コードを生成するヘルパークラス (Source Code Generator Class を含む)idl2wrs
: ユーザーが IDL ファイルからディセクタを生成するために使用するシンプルなシェルスクリプトのラッパー
前提条件 ✅
idl2wrs
を使用して Wireshark ディセクタを生成するには、以下のものが必要です:
- Python:
idl2wrs
スクリプトと内部の Python プログラム (wireshark_be.py
,wireshark_gen.py
) を実行するために必要です。 Python公式サイト - omniidl:
omniORB
パッケージに含まれる IDL コンパイラです。idl2wrs
はこれを内部で呼び出して IDL ファイルを解析します。 omniORB プロジェクトページLinux ディストリビューションによっては、
omniorb-idl
や同様のパッケージ名でインストールできる場合があります。 - Wireshark (ソースコード): 生成された C コードをコンパイルし、必要に応じて調整するために Wireshark のソースコードが必要です。 Wireshark ダウンロードページ
- C コンパイラとビルドツール: 生成された C コードと Wireshark 本体をビルドするために、
gcc
やmake
、cmake
などの開発ツールが必要です。
idl2wrs
自体は、Wireshark の開発用パッケージ (例: Debian/Ubuntu の wireshark-dev
) に含まれていることが多いです。
wireshark-dev
パッケージをインストールすることで idl2wrs
が利用可能になります。sudo apt update
sudo apt install wireshark-dev
idl2wrs の基本的な使い方 🚀
idl2wrs
の最も基本的な使い方は、IDL ファイル名を引数として渡すことです。これにより、生成された C コードが標準出力 (stdout) に出力されます。
1. C コードを標準出力へ出力
idl2wrs <your_file.idl>
例: echo.idl
というファイルからディセクタコードを生成する場合
idl2wrs echo.idl
2. C コードをファイルへ出力
通常は、生成されたコードをファイルに保存します。リダイレクト (>
) を使用します。
idl2wrs <your_file.idl> > packet-<protocol_name>.c
例: echo.idl
から packet-echo-idl.c
というファイルにコードを保存する場合
idl2wrs echo.idl > packet-echo-idl.c
生成される C ファイル名は、Wireshark の命名規則に従って packet-<protocol_name>.c
の形式にすることが推奨されます。
3. (代替) omniidl を直接使用する
idl2wrs
はシェルスクリプトラッパーなので、内部で実行されている omniidl
コマンドを直接使用することも可能です。これは、idl2wrs
スクリプトがうまく動作しない場合や、より詳細な制御が必要な場合に役立ちます。
標準出力へ出力:
omniidl -p ./ -b wireshark_be <your_file.idl>
ファイルへ出力:
omniidl -p ./ -b wireshark_be <your_file.idl> > packet-<protocol_name>.c
注意:
-p ./
オプションは、wireshark_be.py
とwireshark_gen.py
がカレントディレクトリにあることを示します。これらのファイルが別の場所にある場合は、パスを適宜変更する必要があります。idl2wrs
スクリプトを使用する場合、これらの Python ファイルの場所は自動的に解決されるか、環境変数PYTHONPATH
で指定された場所から検索されます。
生成されたディセクタの組み込みとビルド 🏗️
idl2wrs
で C コードファイル (例: packet-echo-idl.c
) を生成したら、それを Wireshark のソースツリーに組み込んでビルドする必要があります。
1. ソースファイルのコピー
生成された C ファイルを、Wireshark のソースコードディレクトリ内の epan/dissectors/
サブディレクトリにコピーします。
cp packet-echo-idl.c /path/to/wireshark/source/epan/dissectors/
/path/to/wireshark/source
は、Wireshark のソースコードを展開したディレクトリのパスに置き換えてください。
2. CMakeLists.txt の編集
コピー先の epan/dissectors/
ディレクトリにある CMakeLists.txt
ファイルを編集して、新しいディセクタファイルを追加する必要があります。
ファイル内で DISSECTOR_SRC
という変数 (または同様のリスト) を探し、そこに新しいファイル名を追加します。アルファベット順に挿入するのが一般的です。
例 (変更前):
set(DISSECTOR_SRC
${CMAKE_CURRENT_SOURCE_DIR}/packet-2dparityfec.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-3com-njack.c
...
)
例 (packet-echo-idl.c
を追加後):
set(DISSECTOR_SRC
${CMAKE_CURRENT_SOURCE_DIR}/packet-2dparityfec.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-3com-njack.c
...
${CMAKE_CURRENT_SOURCE_DIR}/packet-echo-idl.c
...
)
ファイルを保存して閉じます。
3. Wireshark のビルド
Wireshark のソースコードのトップディレクトリに戻り、標準的な CMake ベースのビルド手順に従います。
# Wireshark ソースのトップディレクトリにいることを確認
cd /path/to/wireshark/source
# ビルドディレクトリを作成して移動 (存在しない場合)
mkdir -p build
cd build
# CMake を実行してビルドシステムを生成
cmake ..
# ビルドを実行 (時間がかかることがあります)
make
# (オプション) インストール
# sudo make install
ビルドが成功すれば、新しいディセクタが組み込まれた Wireshark (または TShark) が build/run
ディレクトリなどに生成されます。
4. 動作確認
ビルドした Wireshark を起動し、対象の CORBA/GIOP トラフィックを含むキャプチャファイルを開くか、ライブキャプチャを実行します。
IDL で定義されたオペレーションやデータ構造が正しく解析され、Packet Details ペインに表示されれば成功です 🎉。
生成されたディセクタは、デフォルトではヒューリスティックディセクション(パケットの内容からプロトコルを推測する方式)を使用します。特定のポート番号やオブジェクトキーに基づいてディセクションを行いたい場合は、生成された C コード内の register_giop_user_module()
の呼び出し部分などを確認・編集する必要があるかもしれません。
コマンドラインオプションと環境変数 ⚙️
idl2wrs のオプション
現在のところ、idl2wrs
スクリプト自体にはコマンドラインオプションは定義されていません (man ページやドキュメントによる情報)。引数として IDL ファイル名を指定するのみです。
ただし、将来的にはオプションが追加される可能性はあります (TODO リストに記載されていることがあります)。
環境変数
idl2wrs
(内部の Python スクリプト) は、wireshark_be.py
と wireshark_gen.py
を見つけるために以下の場所を探します:
- 環境変数
PYTHONPATH
で指定されたディレクトリ内のsite-packages
- カレントディレクトリ (
./
)
もし tempfile.py
のような標準モジュールが見つからないというエラーが出る場合は、PYTHONPATH
が正しく設定されているか確認する必要があるかもしれません。
# 例: Python 3 のライブラリパスを設定
export PYTHONPATH=/usr/lib/python3/dist-packages # パスは環境により異なる
また、omniidl
を直接呼び出す際に -p
オプションで指定したパスも Python モジュールの検索パスとして使用されます。
制限事項と注意点 ⚠️
- 完全な IDL サポートではない可能性:
idl2wrs
は全ての IDL 構造や機能を完璧にサポートしているとは限りません。複雑な IDL や特殊な型定義では、生成されたコードが不完全であったり、手動での修正が必要になったりする場合があります。具体的な制限については、Wireshark ソース内のpacket-giop.c
にある TODO リストなどを参照すると良いかもしれません。 - ヒューリスティックディセクション: デフォルトで生成されるコードはヒューリスティックディセクションに基づいています。これは、同じポートを他の GIOP ベースのプロトコルが使用している場合に、誤って解析される可能性があることを意味します。より確実な解析のためには、オブジェクトキーやリポジトリ ID に基づく明示的なディセクションを実装する必要がありますが、これは実験的な機能とされています。
- 名前空間の衝突: 異なる IDL ファイルで同じオペレーション名が使用されている場合、デコードアルゴリズムで問題が発生する可能性があります。
- 生成コードの調整: 生成された C コードは、そのままではコンパイルエラーになったり、期待通りに動作しなかったりすることがあります。Wireshark のディセクタ開発に関する知識があると、コードの調整やデバッグがしやすくなります。
まとめ ✨
idl2wrs
は、CORBA IDL ファイルから Wireshark 用の C 言語ディセクタコードを自動生成するための便利なツールです。これにより、GIOP/IIOP プロトコルを使用する独自のアプリケーションやシステムの通信解析を効率化できます。
基本的な使い方はシンプルですが、生成されたコードを Wireshark に組み込んでビルドし、必要に応じてカスタマイズするには、C 言語、CMake、および Wireshark のディセクタ開発に関する基本的な知識が役立ちます。
CORBA 通信の解析が必要になった際には、ぜひ idl2wrs
の活用を検討してみてください! 💪
参考情報
- 公式ドキュメント (Wireshark) 9.8. idl2wrs: Creating dissectors from CORBA IDL files (最新版に近い情報)
- 公式ドキュメント (古いバージョン) D.10. idl2wrs: Creating dissectors from CORBA IDL files
- Manpage (Ubuntu) idl2wrs(1) – Ubuntu Manpage
- 関連ツール omniORB (omniidl を含む)
- 関連ツール Python
- 関連情報 (Kali Linux) wireshark | Kali Linux Tools (wireshark-dev パッケージに idl2wrs が含まれる)
コメント