
Agente di reverse engineering open-source basato su IA che utilizza Ghidra e LLM per ricostruire e convalidare funzioni C/C++ da binari.
Agente autonomo di reverse engineering — loop reverser/checker con consapevolezza del sorgente, verificatore obiettivo, motore di parità e backend Ghidra.
Demo: YouTube
re-agent automatizza un flusso di lavoro di reverse engineering combinando un loop reverser/checker con la decompilazione Ghidra tramite ghidra-ai-bridge. La pipeline corrente recupera anche il contesto del progetto sorgente vicino durante la generazione ed esegue un verificatore strutturale conservativo prima di accettare i passaggi del checker.
re-agent reverse --class CTrain
│
├── Config (re-agent.yaml + env + CLI)
│ └── project_profile (stub_markers, hook_patterns, source_layout)
│
├── Orchestrator (single / class runner)
│ ├── Function Picker (ranks by caller count, filters completed)
│ ├── Context Gatherer (decompile + xrefs + structs + source retrieval)
│ │
│ ├── Agent Loop (reverser → checker → fix, max N rounds)
│ │ ├── LLM Providers: Claude | OpenAI-compatible APIs | Codex CLI
│ │ └── Prompt Templates (customizable .md files)
│ │
│ ├── Objective Verifier (call-count + control-flow sanity checks)
│ │
│ ├── Parity Engine (GREEN/YELLOW/RED verification gate)
│ │ ├── Source Indexer (C++ body parser)
│ │ ├── 11 Heuristic Signals (all configurable/toggleable)
│ │ └── Semantic Rules + Manual Approvals
│ │
│ └── Session State (JSON progress file)
│
└── RE Backend: ghidra-ai-bridge
└── Capability flags → graceful degradation
re-agent reverse.ANTHROPIC_API_KEY per ClaudeOPENAI_API_KEY per API compatibili con OpenAIcodex CLI locale per il provider Codexpip install auto-re-agent
# 1. Inizializza la configurazione del progetto
re-agent init
# 2. Modifica re-agent.yaml con le impostazioni del progetto
# 3. Reverse di una singola funzione
re-agent reverse --address 0x6F86A0
# 4. Reverse di tutte le funzioni in una classe
re-agent reverse --class CTrain --max-functions 10
# 5. Esegui controlli di parità
re-agent parity --address 0x6F86A0
# 6. Controlla lo stato
re-agent status
re-agent utilizza un sistema di configurazione a livelli (priorità decrescente): flag CLI > variabili d'ambiente (RE_AGENT_*) > re-agent.yaml > valori predefiniti.
llm:
provider: claude # claude | openai | openai-compat | codex
model: claude-sonnet-4-5-20250929
# api_key: impostata tramite la variabile d'ambiente RE_AGENT_LLM_API_KEY
timeout_s: 1800
backend:
type: ghidra-bridge
cli_path: ~/ghidra-tools/ghidra
orchestrator:
max_review_rounds: 4
max_functions_per_class: 10
objective_verifier_enabled: true
project_profile:
source_root: ./source/game_sa
hook_patterns:
- 'RH_ScopedInstall\s*\(\s*(\w+)\s*,\s*(0x[0-9A-Fa-f]+)'
stub_markers: ["NOTSA_UNREACHABLE"]
stub_call_prefix: "plugin::Call"
Consulta docs/configuration.md per tutte le opzioni.
ANTHROPIC_API_KEYOPENAI_API_KEY, opzionalmente imposta base_urlcodex exec locale con credenziali di accesso ChatGPT; nessuna chiave API richiestaIl motore di parità esegue 11 segnali euristici configurabili per verificare che il codice reversato corrisponda al binario originale:
Il loop di reversal esegue anche un verificatore strutturale conservativo dopo che il checker LLM ha superato. Blocca l'accettazione solo in caso di forti discrepanze come:
Questo è intenzionalmente più ristretto di un controllo di equivalenza completo, ma cattura falsi positivi evidenti prima che vengano registrati come reversal riusciti.
Questo è importante nella pratica perché un checker LLM può comunque dare falsi positivi su codice che sembra plausibile ma che manca della vera struttura di rami o chiamate dal binario.
git clone https://github.com/dryxio/auto-re-agent.git
cd auto-re-agent
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest tests/
ruff check src/
mypy src/re_agent/
MIT
| Comando | Descrizione |
|---|
re-agent init | Genera il file di configurazione re-agent.yaml |
re-agent reverse --address ADDR | Reverse di una singola funzione |
re-agent reverse --class CLASS | Reverse di tutte le funzioni in una classe |
re-agent reverse --dry-run | Mostra cosa sarebbe reversato |
re-agent parity --address ADDR | Esegue controlli di parità su una funzione |
re-agent parity --filter REGEX | Esegue controlli di parità corrispondenti al pattern |
re-agent status | Mostra lo stato del reverse |
re-agent status --class CLASS | Mostra lo stato per una classe specifica |
| Segnale | Livello | Descrizione |
|---|
| Sorgente mancante | RED | Nessun corpo sorgente trovato per la funzione hookata |
| Marcatori stub | RED | Il sorgente contiene marcatori stub (es. NOTSA_UNREACHABLE) |
| Stub banale | RED | Prevalenza di chiamate plugin con corpo minuscolo e nessun flusso di controllo |
| ASM grande, sorgente piccolo | RED | ASM >= 80 istruzioni ma sorgente <= 12 righe |
| Prevalenza di chiamate plugin | YELLOW | Le chiamate plugin dominano il corpo della funzione |
| Corpo corto | YELLOW | Il corpo ha meno di 6 righe |
| Basso numero di chiamate | YELLOW | La decompilazione mostra molti callee ma il sorgente ne ha pochi |
| Sensibilità FP | YELLOW | ASM ha operazioni in virgola mobile ma il sorgente no |
| Discrepanza nel numero di chiamate | YELLOW | Il numero di chiamate nel sorgente differisce significativamente dall'ASM |
| Logica NaN | YELLOW | La decompilazione gestisce NaN ma il sorgente no |
| Wrapper inline | INFO | La funzione è un sottile wrapper inline |