REA (Reverse Engineer Anything) le da a tu agente de IA las herramientas de un ingeniero inverso: le deja abrir programas de los que no tienes el código fuente, seguir cómo funcionan por dentro y explicártelo con pruebas. Contamos qué es en la noticia de su lanzamiento; desde entonces ha pasado de 103,000 a más de 240,000 estrellas en GitHub y saca versiones casi a diario. Esta guía es la parte práctica: instalarlo, conectarlo con tu agente, hacer los primeros análisis, tenerlo al día y quitarlo, con cada orden ejecutada de verdad.
Las piezas, en un minuto
REA no es un programa con ventanas: es un servidor MCP, el protocolo con el que los agentes de IA usan herramientas externas, y también una orden de terminal, rea. Tu agente le pide cosas («analiza esta app», «busca dónde se usa esta cadena») y REA las hace en tu equipo con sus analizadores propios o con un desensamblador como Ghidra, Hopper o IDA. Lo que devuelve son evidencias: cada dato acompañado de dónde salió y de qué no se pudo comprobar.
Antes de empezar
- Node.js y npm. REA pide Node.js 22 (desde la 22.19), 24 (desde la 24.11) o 26 en adelante. Compruébalo con
node --version. - En Linux, la orden
psdel paquete procps; en algunas imágenes mínimas de Docker no viene. - Un agente compatible, si quieres usarlo con IA: Claude Code, Codex, Cursor, Gemini CLI, Windsurf, VS Code, GitHub Copilot CLI y una veintena más. Sin agente, todo funciona igual desde la terminal.
- Solo para binarios nativos (ejecutables de C, C++, Swift…): Ghidra, Hopper o IDA. Para JavaScript, Electron, .NET, Go o Rust no hacen falta.
rea-agents de npm.Instalar REA
La forma más directa es instalar la orden rea de forma global con npm:
npm install --global rea-agents
salida, últimas líneas y tiempo total39 packages are looking for funding run `npm fund` for details (197 s)
Tardó 197 segundos, y casi todo es por una dependencia: Frida, una herramienta de instrumentación que se descarga ya compilada desde GitHub. En nuestra primera prueba esa descarga se quedó colgada a medias; al repetir la instalación funcionó. Si te pasa, cancela con Ctrl+C y vuelve a lanzarla. Para comprobar que está:
rea --version
salida6.5.0
rea --help lista todas las órdenes: en la 6.5.0 son 155, una por cada cosa que REA sabe hacer, desde analyze-javascript-application hasta list-adb-devices para móviles Android. No hace falta aprendérselas: el agente las elige, y en la terminal solo usarás unas pocas.
Si no quieres instalar nada de forma permanente, cualquier orden funciona también con npx, que descarga REA, lo ejecuta y no deja la orden rea instalada: npx -y rea-agents@latest --help.
Comprobar que todo está listo: rea doctor
rea doctor revisa tu instalación sin cambiar nada y dice qué falta para cada tipo de análisis. Con --filter-output dejamos solo la lista de comprobaciones:
rea doctor --filter-output scope_checks
salida en el contenedor recién instaladoscope_checks[7]:
- name: node
ok: true
classification: healthy
detail: 24.22.0
details:
runtime: node
version: 24.22.0
- name: host
ok: true
classification: healthy
detail: debian 13
- name: hopper
ok: false
classification: missing_analysis_engine
remediation: "Run rea setup to install Hopper, or set HOPPER_LAUNCHER_PATH."
- name: ghidra
ok: false
classification: missing_analysis_engine
detail: GHIDRA_INSTALL_DIR is not set
remediation: Set GHIDRA_INSTALL_DIR to an extracted Ghidra 12.1.x release directory.
- name: ida-registration
ok: false
classification: missing_analysis_engine
detail: IDA MCP registration is not configured.
remediation: Set REA_IDA_MCP_CONFIG to your upstream IDA MCP registration JSON; see docs/ida-provider.md.
- name: jadx
ok: false
classification: missing_analysis_engine
detail: Set REA_JADX_MCP_JAR to the absolute path of a caller-supplied jadx-headless-mcp 0.7.1 JAR. REA does not download or install it.
remediation: Set REA_JADX_MCP_JAR to the absolute path of a caller-supplied jadx-headless-mcp 0.7.1 JAR. REA does not download or install it.
- name: "skill:identity"
ok: false
classification: config_drift
detail: Installed REA skill identity is missing.
remediation: Run rea setup to update the installed REA skill.Se lee por bloques. Node.js y el sistema están bien (ok: true). Hopper, Ghidra, IDA y JADX (el de Android) aparecen como missing_analysis_engine: no están instalados, y cada uno trae su remedio. No es un problema si no vas a analizar binarios nativos ni APK. La última, skill:identity, dice que todavía no hemos conectado REA con ningún agente: es el paso siguiente.
Conectar REA con tu agente
rea setup registra REA en la configuración de tus agentes e instala sus instrucciones de trabajo (la skill, que le explica al agente cómo investigar con REA). Sin opciones, pregunta qué agentes configurar y enseña el plan antes de tocar nada. Para verlo sin aplicarlo, --dry-run; aquí, para Claude Code:
rea setup --client claude_code --dry-run
salida, solo el estado y el planstatus: planned
plannedActions[2]{id,kind,label,target,detail,external,operation}:
"configure_client:claude_code",configure_client,Claude Code,/home/node/.claude.json,"Add the REA MCP registration for Claude Code; preserve unrelated configuration. The backup path reflects the configuration inspected for this plan; if that file changes before execution, setup will select a recovery path for its current contents. Command: \"/home/node/.npm-global/bin/rea\" \"mcp\". No additional provider environment variables. Existing server environment overrides are retained.",false,create
"install_skill:claude_code",install_skill,REA skill for Claude Code,/home/node/.claude/skills/reverse-engineer-anything,Install or update the REA skill in Claude Code's personal skill directory.,false,installDos acciones: añadir REA a ~/.claude.json conservando el resto de la configuración y copiar la skill en ~/.claude/skills/. Si te parece bien, se aplica igual sin --dry-run (aquí con --yes para no responder a las preguntas):
rea setup --client claude_code --yes
salida, resumidastatus: ready
appliedActions[2]: configured_claude_code,installed_skill
clients:
claude_code:
status: configuredcat ~/.claude.json: lo que añadió{
"mcpServers": {
"rea": {
"command": "/home/node/.npm-global/bin/rea",
"args": [
"mcp"
]
}
}
}Eso es todo lo que hace la conexión: decirle al agente que, cuando quiera usar REA, arranque rea mcp. Después hay que reiniciar el agente para que lo cargue. Para otros agentes cambia el valor de --client, o usa --all-detected para configurar todos los que encuentre:
| Agente | --client |
|---|---|
| Claude Code · Claude Desktop | claude_code · claude_desktop |
| Codex · Cursor · Windsurf | codex · cursor · windsurf |
| Gemini CLI · Antigravity | gemini_cli · antigravity |
| VS Code · GitHub Copilot CLI | vscode · copilot_cli |
| OpenCode · Qwen Code · DeepSeek Harness | opencode · qwen_code · dsh |
La lista completa, con 24 agentes, está en la guía de instalación de REA.
Primer análisis: una app de Electron
Muchas apps de escritorio (Slack, Notion, VS Code, Discord…) están hechas con Electron: por dentro son JavaScript, y REA puede reconstruir cómo se comunican sus partes sin ejecutarlas. Para probarlo escribimos una app de notas mínima. Su parte interesante es el preload, el puente que decide qué puede pedir la interfaz al proceso principal:
// Puente entre la interfaz y el proceso principal: solo expone tres funciones
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('notas', {
buscar: (texto) => ipcRenderer.invoke('notas:buscar', texto),
guardar: (nota) => ipcRenderer.invoke('notas:guardar', nota),
copiar: (texto) => ipcRenderer.send('notas:copiar', texto),
});Y, en el proceso principal, quién atiende cada petición:
ipcMain.handle('notas:buscar', (_evento, texto) => buscar(almacen.todas(), texto));
ipcMain.handle('notas:guardar', (_evento, nota) => almacen.guardar(nota));
ipcMain.on('notas:copiar', (_evento, texto) => clipboard.writeText(texto));Le pedimos a REA que la analice. En una app instalada apuntarías a su carpeta de recursos o a su archivo app.asar; aquí, a la carpeta del proyecto:
rea analyze-javascript-application /home/node/notas-app --json > app.json
El resultado ocupa 970 KB para una app de siete archivos: está pensado para el agente, con cada hallazgo, su archivo, su línea y su huella. Para leerlo tú, REA tiene una orden que saca un resumen, inspect-analysis-view, que recibe la evidencia y la vista que quieres. El JSON de entrada se arma con una línea de Node.js:
node -e 'const fs=require("fs");fs.writeFileSync("v.json",JSON.stringify({source:{kind:"inline",evidence:JSON.parse(fs.readFileSync("app.json"))},view:{kind:"summary"}}))'
rea inspect-analysis-view ./v.json --filter-output normalized_result.summary.statistics,normalized_result.summary.electronsalidanormalized_result:
summary:
statistics:
relevant_files: 7
nested_asar_containers: 0
text_bytes_read: 3404
invalid_utf8_files: 0
parsed_javascript_files: 5
visited_ast_nodes: 538
findings: 32
modules: 0
parse_failures: 0
electron:
browser_windows: 1
explicit_web_preferences: 2
preload_entrypoints: 1
context_bridge_apis: 1
exposed_api_members: 3
ipc:
operations: 6
literal_channels: 3
dynamic_channel_operations: 0
renderer_transmissions: 3
renderer_listeners: 0
main_handlers: 3
paired_renderer_transmissions: 3
ambiguous_renderer_transmissions: 0
unpaired_literal_renderer_transmissions: 0
sender_validation_observations: 0
utility_processes: 0
resolved_utility_entrypoints: 0
native_addon_bindings: 0
resolved_native_addon_bindings: 0Sin ejecutar nada, REA ha encontrado una ventana (browser_windows: 1), un preload, un puente que expone tres funciones y tres canales IPC, cada uno con su emisor en la interfaz y su manejador en el proceso principal (paired_renderer_transmissions: 3).
Y hay un dato que merece atención: sender_validation_observations: 0. Ningún manejador comprueba desde qué página le llega el mensaje. En nuestra app de juguete no importa, pero en una app real que carga contenido de internet es justo lo que las recomendaciones de seguridad de Electron piden revisar, y es el tipo de hallazgo del caso de Notion que contamos en la noticia. La corrección sería algo así (no la ejecutamos en las pruebas):
ipcMain.handle('notas:buscar', (evento, texto) => {
// Solo se aceptan mensajes de las páginas locales de la propia app
if (new URL(evento.senderFrame.url).protocol !== 'file:') throw new Error('remitente no permitido');
return buscar(almacen.todas(), texto);
});Pedírselo al agente
Lo anterior es lo que el agente hace por ti, con la diferencia de que él encadena las órdenes: analiza, mira el resumen, sigue un canal o una cadena con trace-application-feature, abre el archivo concreto y te lo explica. Con REA conectado, basta con pedirlo en lenguaje normal. Estos son ejemplos de peticiones (no los lanzamos: en el contenedor no había agente):
Analiza la app de /Applications/Notas.app con REA. Explícame qué canales IPC expone el preload, qué hace cada manejador del proceso principal y si alguno no comprueba el remitente. Para cada afirmación, dame el archivo y la línea.
Con REA, averigua cómo implementa la búsqueda esta app y construye una versión parecida en mi proyecto. Separa lo que está comprobado de lo que es una suposición.
La última frase no es decorativa: REA marca cada dato como observado, inferido o desconocido, y pedir que el agente respete esa diferencia evita que convierta una suposición en un hecho.
Un binario de Go: qué lleva dentro
REA también lee los datos que el compilador de Go guarda dentro de cada ejecutable, sin ejecutarlo y sin tener Go instalado. Compilamos este programa, que usa una librería externa:
// Programa mínimo con una dependencia, para ver qué cuenta REA de un binario de Go sin ejecutarlo
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
fmt.Println("Hola desde decodigo.com, pedido", uuid.NewString())
}rea inspect-go-binary ./saludo
salida, filtrada a los campos principalesnormalized_result:
format: elf
architecture: amd64
build_info:
go_version: go1.25.14
module:
path: decodigo.com/saludo
dependencies[1]{path,version,sum,replacement}:
github.com/google/uuid,v1.6.0,"h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=",null
settings[7]{key,value}:
"-buildmode",exe
"-compiler",gc
"-trimpath","true"
CGO_ENABLED,"0"
GOARCH,amd64
GOOS,linux
GOAMD64,v1Del archivo compilado salen la versión exacta del compilador (go1.25.14), el módulo, cada dependencia con su versión y su suma de comprobación, y cómo se compiló. Sirve para auditar programas que ya tienes instalados: si mañana se publica un fallo en una versión concreta de una librería, puedes saber qué ejecutables la llevan sin buscar su código fuente. Con inspect-rust-binary se hace lo mismo con programas de Rust, siempre que se compilaran con cargo-auditable, que es el que guarda esa lista.
Binarios nativos: Ghidra, Hopper o IDA
Para programas compilados a código máquina (C, C++, Objective-C, Swift…), REA necesita un desensamblador que haga el trabajo pesado y le sirve sus resultados al agente: el pseudocódigo de cada función, las cadenas, las llamadas y las referencias. No lo probamos en el contenedor; según la documentación:
| Motor | Cómo se conecta |
|---|---|
| Hopper (de pago, con modo de prueba; macOS y Linux) | rea setup puede instalarlo si lo apruebas; o indicas su ruta con HOPPER_LAUNCHER_PATH |
| Ghidra (gratuito, de la NSA) | descargas Ghidra 12.1 y defines GHIDRA_INSTALL_DIR con su carpeta; en Windows, de forma experimental |
| IDA (de pago) | a través de un servidor MCP de IDA, que se indica con REA_IDA_MCP_CONFIG |
Después de configurarlo, rea doctor debería cambiar su missing_analysis_engine por ok: true. Los detalles de cada uno están en la guía de instalación y en la de análisis nativo.
Tenerlo al día
REA cambia muy deprisa: entre el 3 y el 14 de octubre publicó doce versiones, de la 3.2.0 a la 6.5.0, y el propio proyecto pide actualizar antes de dar un fallo por bueno. Si lo instalaste con npm de forma global:
rea update
salida: ya estaba en la últimastatus: current currentVersion: 6.5.0 latestVersion: 6.5.0 installMethod: npm
Cuando hay versión nueva, la instala y te indica una orden de rea setup para refrescar la conexión con tus agentes y su skill: ejecútala y reinicia el agente. Si usas npx, el equivalente es npx rea-agents@latest setup.
Desinstalar
rea uninstall quita solo lo que puso REA: su registro en cada agente y sus skills. Con --purge-data borra además su caché y su estado, en ~/.rea.
rea uninstall --purge-data
salida, abreviadastatus: complete
items[29], sin los 23 agentes que no estaban configurados{name,status,detail}:
claude_code,removed,Removed registration from /home/node/.claude.json.
skill,removed,"claude_code (/home/node/.claude/skills/reverse-engineer-anything): removed (REA-managed skill files were removed; other files were preserved.) …"
cache,skipped,/home/node/.rea/cache does not exist.
state,skipped,/home/node/.rea/state does not exist.
analysis_engine,retained,Hopper is not owned by REA uninstall.cat ~/.claude.json, después{
"mcpServers": {
}
}No toca Hopper, Node.js, otros servidores MCP ni tus archivos de análisis. La orden rea sigue instalada: para quitarla del todo, npm uninstall --global rea-agents.
Resumen
| Quiero… | Orden |
|---|---|
| instalar REA | npm install --global rea-agents |
| usarlo sin instalarlo | npx -y rea-agents@latest <orden> |
| ver qué falta | rea doctor |
| conectarlo con mi agente | rea setup (o --client claude_code, --dry-run para ver el plan) |
| analizar una app de Electron | rea analyze-javascript-application ruta --json > app.json |
| leer un resumen de ese análisis | rea inspect-analysis-view con view: summary |
| ver la versión y las dependencias de un binario de Go | rea inspect-go-binary ./programa |
| actualizar | rea update · npx rea-agents@latest setup |
| quitarlo de los agentes | rea uninstall --purge-data |
Si es tu primera vez con estos conceptos, te ayudarán las guías de comandos de Linux y Docker, y la noticia de REA con sus tres casos reales: DX-Ball, Notion y Touhou.
Las pruebas se ejecutaron el 14 de octubre de 2026 con rea-agents 6.5.0 y Node.js v24.22.0 en un contenedor desechable de Debian 13; las salidas están copiadas de esa ejecución y se han filtrado con la opción --filter-output de la propia herramienta. Las órdenes con agentes reales y con Ghidra, Hopper o IDA no se ejecutaron. Requisitos, agentes compatibles y desinstalación según el README y la guía de instalación del proyecto; estrellas y versiones, de la API de GitHub y del registro de npm el mismo día. Licencia MIT.
Fuente: morluto/rea en GitHub
