Claude-skill-registry ghidra
Reverse engineer binaries using Ghidra's headless analyzer. Decompile executables, extract functions, strings, symbols, and analyze call graphs without GUI.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ghidra" ~/.claude/skills/majiayu000-claude-skill-registry-ghidra && rm -rf "$T"
skills/data/ghidra/SKILL.mdGhidra Headless Analysis Skill
Perform automated reverse engineering using Ghidra's
analyzeHeadless tool. Import binaries, run analysis, decompile to C code, and extract useful information.
Quick Reference
| Task | Command |
|---|---|
| Full analysis with all exports | |
| Decompile to C code | |
| List functions | |
| Extract strings | |
| Get call graph | |
| Export symbols | |
| Find Ghidra path | |
Prerequisites
- Ghidra must be installed. On macOS:
brew install --cask ghidra - Java (OpenJDK 17+) must be available
The skill automatically locates Ghidra in common installation paths. Set
GHIDRA_HOME environment variable if Ghidra is installed in a non-standard location.
Main Wrapper Script
./scripts/ghidra-analyze.sh [options] <binary>
Wrapper that handles project creation/cleanup and provides a simpler interface to
analyzeHeadless.
Options:
- Output directory for results (default: current dir)-o, --output <dir>
- Post-analysis script to run (can be repeated)-s, --script <name>
- Arguments for the last specified script-a, --script-args <args>
- Additional script search path--script-path <path>
- Processor/architecture (e.g.,-p, --processor <id>
)x86:LE:32:default
- Compiler spec (e.g.,-c, --cspec <id>
,gcc
)windows
- Skip auto-analysis (faster, but less info)--no-analysis
- Analysis timeout per file--timeout <seconds>
- Keep the Ghidra project after analysis--keep-project
- Directory for Ghidra project (default: /tmp)--project-dir <dir>
- Project name (default: auto-generated)--project-name <name>
- Verbose output-v, --verbose
Built-in Export Scripts
ExportAll.java
Comprehensive export - runs all other exports and creates a summary. Best for initial analysis.
Output files:
- Overview: architecture, memory sections, function counts{name}_summary.txt
- All functions decompiled to C{name}_decompiled.c
- Function list with signatures and calls{name}_functions.json
- All strings found{name}_strings.txt
- Functions matching security-relevant patterns{name}_interesting.txt
./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
ExportDecompiled.java
Decompile all functions to C pseudocode.
Output:
{name}_decompiled.c
./scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output program.exe
ExportFunctions.java
Export function list as JSON with addresses, signatures, parameters, and call relationships.
Output:
{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
Extract all strings (ASCII, Unicode) with addresses.
Output:
{name}_strings.json
./scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output malware.exe
ExportCalls.java
Export function call graph showing caller/callee relationships.
Output:
{name}_calls.json
Includes:
- Full call graph
- Potential entry points (functions with no callers)
- Most frequently called functions
ExportSymbols.java
Export all symbols: imports, exports, and internal symbols.
Output:
{name}_symbols.json
Common Workflows
Analyze an Unknown Binary
# 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
Analyze Firmware
# Specify ARM architecture for firmware ./scripts/ghidra-analyze.sh \ -p "ARM:LE:32:v7" \ -s ExportAll.java \ -o ./firmware_analysis \ firmware.bin
Quick Function Listing
# 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)"'
Find Specific Patterns
# After running ExportDecompiled, search for patterns grep -n "password\|secret\|key" output_decompiled.c grep -n "strcpy\|sprintf\|gets" output_decompiled.c
Analyze Multiple Binaries
for bin in ./samples/*; do name=$(basename "$bin") ./scripts/ghidra-analyze.sh -s ExportAll.java -o "./results/$name" "$bin" done
Architecture/Processor IDs
Common processor IDs for the
-p option:
| Architecture | Processor ID |
|---|---|
| x86 32-bit | |
| x86 64-bit | |
| ARM 32-bit | |
| ARM 64-bit | |
| MIPS 32-bit | or |
| PowerPC | |
Find all available processors:
ls "$(dirname $(./scripts/find-ghidra.sh))/../Ghidra/Processors/"
Troubleshooting
Ghidra Not Found
# 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 ...
Analysis Takes Too Long
# 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
Out of Memory
Edit the
analyzeHeadless script or set:
export MAXMEM=4G
Wrong Architecture Detected
Explicitly specify the processor:
./scripts/ghidra-analyze.sh -p "ARM:LE:32:v7" -s ExportAll.java firmware.bin
Tips
- Start with ExportAll.java - It gives you everything and the summary helps orient you
- Check the interesting.txt file - It highlights security-relevant functions automatically
- Use jq for JSON parsing - The JSON exports are designed to be machine-readable
- Decompilation isn't perfect - Use it as a guide, cross-reference with disassembly
- Large binaries take time - Use
and consider--timeout
for quick scans--no-analysis