ghidra-headless について
ghidra-headlessは、GhidraのanalyzeHeadlessを使ってバイナリを自動解析するスキルです。リバースエンジニアリングやセキュリティ監査向けに、逆コンパイルや関数、文字列、呼び出しグラフ、シンボルの出力を行います。
主な機能
- 01バイナリファイルの一括解析
- 02関数をC風疑似コードに逆コンパイル
- 03関数、文字列、シンボルの出力
- 04関数呼び出しグラフの生成
- 05プロセッサー構成と解析オプションの指定
活用シーン
- 01バイナリの疑似コードを確認
- 02未知のプログラムやファームウェアを調査
- 03文字列と関数シグネチャを抽出
- 04呼び出し関係と制御フローを分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trailofbits/ skills-curated --skill ghidra-headlessインストール後、Claude Code で/ghidra-headlessを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/find-ghidra.shghidra-analyze.shscripts/ghidra_scripts/ExportAll.javaExportCalls.javaExportDecompiled.javaExportFunctions.javaExportStrings.javaExportSymbols.java詳細
Ghidra ヘッドレス解析
Ghidra の analyzeHeadless ツールを使用して、自動リバースエンジニアリングを実行します。
バイナリをインポートして解析し、C コードにデコンパイルして、有用な情報を抽出します。
使用する場面
- バイナリをレビュー用の C 疑似コードにデコンパイルする
- 実行ファイルから関数シグネチャ、文字列、シンボルを抽出する
- 呼び出しグラフを解析して、バイナリの制御フローを把握する
- 不明なバイナリやファームウェアイメージをトリアージする
- 比較のために複数のバイナリを一括解析する
- ソースコードにアクセスせず、コンパイル済みコードをセキュリティ監査する
使用しない場面
- ソースコードがある場合 — 代わりにソースコードを直接確認してください
- 対話型デバッグが必要な場合 — GDB、LLDB、または Ghidra GUI を使用してください
- バイナリが .NET アセンブリの場合 — dnSpy または ILSpy を使用してください
- バイナリが Java バイトコードの場合 — jadx または cfr を使用してください
- 動的解析が必要な場合 — デバッガーまたはサンドボックスを使用してください
クイックリファレンス
| タスク | コマンド |
|---|---|
| すべてのエクスポートを含む完全な解析 | {baseDir}/scripts/ghidra-analyze.sh -s ExportAll.java -o ./output binary |
| C コードにデコンパイル | {baseDir}/scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output binary |
| 関数の一覧表示 | {baseDir}/scripts/ghidra-analyze.sh -s ExportFunctions.java -o ./output binary |
| 文字列の抽出 | {baseDir}/scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output binary |
| 呼び出しグラフの取得 | {baseDir}/scripts/ghidra-analyze.sh -s ExportCalls.java -o ./output binary |
| シンボルのエクスポート | {baseDir}/scripts/ghidra-analyze.sh -s ExportSymbols.java -o ./output binary |
| Ghidra のパスを確認 | {baseDir}/scripts/find-ghidra.sh |
前提条件
- Ghidra がインストールされている必要があります。macOS の場合:
brew install --cask ghidra - Java(OpenJDK 17 以降)が使用可能である必要があります
このスキルは、一般的なインストール先から Ghidra を自動的に検出します。Ghidra が標準以外の場所にインストールされている場合は、GHIDRA_HOME 環境変数を設定してください。
メインラッパースクリプト
{baseDir}/scripts/ghidra-analyze.sh [options] <binary>
プロジェクトの作成とクリーンアップを処理し、analyzeHeadless のよりシンプルなインターフェイスを提供するラッパーです。
オプション:
-o, --output <dir>— 結果の出力ディレクトリ(デフォルト:現在のディレクトリ)-s, --script <name>— 解析後に実行するスクリプト(繰り返し指定可能)-a, --script-args <args>— 最後に指定したスクリプトに渡す引数--script-path <path>— 追加のスクリプト検索パス-p, --processor <id>— プロセッサ/アーキテクチャ(例:x86:LE:32:default)-c, --cspec <id>— コンパイラ仕様(例:gcc、windows)--no-analysis— 自動解析をスキップする(高速になりますが、得られる情報は少なくなります)--timeout <seconds>— ファイルごとの解析タイムアウト--keep-project— 解析後も Ghidra プロジェクトを保持する--project-dir <dir>— Ghidra プロジェクトのディレクトリ(デフォルト:/tmp)--project-name <name>— プロジェクト名(デフォルト:自動生成)-v, --verbose— 詳細な出力
組み込みエクスポートスクリプト
ExportAll.java
サマリー、デコンパイル結果、関数一覧、文字列、興味深いパターンをエクスポートします。呼び出しグラフとシンボルは含まれません。必要に応じて ExportCalls.java と ExportSymbols.java を別途実行してください。初期解析に最適です。
出力ファイル:
{name}_summary.txt— 概要:アーキテクチャ、メモリセクション、関数数{name}_decompiled.c— すべての関数を C にデコンパイルした結果{name}_functions.json— シグネチャと呼び出し情報を含む関数一覧{name}_strings.txt— 検出されたすべての文字列(プレーンテキスト。JSON 形式には ExportStrings.java を使用){name}_interesting.txt— セキュリティ関連パターンに一致する関数
{baseDir}/scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
ExportDecompiled.java
すべての関数を C 疑似コードにデコンパイルします。
出力: {name}_decompiled.c
ExportFunctions.java
アドレス、シグネチャ、パラメーター、呼び出し関係を含む関数一覧を JSON としてエクスポートします。
出力: {name}_functions.json
ExportStrings.java
アドレスとともにすべての文字列(ASCII、Unicode)を抽出します。
出力: {name}_strings.json
ExportCalls.java
呼び出し元と呼び出し先の関係を示す関数呼び出しグラフをエクスポートします。完全な呼び出しグラフ、エントリーポイントの候補、最も頻繁に呼び出される関数が含まれます。
出力: {name}_calls.json
ExportSymbols.java
すべてのシンボル(インポート、エクスポート、内部シンボル)をエクスポートします。
出力: {name}_symbols.json
よくあるワークフロー
不明なバイナリを解析する
mkdir -p ./analysis
{baseDir}/scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis unknown_binary
cat ./analysis/unknown_binary_summary.txt
cat ./analysis/unknown_binary_interesting.txt
ファームウェアを解析する
{baseDir}/scripts/ghidra-analyze.sh \
-p "ARM:LE:32:v7" \
-s ExportAll.java \
-o ./firmware_analysis \
firmware.bin
関数をすばやく一覧表示する
{baseDir}/scripts/ghidra-analyze.sh --no-analysis -s ExportFunctions.java -o . program
cat program_functions.json | jq '.functions[] | "\(.address): \(.name)"'
特定のパターンを検索する
# After running ExportDecompiled, search for patterns
grep -n "password\|secret\|key" output_decompiled.c
grep -n "strcpy\|sprintf\|gets" output_decompiled.c
アーキテクチャ/プロセッサ ID
-p オプションでよく使われるプロセッサ ID:
| アーキテクチャ | プロセッサ ID |
|---|---|
| x86 32 ビット | x86:LE:32:default |
| x86 64 ビット | x86:LE:64:default |
| ARM 32 ビット | ARM:LE:32:v7 |
| ARM 64 ビット | AARCH64:LE:64:v8A |
| MIPS 32 ビット | MIPS:BE:32:default または MIPS:LE:32:default |
| PowerPC | PowerPC:BE:32:default |
トラブルシューティング
Ghidra が見つからない
{baseDir}/scripts/find-ghidra.sh
# Or set GHIDRA_HOME if in non-standard location
export GHIDRA_HOME=/path/to/ghidra_11.x_PUBLIC
解析に時間がかかりすぎる
{baseDir}/scripts/ghidra-analyze.sh --timeout 300 -s ExportAll.java binary
# Or skip analysis for quick export
{baseDir}/scripts/ghidra-analyze.sh --no-analysis -s ExportSymbols.java binary
メモリ不足
実行前に設定します:
export MAXMEM=4G
誤ったアーキテクチャが検出される
プロセッサを明示的に指定します:
{baseDir}/scripts/ghidra-analyze.sh -p "ARM:LE:32:v7" -s ExportAll.java firmware.bin
ヒント
- まず ExportAll.java を使います — すべての情報が得られ、サマリーで全体像を把握できます
- interesting.txt を確認します — セキュリティに関連する関数が自動的に強調表示されます
- JSON の解析には jq を使います — JSON エクスポートは機械可読形式で設計されています
- 逆コンパイルは完璧ではありません — ガイドとして使い、逆アセンブル結果と照合してください
- 大きなバイナリの解析には時間がかかります —
--timeoutを使い、すばやくスキャンするには--no-analysisの使用を検討してください