La mayoría de las personas que intentan hacer ingeniería inversa de un binario lo abren en un editor hexadecimal, se pasan veinte minutos haciendo scroll y se rinden.
No saben qué herramienta carga el archivo. No saben qué prompt extrae la lógica. No saben cómo convertir un muro de código ensamblador en algo que realmente puedan reconstruir.
Este curso de 11 pasos convertirá a Claude Opus 5.5 en una máquina capaz de volver open source cualquier cosa.
Sigue mi Substack para recibir información fresca sobre IA:
La ingeniería inversa no se trata de crackear. Se trata de entender algo lo suficientemente bien como para construir tu propia versión.
El 7 de octubre de 2026, Amjad Masad, CEO de Replit, publicó una sola línea:
https://x.com/amasad/status/2107671204639465961
Debajo, un desarrollador llamado @morluto respondió con las pruebas: un conjunto de herramientas que permite a los agentes manejar Hopper y Ghidra y llegar muy lejos.
Ese proyecto es REA, y superó las 110,000 estrellas en GitHub en cuestión de días.

https://github.com/morluto/rea
No es puro humo. Esa misma semana, un proyecto open source llamado WordCraft lanzó una reconstrucción desde cero (clean-room) de Microsoft y Adobe en Rust puro:

Se construyó observando el comportamiento de Word y Adobe, y leyendo las especificaciones públicas de sus formatos de archivo, sin tocar nunca su código.

Este curso te muestra el camino completo desde un binario sellado hasta una reconstrucción como esa, con Opus 5.5 encargándose de la lectura.
01. El motor - cómo un agente lee un binario
Opus 5.5 no puede ejecutar un desensamblador por su cuenta. Lee texto y escribe texto.
La ingeniería inversa con un agente funciona porque hay una herramienta entre el modelo y el binario: carga el archivo en un motor de desensamblaje real, expone los resultados como funciones invocables y le permite al modelo hacer preguntas.

Esa herramienta es REA, y el motor que está debajo es Hopper, Ghidra o IDA.
El ciclo es simple y se repite: el modelo le pide a REA que inspeccione el objetivo, REA devuelve los hallazgos con la evidencia exacta detrás (direcciones, bytes, pseudocódigo, sitios de llamada), y el modelo usa esos hallazgos para hacer la siguiente pregunta o para escribir y probar una reimplementación.

Todo se ejecuta localmente en tu máquina. No se sube nada excepto los hallazgos que el modelo necesita para razonar, y cada conclusión se etiqueta como una observación, una inferencia o una incógnita.
**
02. La instalación - rea-agents más un desensamblador
La configuración registra el servidor MCP de REA con tu agente e instala las instrucciones del flujo de trabajo correspondientes.
Un solo comando lo hace todo: te muestra cada cambio antes de escribir nada y hace una copia de seguridad de lo que modifica.

Tú pones el desensamblador: Hopper en macOS es el camino más fácil, Ghidra es gratis y multiplataforma, e IDA si ya lo tienes.
1# 1. Registra REA con tu agente (Claude Code, Codex, Cursor, Gemini CLI...)2npx rea-agents setup # muestra los cambios planeados, pregunta antes de escribir34# 2. Un proveedor de análisis profundo. Hopper es el más fluido en macOS;5# setup puede instalarlo tras tu aprobación. Ghidra e IDA los pones tú.6# 3. Instala la CLI de rea para usarla en la terminal y en scripts7npm install --global rea-agents8rea --help910# 4. Reinicia tu agente y luego confirma que las herramientas están activas11claude12> /mcp13 rea: connected14 open_binary, binary_overview, analyze_function, decompile,15 list_procedures, search, xrefs, trace, inspect_artifact,16 analyze_javascript_application, inspect_managed_artifact ...
Los requisitos son modestos: Node.js 22 o superior y npm. El análisis nativo necesita uno de los tres motores; la inspección estática de JavaScript y .NET no requiere ningún motor. Mantén REA actualizado, porque los lanzamientos traen correcciones frecuentes.
1# Reglas internas de ingeniería inversa ( CLAUDE.MD )23## Autoridad4- Analiza solo objetivos que sean de mi propiedad o que esté autorizado a examinar. Indica el motivo una vez.5- Cada afirmación lleva etiqueta: observación (lo vi), inferencia (lo deduje) o desconocido.6- Cita la evidencia: dirección, bytes, pseudocódigo o sitio de llamada. Nada de afirmaciones sin fuentes.78## Flujo de trabajo9- Empieza con el resumen más pequeño, no con un volcado completo. Expande solo si hay un vacío concreto.10- Reutiliza la sesión abierta; nunca repitas un análisis idéntico.11- Separa los hechos estáticos de los hechos en tiempo de ejecución. Nunca asumas ejecución a partir de lecturas estáticas.1213## Reconstrucción14- Construye a partir del COMPORTAMIENTO y las especificaciones públicas, nunca copiando código o recursos.15- Lleva un registro de obligaciones: cada comportamiento recuperado necesita pasar una prueba antes de darlo por "terminado".
Opus 5.5 viene con cinco niveles de esfuerzo: low, medium, high, xhigh y max. Úsalos así:
- Medium para inspeccionar y navegar
- High para anotar funciones comunes
- Max para código ofuscado y cualquier cosa con cálculos intensivos de punteros.
El esfuerzo es el ajuste que más impacto tiene en la calidad de todo este curso.
03. El enrutador - 20 tipos de objetivos, una herramienta para cada uno
El primer error que cometen los principiantes es buscar un desensamblador cuando el objetivo es una app de Electron cuyo JavaScript está ahí mismo, a la vista.
REA enruta el objetivo hacia la herramienta correcta, y tu primer prompt debería hacer lo mismo. Nombra el archivo, nombra la función y deja que el agente elija la herramienta de entrada.

1Quiero entender cómo funciona [FEATURE] en [APP], que está en [ABSOLUTE PATH].23Primero, dime qué tipo de objetivo es (nativo, Electron/JS, .NET, Go, APK, WASM)4y elige la herramienta de REA adecuada para abrirlo. No empieces el análisis profundo todavía.56Luego dame un mapa de un párrafo: con qué está construida la app, qué tan grande es y7dónde buscarías primero [FEATURE]. Mantén separadas las observaciones, inferencias e incógnitas,8y cita la evidencia de todo lo que afirmes.
Apuntar REA a una app de Electron devuelve módulos, importaciones y límites IPC en segundos, sin necesidad de ningún desensamblador.
Apuntarlo a un Mach-O o ELF nativo abre una base de datos de Hopper y te da el camino nativo, más difícil pero más profundo. Saber en cuál estás te ahorra horas.
https://x.com/_vmlops/status/2106690704244420687
04. Reconocimiento - resumen, strings y el grafo de llamadas
Todavía no abras ningún código. Primero pídele a REA un mapa de todo el archivo. Un solo comando te dice en qué tipo de máquina se ejecuta, cuántas funciones tiene y todo el texto legible escondido en él.
Ese texto es la pista más rápida que tienes: direcciones web, mensajes de error y nombres de funciones te dicen qué hace la app antes de leer una sola línea de código.
1rea.open_binary { path: "/Applications/Target.app/Contents/MacOS/Target" }2rea.binary_overview {}3 arch: arm644 functions: 1,284 identified5 segments: __TEXT __DATA __LINKEDIT6 entry: _main @ 0x1000051c078rea.search { query: "http" } # strings + referencias en código9 0x10004a2c0 "https://api.target.app/v3/sync"10 0x10004a300 "Authorization: Bearer "11 0x10004a330 "offline cache miss, falling back"1213rea.xrefs { address: "0x100012ab0" } # ¿quién llama a esto?14 147 references -> core config loader, called everywhere
REA también cuenta cuántas veces se llama a cada función (ese conteo se llama referencias cruzadas, o xrefs).

Una función llamada 147 veces es el corazón de la app y merece tu mayor esfuerzo. Una que se llama dos veces es una pequeña función auxiliar que puedes ignorar hasta que sea importante. Empieza por arriba de esa lista y ve bajando.
05. Descompilar - una función a pseudocódigo
Ahora elige una de esas funciones muy usadas y conviértela en algo que puedas leer. Un descompilador toma las instrucciones de máquina en bruto y las reescribe como código parecido a C.
Se ve tosco: nombres como var_28, lógica enredada, conversiones de tipo por todas partes. Pero puedes leerlo, y que sea legible es todo lo que Opus 5.5 necesita.
Ejecútalo desde la línea de comandos para guardar el resultado, o desde dentro de un chat.
1# Descompila una función por dirección, como JSON que puedes redirigir o guardar2rea decompile /Applications/Target.app/.../Target 0x100012ab0 \3 --provider hopper --json > fn_config_loader.json45# O busca una función por nombre y sigue las referencias6rea function /path/to/Target parseConfig --provider hopper --json7rea xrefs /path/to/Target 0x100012ab0 --provider hopper --json8rea trace /path/to/Target "sync" --provider hopper --json
1// 0x100012ab0 xrefs: 1472void sub_100012ab0(void* arg0) {3 void* var_20 = objc_msgSend(cls_NSJSONSerialization,4 sel_JSONObjectWithData_options_error, arg0, 0x0, 0x0);5 if (var_20 != 0x0) {6 void* var_28 = objc_msgSend(var_20, sel_objectForKey, @"endpoints");7 void* var_30 = objc_msgSend(var_20, sel_objectForKey, @"auth_mode");8 void* var_38 = objc_msgSend(var_20, sel_objectForKey, @"retry_count");9 objc_msgSend(g_sharedConfig, sel_setEndpoints, var_28);10 objc_msgSend(g_sharedConfig, sel_setAuthMode, var_30);11 objc_msgSend(g_sharedConfig, sel_setRetryCount,12 objc_msgSend(var_38, sel_intValue));13 }14}
La demostración oficial de REA sigue una llamada de sonido en el viejo juego DX-Ball hasta la función auxiliar que decide el balance de audio izquierdo-derecho, y luego convierte ese pseudocódigo a medio terminar en C.

El resultado pasa los 3,205 casos de prueba originales y reproduce cada uno de los 63 bytes compilados.

El recorrido completo está en rea.tools/showcase.
06. Anotar - haz que Opus nombre cada variable
Ese código tosco es solo la mitad del trabajo. Ahora entrégaselo a Opus 5.5 y pídele que lo explique y lo limpie.
Renombra las variables crípticas con nombres reales, explica en una frase para qué sirve la función, detecta el patrón que sigue e incluso señala los bugs que la app original dejó pasar.
Pega este prompt en Claude:
1Aquí tienes el pseudocódigo descompilado de una función con 147 referencias cruzadas.23Para esta función:41. Renombra cada variable con un nombre significativo según cómo se usa.52. Explica su propósito en una sola oración.63. Enumera las estructuras de datos que lee y escribe.74. Nombra el patrón (singleton, factory, state machine, observer...).85. Reescríbela como Swift limpio e idiomático (o el lenguaje que impliquen9 las convenciones de llamada), con comentarios de documentación.106. Señala cualquier manejo de errores, validación de entrada o verificación de seguridad faltante.1112Piénsalo a fondo con esfuerzo xhigh antes de responder: razona sobre qué es cada13valor antes de decidir los nombres. Marca todo aquello de lo que no estés seguro.1415[pega el pseudocódigo]
La descompilación te dice qué hace el código. Opus 5.5 te dice por qué, y te da los nombres para reconstruirlo.
https://x.com/0x0SojalSec/status/2108389060192706674
https://x.com/0x0SojalSec/status/2108031166502896035
No todos los objetivos necesitan un desensamblador. La demostración de Notion de REA encuentra la función del portapapeles en el JavaScript de la app, la sigue a través de las capas de Electron hasta el proceso principal y muestra exactamente cómo construye el portapapeles enriquecido: un rastreo completo sin una sola línea de ensamblador. Mira:
07. Ofuscación - el benchmark de Tigress
Algunas apps están diseñadas para resistir exactamente lo que estás haciendo. Su código se revuelve a propósito: la lógica se mezcla, el texto se cifra y se añaden ramas falsas para hacerte perder el tiempo.
Esto se llama ofuscación, y es el único punto donde incluso el mejor modelo batalla. Elastic Security Labs lo midió poniendo a Claude Opus frente al ofuscador Tigress en 20 tareas. Ten estos números en mente.

De esos números se extraen dos lecciones prácticas.
- Primero, un intento fallido cuesta casi el doble que uno exitoso, porque el modelo sigue intentándolo con más fuerza antes de rendirse; así que pon un límite de gasto por función y detente a tiempo.
- Segundo, limpia la basura del código descompilado antes de enviarlo (una herramienta gratuita llamada Caveman elimina alrededor del 75%), para que el modelo concentre su atención en la lógica real y no en el relleno.
Los cinco trucos que realmente vas a encontrar, y cómo se ven al abrir el código:

1Esta función parece ofuscada. Trabaja con esfuerzo máximo (max).231. Identifica las técnicas presentes (aplanamiento de flujo de control, predicados opacos,4 código muerto, cifrado de strings, división de funciones) y señala dónde aparece5 cada una en este código específico.62. Resuélvelas: elimina las ramas muertas, evalúa los predicados opacos, desaplaná el7 dispatch, descifra los strings inline si la clave es recuperable.83. Muestra la función limpia que queda.94. Califica tu confianza del 1 al 10. Si es menor a 6, dime exactamente qué partes son inciertas10 y qué contexto cercano las resolvería. No adivines en silencio.1112[pega el pseudocódigo ofuscado]
08. El enjambre - un controlador manejando workers
Un solo chat no puede leer bien 500 funciones. Olvida lo que vio, llama a lo mismo con tres nombres distintos y empieza a contradecirse.
La solución es un equipo pequeño: un chat controlador que reparte el trabajo y varios chats worker que toman una función cada uno.
El controlador mantiene la visión general y vuelve a unir las piezas.

No necesitas construir nada especial para esto; los dos prompts de abajo son toda la configuración.
1Eres un controlador de ingeniería inversa. El mapa de funciones está en functions.json2(dirección, nombre, tamaño, xref_count).341. Agrupa las funciones por proximidad en el grafo de llamadas; ordena los grupos por cantidad de xrefs.52. Asigna cada grupo a un worker. Nunca analices una función tú mismo.63. Inyecta las structs ya resueltas en el brief de cada worker para que los nombres sean consistentes.74. Cuando un worker devuelva una confianza menor a 6, pon en cola una segunda pasada con el contexto8 de sus vecinos ya resueltos.95. Lleva la cuenta del gasto acumulado de tokens y repórtalo después de cada grupo.
1Eres un worker. Recibes una función descompilada y las structs resueltas hasta ahora.2Devuelve exactamente: dirección, propósito, confianza (1-10), structs_used, structs_new,3clean_source, flags. Reutiliza los nombres de structs existentes; nunca inventes un segundo nombre para4una struct que el controlador ya te dio. Solo una función. Detente cuando termines.
https://x.com/victor_explore/status/2109466356454510612
09. Clean room - cuatro reglas para mantenerte en el lado legal
Una reconstrucción clean room significa que copias lo que la app hace, nunca el código que hay dentro. Si lo haces bien, lo que lances será completamente tuyo. Si lo haces mal, estarás cargando con los derechos de autor de alguien más.

Cuatro reglas te mantienen del lado seguro, y el equipo de WordCraft verifica las cuatro automáticamente en cada build.
- Observa, nunca copies. Ejecuta el objetivo como caja negra, mira lo que hace, captura pantalla solo de su propia ventana. Nunca leas, desensambles ni pegues su código. Nunca copies textos más allá de los nombres simples de las funciones.
- Especificaciones, no código fuente. Los formatos de archivo vienen de estándares públicos (OOXML es ECMA-376 / ISO 29500, además de las especificaciones publicadas de RTF y ODF), nunca de leer el parser de un competidor o cualquier código GPL/LGPL.
- Solo recursos originales. Cada ícono, fuente, plantilla y sonido está generado por código, es de dominio público o tiene licencia abierta, con una fila en un archivo de atribuciones. De lo contrario, una verificación de CI falla el build.
- Separa los dos trabajos. Un agente recupera el comportamiento y escribe una especificación. Un contexto diferente implementa solo a partir de la especificación, sin mirar nunca el análisis original. Esta separación es el límite del clean room.
1A partir del análisis completado, escribe una especificación clean room para una reimplementación.23Describe SOLO el COMPORTAMIENTO. Incluye: cada interfaz pública, el modelo de datos, cada4función visible para el usuario como un requisito comprobable, los formatos de archivo leídos y escritos5(por comportamiento observado y especificación pública), y el manejo de errores.67NO incluyas: direcciones u offsets, nombres de variables de la descompilación, ensamblador,8ni nada copiado del original. Un desarrollador que nunca haya visto el binario debe poder9implementar una versión compatible únicamente con este documento.1011Genera markdown con las secciones: Arquitectura, Modelo de Datos, API Pública, Formatos de Archivo,12Casos de Prueba.
Trabajar a partir de una descripción no es solo una protección legal. Te permite tomar las decisiones correctas para tu propio lenguaje y necesidades, en lugar de heredar decisiones que el autor original tomó hace décadas.

WordCraft es más rápido que Word en algunas partes precisamente porque no copió las entrañas de Word.
10. Creando Apps - doce herramientas profesionales, un solo método
WordCraft no es un caso aislado. Es una app en un estante de doce del equipo de ArtCraft, cada una una reconstrucción clean room de una herramienta por la que ya pagas, todas escritas desde cero en Rust y lanzadas gratis y abiertas en GitHub.
Su lema es "Doce apps. Un oficio", y ese oficio es el método del paso 9: observa el original, lee las especificaciones públicas, construye una versión nueva basándote solo en el comportamiento.

La ventaja de ese método compartido es la misma en todas partes. Sin Electron: cada app es nativa en macOS, Windows y Linux, y todas menos FilmCraft también corren en una pestaña del navegador mediante WebAssembly.
Y como cada acción dentro de ellas es un comando con nombre, las doce pueden ser manejadas por un agente de IA de inmediato.
Cada app Craft se construye de la misma manera, y vale la pena copiar esa estructura. Cada una se apila en capas, y cada capa usa solo la que está debajo, desde las medidas básicas en la parte inferior hasta la ventana en pantalla en la parte superior.
Estas son las capas de WordCraft:

Y cada acción es simplemente un comando con nombre, por lo que una persona haciendo clic, un atajo de teclado y un agente de IA desencadenan exactamente lo mismo. Eso es lo que hace que cualquiera de ellas pueda ser controlada por un agente.
1controlar WordCraft mediante MCP23# Automatización de documentos headless4claude mcp add wordcraft -- wordcraft-cli mcp56# O controlar la app de escritorio en ejecución7wordcraft --control 7981 &8claude mcp add wordcraft-app -- wordcraft-cli mcp --connect 127.0.0.1:7981910# Herramientas: list_commands, execute, batch, type_text, select_text,11# inspect_document, render_page, save_document (+ screenshot/click/key en vivo)12> Abrir report.docx, poner todos los encabezados en negrita de 14pt, exportar a PDF13 ✓ select.all-headings -> 12 seleccionados14 ✓ format.font-size 14 · format.bold15 ✓ export report.pdf (texto seleccionable, marcadores conservados)
https://x.com/yuhasbeentaken/status/2109235513102057828
11. Verificar y lanzar - demuestra la paridad, expón MCP
Nunca tuviste el código fuente del original, así que no puedes compararlo línea por línea.
En su lugar, comparas el comportamiento: dale al original y a tu reconstrucción las mismas entradas y comprueba que produzcan la misma salida.
1Construye un entorno de pruebas de comportamiento que compare el binario original y mi reconstrucción.23Genera 50 entradas: 30 normales, 10 extremas (vacías, tamaño máximo, unicode, caracteres especiales),410 de error (malformadas, campos faltantes, corruptas). Pasa cada una por ambos. Compara la salida5byte por byte donde sea posible, semánticamente en los demás casos. Reporta la tasa de coincidencia, una lista6de divergencias y la gravedad de cada una (cosmética / de comportamiento / crítica). Guárdalo en report.md.
Esta también es la prueba más convincente que puedes mostrarle a cualquiera (el espacio de ingeniería inversa al principio del artículo).

Luego lanza tu reconstrucción de la misma forma que lo hicieron REA y WordCraft: como un servidor MCP, para que el agente de la siguiente persona pueda manejarla igual que tú manejaste REA.
Dale a cada función un nombre y una descripción claros, envuélvela en una herramienta de línea de comandos sencilla y haz que se instale con una sola línea.
https://x.com/0xMovez/status/2108884063515746410
Y prueba sobre la marcha, no al final, porque un error descubierto después de haber construido tres capas encima es muchísimo más caro de arreglar.
Seis errores que te arruinan un fin de semana
- Abrir un desensamblador en una app de Electron. Si el JavaScript está ahí mismo, enruta hacia analyze_javascript_application y sáltate por completo el camino nativo.
- Volcar todo antes de leer nada. Pídele primero un resumen a REA. Extraer toda la app de golpe entierra la lógica real entre ruido y dispara tu factura.
- Leer las funciones en el orden del archivo. Ordena por cantidad de referencias cruzadas. La función con 147 xrefs es la arquitectura; la auxiliar con 2 xrefs puede esperar.
- Insistir con la ofuscación de nivel 3. El benchmark resuelve el 0% de las multicapa. Pon un presupuesto, guarda el contexto de los vecinos y vuelve más tarde.
- Dejar que el modelo copie código en tu reconstrucción. Eso rompe el clean room. Primero la especificación en un contexto, luego la implementación a partir de ella en otro.
- Lanzar sin un reporte de paridad. "Creo que coincide" no es evidencia. 50 pruebas de comportamiento y una tasa de coincidencia sí lo son.
Conclusión:
Instala REA. Lee el binario. Reconstrúyelo como tuyo.
Enruta el objetivo, mapea su superficie, descompila las funciones clave, deja que Opus 5.5 nombre todo, rompe la ofuscación que valga la pena romper, escala con un enjambre, luego documenta la especificación limpia y lanza la reconstrucción mediante MCP.
Once pasos. Un modelo. Cero código copiado.





