Model or dataset
symgraph/GhidrAssist avatar
symgraph/GhidrAssist

GhidrAssist: an LLM plugin for Ghidra that keeps its own knowledge graph

An LLM extension for Ghidra to enable AI assistance in RE.

723 stars67 forksJavaMIT

At a glance

What is it?
GhidrAssist wires any OpenAI v1-compatible model into Ghidra's CodeBrowser, and adds a SQLite-backed semantic graph so repeated questions do not re-hit the model. The setup is a manual extension install plus an API host and key, and the graph layer is the part that changes how you work.
Who is it for?
Adopt GhidrAssist if you already live in Ghidra's CodeBrowser and want explanation, summarisation and semantic search without exporting anything to a separate tool. Skip it if you need a supported, single-vendor pipeline, or if you cannot point it at a model endpoint you control.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 109 days ago.
What is it written in?
Mainly Java, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The gap GhidrAssist fills between Ghidra and a chat window

Ghidra gives you a decompiler, a disassembler and a database of analysis results. It does not give you prose. The common workaround is to copy a decompiled function into a browser tab, paste it into a chat interface, and paste the answer back into a rename field. That round trip loses the surrounding context: the callers, the imported APIs, the strings the function touches. GhidrAssist moves the model call inside the CodeBrowser so the context can be assembled from the program database instead of from your clipboard. The README describes it as an LLM-powered plugin for interactive reverse engineering assistance, supporting any OpenAI v1-compatible API, which includes local runtimes such as Ollama, LM-Studio and Open-WebUI alongside OpenAI, Anthropic and Azure. The audience is narrow and specific: someone already fluent in Ghidra who wants a second opinion on a function, a summary of a module, or a searchable index of a binary they have partially analysed. It is not a tool for someone who has never opened a decompiler.

Five levels of summary, stored once and queried without the model

The Graph-RAG system is the part that distinguishes this project from a chat sidebar. The README describes a 5-level semantic hierarchy: Statement, Block, Function, Module, Binary. Summaries are pre-computed by an LLM through a component called SemanticExtractor, which the README says handles function summarisation with batch processing. Those summaries land in SQLite, and the graph structure is held with JGraphT, a Java graph library. Queries then run through GraphRAGEngine, which the README describes as an LLM-free query engine using pre-computed summaries. That is the design bet: pay the model cost once during indexing, then answer structural questions (which functions belong together, what does this module do, where is this string referenced) from local storage. Module boundaries are not hand-drawn. CommunityDetector implements the Leiden algorithm to group related functions into logical modules with their own hierarchical summaries. Full-text search over summaries and security annotations uses SQLite FTS5. Whether the pre-computed summaries are good enough to answer your question is the open question, and it depends on the model you pointed it at during indexing.

Security feature extraction is pattern matching, and the README says so

Alongside the semantic graph, GhidrAssist ships a SecurityFeatureExtractor that does static analysis rather than model inference. The README lists what it looks for: network APIs across POSIX sockets, WinSock, DNS, SSL/TLS, WinHTTP and WinINet; file I/O APIs from POSIX, Windows and the C library; crypto APIs from OpenSSL, Windows crypto and platform-specific sources; and string patterns for IP addresses, URLs, domains, file paths and registry keys. It then assigns a risk level of LOW, MEDIUM or HIGH and produces an activity profile. This is a catalogue of imports and strings, which is useful as a triage signal and misleading if treated as a verdict. A binary that imports SSL/TLS functions and contains URLs is not thereby malicious; it is a binary that talks to the network over TLS. The value here is that the extraction is deterministic and does not consume tokens, so it can run across every function before you decide where to spend model calls. The README also notes that security annotations are indexed in FTS5, which means you can search for them later rather than reading a report once.

Installing the extension and pointing it at a model endpoint

The Quickstart in the README is a manual sequence with no build step described for end users. Copy the binary release ZIP archive to Ghidra_Install/Extensions/Ghidra if it is not already there. Launch Ghidra, then File, then Install Extension, then enable GhidrAssist. Load a binary and launch the CodeBrowser. In the CodeBrowser, go to File, then Configure, then Miscellaneous, and enable GhidrAssist. Then Window, then GhidraAssistPlugin to open the plugin window. Two configuration steps follow: ensure the RLHF and RAG database paths are appropriate for your environment, and point the API host at your preferred provider and set the API key. There is an optional step in the Analysis Options tab to set Reasoning Effort to None, Low, Medium or High for models that support extended thinking, and the README states that this setting persists per program, so different binaries can carry different reasoning levels. Note the naming inconsistency in the README itself: the menu item is written as GhidraAssistPlugin in one place and the window is opened from the Windows menu under the GhidrAssist option. Expect to hunt slightly the first time.

Where the extension assumes more than it can verify

The honest limitation is that GhidrAssist is a client. Everything it produces depends on the model behind the API host, and the README does not describe any evaluation of summary quality, any accuracy figure, or any guard against a model that hallucinates a function name into the semantic graph. Because summaries are pre-computed and persisted, a bad summary becomes a durable artefact: GraphRAGEngine answers from it without re-consulting the model, so the error propagates silently into every later query. The README does mention editable summaries with user-edit protection from auto-overwrite, which is the mitigation, but it requires you to notice the problem first. The second constraint is operational. The README's provider list spans local runtimes and cloud APIs, and the setup instructions are provider-specific links rather than a single recipe, so you are expected to already know how to stand up an OpenAI-compatible endpoint and produce a key. The third is scope: the ReAct agentic mode and function calling let the model rename functions, navigate to addresses and execute Ghidra commands. That is a write path into your analysis database, and the README does not describe a confirmation step or an undo mechanism for those mutations.

How it differs from scripting Ghidra yourself or using a separate decompiler

The obvious alternative is to write Ghidra scripts in Python or Java that call an HTTP endpoint directly. That gives you total control over what context is sent and what is done with the response, and it costs nothing beyond the API calls. What it does not give you is the persistence layer: no SQLite schema, no migration runner, no FTS5 index, no community detection. You would be rebuilding BinaryKnowledgeGraph, AnalysisDB and SchemaMigrationRunner before you got to the interesting part. A second alternative is a standalone decompiler with its own AI features, where the analysis and the model live in one product. The difference in approach is architectural: GhidrAssist is a plugin that inherits Ghidra's program database and its extension mechanism, so it can read decompiled pseudo-C and cross-references directly, but it is also bound to Ghidra's release cycle and to the CodeBrowser UI. If your team has standardised on a different disassembler, this project offers nothing, because the value is in the coupling to Ghidra's analysis, not in the model integration alone.

Upgrades, database migrations and what the MIT licence leaves you to handle

The repository shows a steady release cadence, with 2.0.0 adding the SymGraph service tab, 2.1.0 described as new features, fixes and updates, and 2.2.0 as updates and fixes, all within roughly six weeks. That pace has a cost. The README lists SchemaMigrationRunner as part of the data layer, described as versioned database migrations for transparent upgrades, which tells you the SQLite schema is expected to change between versions and that your AnalysisDB, chat history and RLHF feedback are meant to survive those changes. Back up the database files before upgrading anyway, because a migration runner is a promise about intent, not a guarantee about your particular database state. The licence is MIT, which is permissive and places few obligations on you; it also means no warranty and no support commitment, and the README does not describe a commercial support path. There is a related project, GhidrAssistMCP, referenced for Ghidra-specific MCP tools, which is a separate repository with its own licence and its own release cadence. If you deploy GhidrAssist across a team, the licence question is not the MIT text, it is what your API provider's terms say about the binary contents you are sending to their endpoint.

Reasoning effort, agentic mode and the controls that actually change behaviour

Two settings deserve attention before you judge the tool. The first is Reasoning Effort, exposed in the Analysis Options tab as None, Low, Medium or High, with the README framing it as a quality versus speed trade-off and noting support for OpenAI o1/o3/o4, Claude with extended thinking, and local reasoning models. The README states the setting is provider-agnostic and persisted per program, which is a sensible choice: a stripped binary you are triaging quickly does not need the same depth as the one function you are trying to name correctly. The second is the choice between query modes. The README describes regular queries, MCP-enhanced queries, and full agentic investigation through the ReAct Orchestrator, which runs a Think-Act-Observe loop with todo tracking, iteration history and a final synthesis, and reports metrics for iterations, tool calls and duration. Agentic mode is the expensive path and the one most likely to produce a confident answer you cannot trace, since the README does not describe how the final synthesis cites which tool call produced which finding. For most work, the Explain tab plus the Semantic Graph tab will cover more ground per token than an autonomous investigation loop.

Editorial conclusion

Adopt GhidrAssist if you already live in Ghidra's CodeBrowser and want explanation, summarisation and semantic search without exporting anything to a separate tool. Skip it if you need a supported, single-vendor pipeline, or if you cannot point it at a model endpoint you control. Before committing, load one binary, run the semantic indexing pass, and check what the SemanticExtractor actually wrote into AnalysisDB: the quality of every Graph-RAG answer depends on those summaries, and they are generated once and then trusted.

Official sources

  1. Issues
  2. License: MIT
  3. README
  4. Releases
  5. symgraph/GhidrAssist on GitHub
Community notes

Community notes