REA, guía práctica: pon a tu agente de IA a desarmar programas, de la instalación al primer hallazgo

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.

Cómo se hicieron las pruebas. Todo se ejecutó en un contenedor desechable de Linux (Debian 13) con Node.js v24.22.0 y REA 6.5.0, la versión del 14 de octubre de 2026. Los programas analizados los escribimos para la guía: una pequeña app de notas hecha con Electron y un programa de Go de diez líneas. La conexión con el agente se aplicó dentro del contenedor, sin ningún agente instalado, así que lo que ves es exactamente lo que REA escribe en la configuración.

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.

Las piezas: quién hace qué cuando le pides a tu agente que investigue un programa todo el análisis ocurre en tu equipo; al modelo solo le llegan los resultados que REA devuelve Tú «¿Cómo funciona la búsqueda de esta app?» Tu agente Claude Code, Codex, Cursor, Gemini CLI… decide qué mirar, explica y programa REA servidor MCP local (rea mcp) analizadores propios: JavaScript y Electron, .NET, Go, Rust, WASM, SQLite… 155 órdenes en la 6.5.0 también desde la terminal Motores externos Ghidra · Hopper · IDA para binarios nativos; los pones tú (o Hopper, setup) El programa un ejecutable, una app, un APK, una web, una captura de red… 1 2 MCP 3 4 Lo que vuelve: evidencias cada dato con su archivo y línea (o dirección), su huella SHA-256 y sus límites 1 pides · 2 el agente llama a REA · 3 REA inspecciona el programa sin subirlo · 4 devuelve evidencias y el agente sigue

Esquema: decodigo.com, a partir de la documentación de REA.

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 ps del 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.
Dos avisos. El primero, legal: el propio proyecto recuerda que REA es para investigación, educación, interoperabilidad, preservación de software y análisis de programas que te pertenecen o que tienes permiso para examinar. Revisa la licencia del programa y la ley de tu país antes de desarmar nada ajeno. El segundo, de seguridad: con la fama han aparecido copias con nombres parecidos. Las únicas fuentes oficiales son el repositorio morluto/rea, la web rea.tools y el paquete 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,install

Dos 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: configured
cat ~/.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 Desktopclaude_code · claude_desktop
Codex · Cursor · Windsurfcodex · cursor · windsurf
Gemini CLI · Antigravitygemini_cli · antigravity
VS Code · GitHub Copilot CLIvscode · copilot_cli
OpenCode · Qwen Code · DeepSeek Harnessopencode · 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.electron
salidanormalized_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: 0

Sin 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).

La app de notas, según REA: tres canales entre la interfaz y el proceso principal reconstruido sin ejecutar la app, solo leyendo sus archivos Interfaz renderer.js window.notas.buscar() window.notas.copiar() Puente (preload) contextBridge → «notas» buscar → invoke guardar → invoke copiar → send Proceso principal main.js · ipcMain handle(notas:buscar) handle(notas:guardar) on(notas:copiar) notas:buscar notas:guardar notas:copiar sender_validation_observations: 0 ningún manejador comprueba desde qué página llega el mensaje: lo que REA pone sobre la mesa para revisar

Esquema: decodigo.com, a partir del resumen de REA de la app de ejemplo.

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,v1

Del 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:

MotorCó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 REAnpm install --global rea-agents
usarlo sin instalarlonpx -y rea-agents@latest <orden>
ver qué faltarea doctor
conectarlo con mi agenterea setup (o --client claude_code, --dry-run para ver el plan)
analizar una app de Electronrea analyze-javascript-application ruta --json > app.json
leer un resumen de ese análisisrea inspect-analysis-view con view: summary
ver la versión y las dependencias de un binario de Gorea inspect-go-binary ./programa
actualizarrea update · npx rea-agents@latest setup
quitarlo de los agentesrea 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