Getting Started

Introduction

What RE:GINE is, what it produces and where its limits are.

RE:GINE stands for Ghidra Is Not Enough: Ghidra is the engine, the agent adds the reasoning, the memory and the reporting on top.

You drop a binary, state an objective, and an autonomous LLM agent drives headless Ghidra 12.1.4 through 209 MCP tools to answer your question. The output is a structured Markdown report and an annotated Ghidra project.

Every finished analysis feeds a private, per-user knowledge base (RAG): known functions are recognised across binaries, and later analyses start from what earlier ones learned.

RE:GINE is in active development — surfaces and prompts may still shift between minor versions.

The workspace

Each job opens on a single canvas: the agent conversation, the decompiled view and the program explorer side by side.

The dashboard lists every job with its status, workflow and binary.

The five stages of a job

A job moves through queued → ingesting → analyzing → agent_running → ready (or failed from any state). Every transition publishes a WebSocket event.

  1. Ingest — the binary is loaded into Ghidra. Raw firmware that auto-load cannot handle is deferred: the agent loads it itself.
  2. Workflow select — with auto, a cheap router LLM picks one of the workflow prompts; otherwise the named one is used.
  3. Agent loop — a streaming LLM ↔ Ghidra-MCP tool-call cycle that runs until the model emits a final report. Every turn is stored as a chat message and streamed live.
  4. Save Ghidra — a best-effort save of every open program. A failure here does not fail the job.
  5. Finalize — the report is written to data/reports/<job>.md, stored in the database, and the job is marked ready.

The agent loop in detail

The loop is built around token cost: only about 60 of the 233 Ghidra tools are shown to the model, tool results are bounded and masked, and the history is summarised only once the next prompt approaches the context window. Scripts run in a network-less, read-only sandbox that ships crypto and binary-parsing libraries (the agent is told which) and can receive the binary, or a slice of it, as ./input.bin. The facts the agent pins with record_finding survive history summarisation.

A failed or cancelled job can be restarted (from ingest, nothing kept) or resumed: the Ghidra project and the recorded findings are kept, ingest is skipped and the run gets a fresh budget.

Honest limits

  • An LLM hallucinates. Treat function names, type recoveries, CVE references and exploit claims as hypotheses, not facts.
  • Raw firmware language detection is unreliable — supply hints when you have them.
  • Packed or obfuscated binaries need manual pre-processing first.
  • Dynamic analysis (emulation, debugger) is off by default (ENABLE_DYNAMIC_ANALYSIS=0) and not part of the agent loop.

Built on

ComponentRoleLicense
Ghidra 12.1The analysis engineApache-2.0
bethington/ghidra-mcpVendored submodule exposing the Ghidra tools over a headless REST surfaceApache-2.0
PydanticAIAgent runtime, multi-provider, structured tool calls and streamingMIT
FastAPIOrchestration layer (REST, WebSocket)MIT
FastMCPMCP server and Ghidra bridgeApache-2.0
React, Vite, TailwindSingle-page appMIT
PostgreSQL + pgvectorJobs, conversations, embeddingsPostgreSQL License
SearXNGSelf-hosted web search for the agent (independent aggregate over HTTP)AGPL-3.0
Copyright © 2026