HN公開: プログラムの一部をオブジェクトファイルとしてエクスポートする Ghidra 拡張
(github.com/boricj)Ghidra向けオブジェクトファイルエクスポーター拡張
この Ghidra 拡張は、プログラムの一部をオブジェクトファイルとしてエクスポートできるようにする。これらのオブジェクトファイルは有効なメタデータ(シンボル、再配置テーブルなど)を持っており、ツールチェーンによって直接再利用できる。
ユースケース
- 高度なバイナリパッチ適用: 元の部分と変更部分を手作業ではなくリンカを使って結合
- ソフトウェア移植: システム非依存コードをプログラムから分離し、残りを置き換え
- ファイル形式変換: プログラムやオブジェクトファイルを別のファイル形式へ変換
- ライブラリ作成: プログラムの一部を抽出して別のコンテキストで再利用
- デコンパイルプロジェクト: プログラムを複数のオブジェクトファイルに分割して再実装
サポートされる命令セットアーキテクチャとオブジェクトファイル形式
- x86: COFF(対応)、ELF(対応)
- MIPS: COFF(非対応)、ELF(対応)
ビルド (CLI)
- このリポジトリをクローン
GHIDRA_INSTALL_DIR環境変数を Ghidra のインストールディレクトリに設定gradle buildExtensionコマンドを実行- Ghidra 拡張アーカイブが
dist/ディレクトリに生成される
インストール
- リリースページから拡張をダウンロードするか、ローカルでビルド
- Ghidra インスタンスで
File > Install Extensions…から拡張をインストール - CodeBrowser ウィンドウで
File > Configureを通じてRelocationTableSynthesizedPluginプラグインを有効化
使い方
- Listing ビューでアドレス集合を選択
Relocation table synthesizerアナライザーを実行(ワンショットモードで利用可能)File > Export Program…を通じて再配置可能なオブジェクトファイルエクスポーターを呼び出すWindow > Relocation table(synthesized)で再構成された再配置テーブルを確認可能
- ⚠️ Relocation table synthesizer アナライザーは、完全に埋められた Ghidra データベース(正確に宣言されたシンボル、データ型、参照)を必要とする。不正確または欠落した情報は、解析中に誤った再配置や検出されない再配置を引き起こす可能性がある
- ⚠️ オブジェクトファイルエクスポーターは Relocation table synthesizer アナライザーの結果に依存する。オブジェクトファイルをエクスポートする前にこのアナライザーを実行し、再配置テーブルの内容が最新状態であることを確認すること
仕組み
オブジェクトファイルは3つの部分で構成される:
- 再配置可能なセクションバイト
- シンボルテーブル
- 再配置テーブル
リンカが複数のオブジェクトファイルから実行ファイルを生成するとき:
- セクションをメモリ上に配置
- 仮想アドレス空間でシンボルのアドレスを計算
- セクションバイトに対して、シンボルの最終アドレスに基づく再配置を適用
通常、この過程の後に再配置テーブルは破棄され、デバッグシンボルが保持されない限りシンボルテーブルも破棄される。しかし、慎重な解析によってこのデータを再生成でき、それによりプログラムを再びオブジェクトファイルへ delink できる。
GN⁺の要約
- この Ghidra 拡張は、プログラムの一部をオブジェクトファイルとしてエクスポートできるようにする。
- 高度なバイナリパッチ適用、ソフトウェア移植、ファイル形式変換など、さまざまなユースケースがある。
- 正確なデータベースが必要であり、アナライザー実行後にオブジェクトファイルをエクスポートすることが重要。
- 類似機能を提供するプロジェクトとしては、IDA Pro のようなデコンパイラがある。
まだコメントはありません。