IDE de ingeniería inversa agéntica con un desensamblador multiarquitectura en Rust puro, descompilador nativo, depurador y agente LLM para análisis de binarios y trabajo de CTF.
Entorno de ingeniería inversa agéntica: una aplicación de escritorio de la clase de Ghidra con el espíritu de "Cursor para ingeniería inversa". Construida con Tauri 2 (frontend en React + TypeScript) sobre un backend de análisis conectable. El predeterminado es un motor nativo en Rust puro: sin proceso externo, sin dependencia copyleft, multiarquitectura mediante Capstone. También puedes ejecutar el análisis a través de r2 (radare2) o IDA Pro: selecciona cualquiera de los motores y toda la aplicación —las herramientas del agente y la interfaz— lo utiliza en su lugar. La herramienta del agente y la interfaz son independientes del backend; consulta docs/backends.md.

Espacio de trabajo de Cargo en la raíz; la aplicación de escritorio es uno de los paquetes que lo componen.
tauri/ desktop app (Tauri + React)
src/ React frontend
src-tauri/ Tauri Rust backend (engine sessions, agent wiring)
package.json app scripts (Vite, Vitest, Tauri CLI)
crates/
recurse-agent/ agent framework: LLM loop, tool runtime, SQLite memory
recurse-static/ static analysis: ELF/PE/Mach-O parsing, multi-arch disassembly,
CFG and cross-reference recovery, the engine seam
recurse-vtil/ VTIL-inspired de-obfuscation/de-virtualization IL, lifter, optimizer
recurse-mcp/ standalone headless MCP server (stdio) over the engine — no Tauri, no IDA
recurse-debug/ cross-platform debugger (ptrace/Mach/Win32, breakpoints, stepping)
recurse-eval/ headless eval harness (YAML-configured tiers)
justfile single entry point for both halves
recurse-agent es solo el agente; el análisis estático reside en recurse-static y el
depurador en recurse-debug, por lo que el agente no incorpora código de sistema que no
utiliza. Ningún crate depende de Tauri, y cada uno se compila/prueba de forma independiente;
recurse-eval ejecuta el agente sin interfaz. Todos son miembros del workspace, por lo que un
único Cargo.lock y un único target/ cubren todo el repositorio.
Ctrl+L)checksec externo), y recuentos de análisisundefinedN para asignarle un tipo. Un tipo de retorno que establezcas se muestra en la línea de
firma del encabezado. Ambos persisten en SQLite, indexados por función, y borrar una celda la revierte
a lo que indican las instrucciones/clear y a la reapertura, y sirven de base para la siguiente sesiónrecurse-agent) con trazado de depuración por turno; el mismo bucle del agente se ejecuta
en la UI y en el arnés de evaluaciónlift: eleva una función a un IL de desofuscación estilo VTIL y ejecuta
pasadas de propagación/plegado/eliminación de código muerto/resolución de ramas sobre toda la rutina
— útil cuando el desensamblado parece un despachador de VM o una cadena de
predicados opacos (ver docs/vtil-lift.md)decompile genera pseudocódigo similar a C (if/while
estructurados, cobertura total de instrucciones) desde el mismo pipeline de recurse-vtil
— sin herramienta externa, sin necesidad de r2recurse-mcp independiente: el mismo Engine sobre MCP stdio para cualquier
agente compatible con MCP (Claude Code, Cursor, Claude Desktop, …) — sin Tauri, sin
licencia de IDA, sin puente de Python (ver docs/recurse-mcp.md)El análisis pasa por un único trait Engine (crates/recurse-static/src/engine.rs), por lo que el
motor es una elección, no una dependencia obligatoria:
native (por defecto) — análisis de ELF/PE/Mach-O en Rust puro y desensamblado multiarquitectura
(object + capstone): x86/x86-64, ARM, AArch64, MIPS, PowerPC, RISC-V, SPARC, SystemZ,
M68K, BPF. Sin proceso hijo, sin herramienta externa, sin LGPL en la compilación. Incluye un descompilador
(el pipeline lift → optimize → structure de recurse-vtil — ver
docs/vtil-lift.md) y una operación lift para desofuscación estilo VTIL.ida) — análisis sin interfaz y descompilación Hex-Rays opcionales mediante idat.Elige con el menú de ajustes, la variable de entorno RECURSE_BACKEND o la configuración
almacenada. El agente dispone de una única herramienta analyze neutral respecto al backend (functions, disasm, graph,
lift, decompile, xrefs, strings, imports, info, además de raw para la consola del motor) —
filtrada a las operaciones que el motor activo realmente admite, de modo que raw (el nativo no tiene consola) solo
se anuncia cuando está disponible. La interfaz consume tipos de resultado canónicos, no el JSON de ningún motor.
Consulta docs/backends.md para el trait, las elecciones de crates y la justificación
de licencias. Abrir un binario grande es rápido porque el análisis es perezoso: el descubrimiento indexa
las funciones de forma económica y los bloques básicos solo se decodifican cuando se visualiza una función; consulta
docs/lazy-analysis.md.
Enganchar un servidor MCP a IDA/Ghidra, o pegar desensamblado en un agente de CLI, funciona para CTFs de 5 funciones y se desmorona con binarios reales. Recurse es un entorno creado a propósito, no un envoltorio de chatbot: