A Ghidra extension that enhances the decompiler with C++ reverse engineering utilities, including VTable reconstruction, struct field navigation, and inter-procedural taint analysis.
Select a memory region in the Listing view and instantly create a struct with automatic field naming based on symbol references.
Capabilities:
- Select any memory range containing pointers
- Automatically resolves pointer targets to symbols/functions
- Creates sanitized field names from referenced symbols
- Applies the new struct at the selection address
Capabilities:
- Right-click on a vtable label or DATA reference in the decompiler
- Automatically scans for valid function pointers (supports 32/64-bit)
- Creates a struct with fields named after target functions
- Handles duplicate function names with automatic suffixes
- Updates existing vtable structures when the table changes
Double-click or use Ctrl+G on struct field names in the decompiler to navigate directly to the referenced function or label.
Use case: When analyzing a vtable like vtable->doSomething, double-clicking on doSomething jumps directly to that function.
- Download the latest
.zipfrom the Releases page - In Ghidra: File → Install Extensions → Add Extension
- Select the downloaded zip file
- Restart Ghidra
# Set your Ghidra installation path
export GHIDRA_INSTALL_DIR="/path/to/ghidra"
# Build the extension
gradle buildExtensionThe built extension will be in dist/.
- In the Decompiler view, locate a constructor or function that references a vtable
- Right-click on the vtable label (e.g.,
PTR_LAB_10154100) - Select "Create/Update VTable Structure"
- Enter a name for the vtable struct
- The plugin creates the struct and applies it at the vtable address
- Double-click on any struct field name in the decompiler
- Or use Ctrl+G with the cursor on a field name
- The plugin navigates to the target function/label if found
- In the Listing view, select a memory region (click and drag)
- Right-click and select "Create Struct from Selection"
- Enter a name for the new struct
- The struct is created with pointer fields named after referenced symbols
You can drive several binaries at once, one Claude Code session per Ghidra instance, with no cross-talk. Each Ghidra instance runs its own MCP server on its own port; each Claude session is routed to exactly one of them.
How it works
- When the MCP server starts, it grabs the first free port in
13100–13149and advertises itself in~/.ghidra-mcp/server-<pid>.json(port, project, and the loaded binary name). Stale files from crashed instances are pruned on start. - The committed
.mcp.jsonreads${GHIDRA_MCP_URL:-http://localhost:13100/sse}, so theGHIDRA_MCP_URLset in a terminal decides which Ghidra that Claude session talks to. Unset, it falls back to the default port (single-session use).
Workflow
-
Open each binary in its own Ghidra instance and start its MCP server (
Tools → MCP Server → Start, or enable MCP Auto Start in the options). -
In a terminal, launch Claude bound to a specific instance. PowerShell:
./tools/ghidra-claude.ps1 -Binary libfoo.so # route to the instance with libfoo.so open ./tools/ghidra-claude.ps1 -List # list every live server first ./tools/ghidra-claude.ps1 -Port 13101 # pin an exact port
Or Bash (Linux/macOS/Git Bash — needs
curland eitherjqorpython):./tools/ghidra-claude.sh --binary libfoo.so ./tools/ghidra-claude.sh --list ./tools/ghidra-claude.sh --port 13101
The launcher exports
GHIDRA_MCP_URLand startsclaudein the same shell. Repeat in another terminal for another binary — the sessions never share state.
Because each session targets a separate Ghidra process (separate JVM and project database), edits, analysis, and decompilation in one can't damage or override another. Working two sessions on the same binary is not recommended — the database is protected from corruption, but the sessions will logically overwrite each other's renames/structs.
- Ghidra 11.0 or later
- Java 17 or later
- Gradle (version matching your Ghidra installation)
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Tomer Goldschmidt

