
Ghidra拡張機能で、PCファームウェアのリバースエンジニアリングを目的とし、PCIオプションROM、Intel Flash Descriptor、coreboot CBFS、UEFIファームウェアボリューム用のローダーを提供します。さらに、型回復とGUID識別のためのUEFIヘルパースクリプトも含まれています。
PC ファームウェアのリバースエンジニアリングを支援する Ghidra 用の各種モジュールです。 これは coreboot プロジェクトの GSoC 2019 プロジェクトとして採択されました。
JDK 21(以降)と Ghidra 12.0(以降)が必要です。
Ghidra の標準 Gradle ビルドシステムを使用します。ビルド前に GHIDRA_INSTALL_DIR
環境変数を設定するか、Gradle プロパティとして設定してください(IDE でのビルドに便利です):
$ export GHIDRA_INSTALL_DIR="/path/to/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/path/to/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIRはsupport/buildExtension.gradleを含むディレクトリを指す必要があります。 例えば、Flathub パッケージのユーザーは/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidraを使用してください。
モジュールの ZIP は dist/ に出力されます。File > Install Extensions を使用し、
緑のプラス記号を選択して拡張機能を参照します。プロンプトが表示されたら Ghidra を再起動します。
正しく機能させるには、プラグインを Ghidra インストールで使用されているものと同じ JRE でビルドする必要があります。
複数の Java ランタイム環境がインストールされている場合は、ビルド前に JAVA_HOME 環境変数を設定して
正しい JRE を選択してください。
PCI option ROM を Ghidra プロジェクトに追加します。レガシー x86 option ROM は 直接ロードして解析できます。バイナリ形式が x86 PCI Option ROM に設定されていることを確認し、 バイナリをインポートします。
UEFI option ROM または複数のイメージを含む option ROM は、ファイルシステムローダーを使用して インポートする必要があります。インポートモードの選択を求められたら、File system を選択します。 option ROM 内に含まれるイメージが表示され、解析用にインポートできます。レガシー x86 イメージは x86 PCI Option ROM ローダーで処理され、UEFI イメージは PE32 ローダーで処理されます(圧縮に対応)。 各イメージの情報は、右クリックメニューの Get Info を選択して表示できます。
サポートされているファームウェアイメージを Ghidra プロジェクトに追加します。ファームウェアイメージローダーは、 Flash Descriptor を持つ Intel イメージ、FMAP/CBFS レイアウトを持つ coreboot イメージ、および UEFI ファームウェアボリュームをサポートします。File system インポートモードを使用すると、 指定されたファームウェアイメージ内に埋め込まれたファイルを表示できます。
一部の UEFI ファームウェアイメージは、フリーフォーム/生ファイル(またはフリーフォーム/生 FFS セクション)内に
ネストされたファームウェアボリュームを格納している場合があることに注意してください。このようなファイルは、
指定されたフリーフォーム/生ファイルの右クリックメニューで Open File System を選択することで、
ファームウェアボリュームとしてインポートできます。ネストされたファームウェアボリュームが見つからない場合は、
エラーメッセージが表示されます(No file system provider for...)。
ヘルパースクリプトはプラグインの ghidra_scripts ディレクトリに含まれており、Ghidra のスクリプトディレクトリの リストに自動的に追加されるはずです。
Script Manager ウィンドウ(Window -> Script Manager からアクセス)で UEFIHelper.java を選択して、 UEFI ヘルパースクリプトを実行します。
UEFI データ型ライブラリを変更するには、必要に応じて data/gen_prf.sh の PRF テンプレートを変更し、
新しい PRF ファイルを生成します。生成された PRF ファイルを File -> Parse C Source で開きます。
Parse to File... を選択して更新されたデータ型ライブラリをビルドします。data 内の元のデータ型ライブラリを
上書きし、プラグインを再ビルドします。
UEFI リバースエンジニアリングに関連する興味深いプロジェクトをいくつか紹介します:
Apache 2.0、ただし一部例外あり:
src/efidecompress/c/efidecompress.c: BSDsrc/efidecompress/c/efidecompress.c は、uefi-firmware-parser の Decompress.c を軽微に変更したものです
(それ自体は EDK2 BaseTools のオリジナルから派生)。
src/main/java/firmware/ifd の IFD FS ローダーは、UEFITool のパーサーを参考にしました。
data/guids.csv の GUID データベースは UEFITool から取得しています。
data/uefi_*.gdt の UEFI データ型ライブラリは data/gen_prf.sh で生成されました。これは
wrffrz による Ghidra プルリクエストの UEFI パーサー定義に部分的に基づいています。これらのデータ型ライブラリは
EDK2 MdePkg のヘッダーを使用しています。
UEFI ヘルパースクリプトの一部は xerpi による GhidraVitaLoader を参考にしました。