ghidra について
ghidra は、Ghidra の analyzeHeadless を使ってリバースエンジニアリングを自動化するスキルです。セキュリティ研究者や分析担当者向けに、バイナリーの逆コンパイルや関数、文字列、シンボル、コールグラフ、概要の出力を支援します。
主な機能
- 01Ghidra のヘッドレス解析を実行
- 02関数を C の疑似コードに逆コンパイル
- 03関数、文字列、シンボルを出力
- 04関数のコールグラフを生成
- 05セキュリティ関連関数を抽出
- 06プロセッサーアーキテクチャと解析設定を指定
活用シーン
- 01未知のバイナリーを解析
- 02指定アーキテクチャでファームウェアを調査
- 03調査用に文字列とシンボルを抽出
- 04呼び出し関係とセキュリティ関連関数を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mitsuhiko/ agent-stuff --skill ghidraインストール後、Claude Code で/ghidraを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
scripts/find-ghidra.shghidra-analyze.shscripts/ghidra_scripts/ExportAll.javaExportCalls.javaExportDecompiled.javaExportFunctions.javaExportStrings.javaExportSymbols.java詳細
Ghidra ヘッドレス解析スキル
Ghidra の analyzeHeadless ツールを使用して、自動でリバースエンジニアリングを実行します。バイナリをインポートして解析し、C コードにデコンパイルして、有用な情報を抽出します。
クイックリファレンス
| タスク | コマンド |
|---|---|
| すべてのエクスポートを含む完全解析 | ghidra-analyze.sh -s ExportAll.java -o ./output binary |
| C コードにデコンパイル | ghidra-analyze.sh -s ExportDecompiled.java -o ./output binary |
| 関数を一覧表示 | ghidra-analyze.sh -s ExportFunctions.java -o ./output binary |
| 文字列を抽出 | ghidra-analyze.sh -s ExportStrings.java -o ./output binary |
| 呼び出しグラフを取得 | ghidra-analyze.sh -s ExportCalls.java -o ./output binary |
| シンボルをエクスポート | ghidra-analyze.sh -s ExportSymbols.java -o ./output binary |
| Ghidra のパスを確認 | find-ghidra.sh |
前提条件
- Ghidra がインストールされている必要があります。macOS の場合:
brew install --cask ghidra - Java(OpenJDK 17 以降)が利用可能である必要があります
このスキルは、一般的なインストールパスから Ghidra を自動的に検索します。Ghidra が標準以外の場所にインストールされている場合は、環境変数 GHIDRA_HOME を設定してください。
メインラッパースクリプト
./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
包括的なエクスポートを実行します。他のすべてのエクスポートを実行し、概要を作成します。初期解析に最適です。
出力ファイル:
{name}_summary.txt- アーキテクチャ、メモリーセクション、関数数の概要{name}_decompiled.c- すべての関数を C にデコンパイルしたもの{name}_functions.json- シグネチャと呼び出し情報を含む関数リスト{name}_strings.txt- 検出されたすべての文字列{name}_interesting.txt- セキュリティ関連のパターンに一致する関数
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
ExportDecompiled.java
すべての関数を C の疑似コードにデコンパイルします。
出力: {name}_decompiled.c
./scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output program.exe
ExportFunctions.java
アドレス、シグネチャ、パラメーター、呼び出し関係を含む関数リストを JSON としてエクスポートします。
出力: {name}_functions.json
{
"program": "example.exe",
"architecture": "x86",
"functions": [
{
"name": "main",
"address": "0x00401000",
"size": 256,
"signature": "int main(int argc, char **argv)",
"returnType": "int",
"callingConvention": "cdecl",
"isExternal": false,
"parameters": [{"name": "argc", "type": "int"}, ...],
"calls": ["printf", "malloc", "process_data"],
"calledBy": ["_start"]
}
]
}
ExportStrings.java
アドレスとともに、すべての文字列(ASCII、Unicode)を抽出します。
出力: {name}_strings.json
./scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output malware.exe
ExportCalls.java
呼び出し元と呼び出し先の関係を示す関数呼び出しグラフをエクスポートします。
出力: {name}_calls.json
含まれる内容:
- 完全な呼び出しグラフ
- エントリーポイントの候補(呼び出し元がない関数)
- 最も頻繁に呼び出される関数
ExportSymbols.java
インポート、エクスポート、内部シンボルを含むすべてのシンボルをエクスポートします。
出力: {name}_symbols.json
一般的なワークフロー
不明なバイナリを解析する
# Create output directory
mkdir -p ./analysis
# Run comprehensive analysis
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis unknown_binary
# Review the summary first
cat ./analysis/unknown_binary_summary.txt
# Look at interesting patterns (crypto, network, dangerous functions)
cat ./analysis/unknown_binary_interesting.txt
# Check specific decompiled functions
grep -A 50 "encrypt" ./analysis/unknown_binary_decompiled.c
ファームウェアを解析する
# Specify ARM architecture for firmware
./scripts/ghidra-analyze.sh \
-p "ARM:LE:32:v7" \
-s ExportAll.java \
-o ./firmware_analysis \
firmware.bin
関数をすばやく一覧表示する
# Just get function names and addresses (faster)
./scripts/ghidra-analyze.sh --no-analysis -s ExportFunctions.java -o . program
# Parse with jq
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
複数のバイナリを解析する
for bin in ./samples/*; do
name=$(basename "$bin")
./scripts/ghidra-analyze.sh -s ExportAll.java -o "./results/$name" "$bin"
done
アーキテクチャ/プロセッサー 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 |
利用可能なプロセッサーをすべて検索:
ls "$(dirname $(./scripts/find-ghidra.sh))/../Ghidra/Processors/"
トラブルシューティング
Ghidra が見つからない
# Check if Ghidra is installed
./scripts/find-ghidra.sh
# Set GHIDRA_HOME if in non-standard location
export GHIDRA_HOME=/path/to/ghidra_11.x_PUBLIC
./scripts/ghidra-analyze.sh ...
解析に時間がかかりすぎる
# Set a timeout (seconds)
./scripts/ghidra-analyze.sh --timeout 300 -s ExportAll.java binary
# Skip analysis for quick export
./scripts/ghidra-analyze.sh --no-analysis -s ExportSymbols.java binary
メモリ不足
analyzeHeadless スクリプトを編集するか、次を設定してください。
export MAXMEM=4G
誤ったアーキテクチャが検出された
プロセッサを明示的に指定してください。
./scripts/ghidra-analyze.sh -p "ARM:LE:32:v7" -s ExportAll.java firmware.bin
ヒント
- まず ExportAll.java を使います - すべての情報が得られ、概要が全体像を把握するのに役立ちます
- interesting.txt ファイルを確認します - セキュリティに関係する関数が自動的に強調表示されます
- JSON の解析には jq を使います - JSON エクスポートは機械可読になるように設計されています
- 逆コンパイルは完璧ではありません - ガイドとして使い、逆アセンブル結果と相互に照合してください
- 大きなバイナリの処理には時間がかかります -
--timeoutを使い、すばやくスキャンする場合は--no-analysisの使用を検討してください