Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Reverse engineer binaries using Ghidra's headless analyzer. Decompile executables, extract functions, strings, symbols, and analyze call graphs without GUI.
.claude/skills/dicklesworthstone-ghidra/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 21% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 19% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 48% | 0% |
Perform automated reverse engineering using Ghidra's analyzeHeadless tool. Import binaries, run analysis, decompile to C code, and extract useful information.
| Task | Command | |------|---------| | Full analysis with all exports | ghidra-analyze.sh -s ExportAll.java -o ./output binary | | Decompile to C code | ghidra-analyze.sh -s ExportDecompiled.java -o ./output binary | | List functions | ghidra-analyze.sh -s ExportFunctions.java -o ./output binary | | Extract strings | ghidra-analyze.sh -s ExportStrings.java -o ./output binary | | Get call graph | ghidra-analyze.sh -s ExportCalls.java -o ./output binary | | Export symbols | ghidra-analyze.sh -s ExportSymbols.java -o ./output binary | | Find Ghidra path | find-ghidra.sh |
brew install --cask ghidraThe skill automatically locates Ghidra in common installation paths. Set GHIDRA_HOME environment variable if Ghidra is installed in a non-standard location.
bash./scripts/ghidra-analyze.sh [options] <binary>
Wrapper that handles project creation/cleanup and provides a simpler interface to analyzeHeadless.
Options:
-o, --output <dir> - Output directory for results (default: current dir)-s, --script <name> - Post-analysis script to run (can be repeated)-a, --script-args <args> - Arguments for the last specified script--script-path <path> - Additional script search path-p, --processor <id> - Processor/architecture (e.g., x86:LE:32:default)-c, --cspec <id> - Compiler spec (e.g., gcc, windows)--no-analysis - Skip auto-analysis (faster, but less info)--timeout <seconds> - Analysis timeout per file--keep-project - Keep the Ghidra project after analysis--project-dir <dir> - Directory for Ghidra project (default: /tmp)--project-name <name> - Project name (default: auto-generated)-v, --verbose - Verbose outputComprehensive export - runs all other exports and creates a summary. Best for initial analysis.
Output files:
{name}_summary.txt - Overview: architecture, memory sections, function counts{name}_decompiled.c - All functions decompiled to C{name}_functions.json - Function list with signatures and calls{name}_strings.txt - All strings found{name}_interesting.txt - Functions matching security-relevant patternsbash./scripts/ghidra-analyze.sh -s ExportAll.java -o ./analysis firmware.bin
Decompile all functions to C pseudocode.
Output: {name}_decompiled.c
bash./scripts/ghidra-analyze.sh -s ExportDecompiled.java -o ./output program.exe
Export function list as JSON with addresses, signatures, parameters, and call relationships.
Output: {name}_functions.json
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"] } ] }
Extract all strings (ASCII, Unicode) with addresses.
Output: {name}_strings.json
bash./scripts/ghidra-analyze.sh -s ExportStrings.java -o ./output malware.exe
Export function call graph showing caller/callee relationships.
Output: {name}_calls.json
Includes:
Export all symbols: imports, exports, and internal symbols.
Output: {name}_symbols.json
bash# 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
bash# Specify ARM architecture for firmware ./scripts/ghidra-analyze.sh \ -p "ARM:LE:32:v7" \ -s ExportAll.java \ -o ./firmware_analysis \ firmware.bin
bash# 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)"'
bash# After running ExportDecompiled, search for patterns grep -n "password\|secret\|key" output_decompiled.c grep -n "strcpy\|sprintf\|gets" output_decompiled.c
bashfor bin in ./samples/*; do name=$(basename "$bin") ./scripts/ghidra-analyze.sh -s ExportAll.java -o "./results/$name" "$bin" done
Common processor IDs for the -p option:
| Architecture | Processor ID | |-------------|--------------| | x86 32-bit | x86:LE:32:default | | x86 64-bit | x86:LE:64:default | | ARM 32-bit | ARM:LE:32:v7 | | ARM 64-bit | AARCH64:LE:64:v8A | | MIPS 32-bit | MIPS:BE:32:default or MIPS:LE:32:default | | PowerPC | PowerPC:BE:32:default |
Find all available processors:
bashls "$(dirname $(./scripts/find-ghidra.sh))/../Ghidra/Processors/"
bash# 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 ...
bash# 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
Edit the analyzeHeadless script or set:
bashexport MAXMEM=4G
Explicitly specify the processor:
bash./scripts/ghidra-analyze.sh -p "ARM:LE:32:v7" -s ExportAll.java firmware.bin
--timeout and consider --no-analysis for quick scans| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,784 | 31,749 | +53% | 1 | 1 | 0% | 3,487 | 4,203 | +21% | 0 | 0 | — |
case-02 | fail→fail | 12,008 | 4,817 | -60% | 1 | 1 | 0% | 2,253 | 2,383 | +6% | 0 | 0 | — |
case-03 | fail→pass | 15,682 | 8,903 | -43% | 1 | 1 | 0% | 3,147 | 3,022 | -4% | 0 | 0 | — |
case-04 | fail→pass | 15,969 | 13,405 | -16% | 1 | 1 | 0% | 2,925 | 3,486 | +19% | 0 | 0 | — |
case-09 | fail→pass | 9,977 | 2,658 | -73% | 1 | 1 | 0% | 1,543 | 2,640 | +71% | 0 | 0 | — |
case-05 | fail→pass | 10,796 | 3,746 | -65% | 1 | 1 | 0% | 1,886 | 2,788 | +48% | 0 | 0 | — |
case-06 | fail→pass | 27,123 | 9,858 | -64% | 1 | 1 | 0% | 3,073 | 2,715 | -12% | 0 | 0 | — |
case-07 | fail→pass | 9,295 | 3,019 | -68% | 1 | 1 | 0% | 1,408 | 2,670 | +90% | 0 | 0 | — |
case-08 | fail→pass | 12,668 | 4,601 | -64% | 1 | 1 | 0% | 1,968 | 2,788 | +42% | 0 | 0 | — |
case-10 | fail→pass | 9,523 | 4,555 | -52% | 1 | 1 | 0% | 1,756 | 2,835 | +61% | 0 | 0 | — |
case-11 | fail→pass | 13,172 | 2,393 | -82% | 1 | 1 | 0% | 2,063 | 2,535 | +23% | 0 | 0 | — |
case-12 | pass→pass | 13,259 | 4,909 | -63% | 1 | 1 | 0% | 2,347 | 2,867 | +22% | 0 | 0 | — |
case-13 | pass→pass | 10,675 | 9,279 | -13% | 1 | 1 | 0% | 1,701 | 3,579 | +110% | 0 | 0 | — |
case-14 | pass→pass | 10,861 | 20,455 | +88% | 1 | 1 | 0% | 2,158 | 6,246 | +189% | 0 | 0 | — |
case-15 | fail→pass | 8,344 | 3,969 | -52% | 1 | 1 | 0% | 1,539 | 2,850 | +85% | 0 | 0 | — |
case-16 | fail→pass | 19,890 | 5,851 | -71% | 1 | 1 | 0% | 1,757 | 2,598 | +48% | 0 | 0 | — |
case-17 | fail→pass | 11,190 | 4,754 | -58% | 1 | 1 | 0% | 2,123 | 2,900 | +37% | 0 | 0 | — |
case-18 | fail→pass | 8,704 | 2,811 | -68% | 1 | 1 | 0% | 1,369 | 2,620 | +91% | 0 | 0 | — |
case-19 | fail→pass | 8,484 | 4,036 | -52% | 1 | 1 | 0% | 1,619 | 2,880 | +78% | 0 | 0 | — |
case-20 | fail→pass | 11,925 | 4,717 | -60% | 1 | 1 | 0% | 1,712 | 2,841 | +66% | 0 | 0 | — |
case-21 | pass→pass | 11,271 | 8,453 | -25% | 1 | 1 | 0% | 1,722 | 3,709 | +115% | 0 | 0 | — |
case-22 | pass→pass | 9,983 | 7,831 | -22% | 1 | 1 | 0% | 1,641 | 3,503 | +113% | 0 | 0 | — |
case-23 | pass→pass | 11,239 | 8,892 | -21% | 1 | 1 | 0% | 2,167 | 3,792 | +75% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +70 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.