Cómo hacerlo · modelo abierto + harness local + REA

Rompe la restricción: tu agente sin trabas, en tu computadora

Un modelo abierto que no rechaza la ingeniería inversa legítima, el harness dsh en local y REA conectando Ghidra. Le indicas una app y pides tu propia versión.

Tu agente sin trabas: modelo abierto + harness local + REA
En resumen

Esta es una guía para recrear un programa de computadora a tu manera usando tres piezas abiertas: un harness de agente local (el dsh, agente de código de DeepSeek), un modelo abierto «sin trabas» que se ejecuta en Ollama y REA, que le da al agente herramientas de ingeniería inversa como Ghidra. Sirve para quienes programan o estudian y quieren entender cómo funciona una app y hacer su propia versión, sin depender de modelos en la nube que a veces rechazan la solicitud. Todo se ejecuta en tu máquina: necesitas Docker, Ollama, Node 22 y memoria para un modelo de 14 a 24 GB. Espera llegar a alrededor del 80 % de la app, no a los últimos detalles.

Qué es

Tres piezas que encajan

El modelo es el cerebro, el harness es el cuerpo con las herramientas y REA son los ojos que ven dentro de la app compilada.

Harness local, modelo sin trabas, REA + Ghidra, elige el objetivo, itera, uso responsable

🧰 Harness local (dsh)

El banco de trabajo donde vive el agente: lee y escribe archivos, ejecuta comandos y llama a herramientas MCP. Aquí se ejecuta en un contenedor, solo en la dirección local, y permite cambiar el modelo.

🧠 Modelo sin trabas

Una versión «abliterated» de un modelo abierto: le quitaron el reflejo de rechazar. Se ejecuta en Ollama en tu máquina, sin clave de API y sin enviar nada afuera.

🔍 REA + Ghidra

REA (Reverse Engineer Anything) es un servidor MCP y una línea de comandos que proporcionan al agente el análisis de la app: módulos, funciones, conexiones, con evidencia y límites.

Cómo funciona

De la app cerrada a tu versión

El agente no necesita ser genial: REA ya organiza las herramientas y el modelo solo ejecuta. Por eso un modelo abierto de tamaño medio puede con buena parte del trabajo.

Señalas la app→ dsh (harness)→ modelo en Ollama→ REA→ Ghidra o análisis JS→ evidencia→ código nuevo, desde cero→ pruebas e iteras

🎬 El ejemplo del video de referencia

El reproductor de video de Mac (QuickTime) solo ofrece unas pocas velocidades fijas. El agente estudió la app y creó una nueva, con otro nombre ("Tempo") y otro ícono, con velocidad granular, ondas de audio y ajuste de tono. Unos 80% salieron en un solo pedido; el resto fue fuente, visual y exportación.

📏 Las cifras del video (no medidas aquí)

  • 1.ª versión: 20 a 30 min y US$ 4 en un modelo en la nube.
  • Ajustes hasta la versión final: US$ 5 a 6 más.
  • Resultado: ~80% en un solo pedido.
  • Al ejecutarlo localmente, el costo se reduce a la máquina y la energía.
Límites honestos. Lo que está en el servidor del fabricante no viene incluido (por ejemplo: la biblioteca de diagramas SmartArt de PowerPoint está en la nube, así que el clon crea formas y texto, pero no SmartArt). REA lleva hasta ~80%, no hasta el último tramo. Y los modelos de frontera (Claude, Codex, Gemini) a veces rechazan partes de este trabajo y pueden cerrar aún más la puerta: por eso entra en juego el modelo local.
El cerebro

Modelos sin restricciones verificados en Ollama

Solo lo que existe realmente en la página de Ollama al 12/10/2026 (pestaña "tags" de cada modelo). No se descargó ni midió ninguno en esta máquina: el disco estaba al 98%. Elige según el tamaño que quepa en tu memoria.

Modelo (comando exacto)TamañoRecursos en la páginaObservación
ollama pull huihui_ai/Qwen3.8-abliterated:27b18 GB (q4_K_M)tools · thinking · visionLa misma base que qwen3.8:27b, que ya funciona en dsh aquí. Primera opción. no medido
ollama pull huihui_ai/Qwen3.6-abliterated:35b-a3b24 GBtools · thinking · visionMoE (3B activos por token): suele ser rápido. no medido
ollama pull huihui_ai/glm-4.7-flash-abliterated19 GBtools · thinkingFamilia GLM, la misma del ejemplo del video (allí se usó una versión más grande, en la nube). no medido
ollama pull huihui_ai/gpt-oss-abliterated:20b14 GBtools · thinkingEl más pequeño de la lista con herramientas. Bueno para una máquina con 32 GB. no medido
ollama pull huihui_ai/qwen3-coder-abliterated:30b19 GBsin etiqueta "tools" en la páginaEnfocado en código, pero verifica la etiqueta tools: sin llamada a herramientas, el agente no usa REA. no medido
Por qué importa "tools". El harness solo puede usar REA si el modelo sabe llamar a herramientas. En la página de Ollama de cada modelo aparecen las etiquetas tools, thinking, vision. Sin tools, el modelo conversa, pero no actúa.

¿No tienes una máquina para esto? Hay servicios en la nube prepago de terceros (como OpenRouter, que dsh ya admite en el modo ./dsh remoto) que alojan modelos sin restricciones, con crédito de US$ 5 a 10. Así, el código de la app sale de tu máquina, y en el modo remoto dsh no monta ~/projetos a propósito.
Requisitos previos

Qué debe estar listo

Probado como referencia en una máquina Linux ARM (DGX GB10, 128 GB de memoria unificada). En otra máquina, los comandos son los mismos; cambia el tamaño de los modelos que caben.

🐳 Docker + dsh-sandbox

dsh (@deepseek-ai/dsh 0.1.1-rc.1) en un contenedor node:22-slim, límite de 3 GB, usuario sin permisos de root, solo en 127.0.0.1:9080.

cd ~/projetos/dsh-sandbox
./dsh status   # modo, container, http, provedores

🦙 Ollama

Puerto 11434, contexto de 32K y caché KV q8_0 en el servicio. Comprueba qué hay ya y el espacio en disco antes de descargar un modelo.

ollama list
df -h /        # o modelo pede 14 a 24 GB livres

🟢 Node.js 22.19+

REA requiere Node 22.19+, 24.11+ o 26+. El contenedor de dsh ya incluye el 22.23.

docker run --rm node:22-slim node -v   # v22.23.x

🐉 Ghidra 12.1.x + JDK 21 (solo para binario nativo)

Para apps compiladas (C, C++, Swift, Rust). En Linux ARM64, puede que haya que compilar el descompilador nativo por separado. Esta máquina solo tiene JDK 8, así que este camino está no medido. Las apps Electron/JavaScript no necesitan Ghidra.

java -version   # precisa ser 21 ou mais novo
Paso a paso

Cinco pasos, del harness a tu versión

Los prompts completos para copiar y pegar están en la carpeta prompts/ del repositorio (en portugués).

1

Inicia el harness en modo local

El modo local monta ~/projetos en /projetos y deja solo Ollama como proveedor: nada sale de la máquina. Abre el panel y elige el workspace.

cd ~/projetos/dsh-sandbox
./dsh local     # ~20 s; después abre http://127.0.0.1:9080
./dsh status    # debe mostrar: modo local, /projetos montado SÍ, proveedores: ollama
# desde otra máquina: ssh -L 9080:127.0.0.1:9080 usuario@servidor
2

Descarga un modelo sin restricciones y apunta dsh a él

Descarga uno de la tabla de arriba. Después añade el modelo en settings.local.yaml (no en work/.dsh/settings.yaml, que se sobrescribe cada vez que cambias de modo), dentro de llm-pi-ai → providers → ollama → models. El id debe coincidir letra por letra con ollama list.

ollama pull huihui_ai/Qwen3.8-abliterated:27b
ollama list | grep abliterated
# settings.local.yaml — añade a la lista models del proveedor ollama
        - id: huihui_ai/Qwen3.8-abliterated:27b
          name: Qwen3.8 27B sin restricciones
          contextWindow: 32768
          maxTokens: 8192
          reasoningEfforts:
            off: none     # "none" explícito: vacío deja el razonamiento ACTIVADO en Ollama
            low: low
            high: high
            max: high
./dsh local     # copia settings.local.yaml al contenedor (sin rebuild)

El nuevo modelo aparece en el selector del panel. El bloque compat del proveedor (supportsDeveloperRole: false, maxTokensField: max_tokens) ya está en el archivo y es obligatorio para Ollama.

3

Instala REA (y, para binarios nativos, Ghidra)

Ruta A — app Electron/JavaScript, sin Ghidra. El agente ejecuta REA desde la línea de comandos dentro del propio contenedor. Este fue el camino medido aquí: REA 6.3.0 analizó una app Node de 97 archivos en 20 s; REA 6.4.0 analizó una app Electron de 202 archivos JS en 94,5 s (pico de 1,26 GB). Pon el objetivo en una carpeta visible para el contenedor (~/projetos/dsh-sandbox/work/alvos se convierte en /work/alvos) y pega el prompt:

Instala esto y ayúdame a hacer ingeniería inversa de una app: https://github.com/morluto/rea
Usa npx -y rea-agents@6.4.0, siempre con "timeout -k 10 600" delante.
Analiza /work/alvos/<app>.asar con analyze-javascript-application --json,
resume los módulos, las pantallas y dónde está <la función que me interesa>, con la evidencia.

Ruta B — REA como MCP dentro de dsh (no medido). El registro automático rea setup --client dsh todavía no está en el paquete publicado (la doc de REA dice "solo en main, después de la 6.4.0"). La forma manual: instalar REA en una carpeta propia dentro de work/ (sin tocar el node_modules congelado de dsh) y registrar el servidor en el cordis.patch.yml de la casa de dsh.

cd ~/projetos/dsh-sandbox
docker run --rm -u 1000:1000 -v "$PWD/work:/work" -w /work \
  -e HOME=/work -e NPM_CONFIG_CACHE=/work/.npm --memory=6g \
  node:22-slim npm install --prefix /work/rea rea-agents@6.4.0
# ~/projetos/dsh-sandbox/work/.dsh/cordis.patch.yml  (en el contenedor: /work/.dsh/cordis.patch.yml)
- insert:
    - id: rea-mcp
      name: "@deepseek-ai/dsh-mcp-client"
      config:
        serverName: rea
        transport: stdio
        command: /usr/local/bin/node
        args: ["/work/rea/node_modules/rea-agents/scripts/rea.mjs", mcp]
        toolCallTimeoutMs: 600000   # el valor predeterminado es 60 s; un análisis tarda más

Reinicia con ./dsh local; las herramientas aparecen como mcp__rea__…. Para binarios nativos, REA necesita Ghidra 12.1.x y JDK 21 visibles desde dentro del contenedor (GHIDRA_INSTALL_DIR, JAVA_HOME) y más memoria que los 3 GB del contenedor. Eso no se configuró ni se midió aquí.

4

Elige el objetivo y pide tu versión

Empieza por una app pequeña, que uses y de la que eches en falta una sola cosa. Pide una app nueva, con nombre e ícono propios, escrita desde cero y que enumere al final lo que quedó fuera.

A partir del análisis, crea una app NUEVA, con nombre e ícono propios (sin nombre, ícono,
textos ni código del fabricante), que haga lo que hace <app original> en <función principal>
y añada: velocidad de reproducción de 0,1x a 4x, en pasos de 0,05.
Código desde cero en /work/minha-versao. Primero la versión mínima que funcione;
al final, enumera lo que quedó fuera y lo que necesita pruebas manuales.
5

Itera, un ajuste a la vez

La primera versión suele funcionar en lo esencial. Lo demás son ajustes: apariencia, exportación, pequeños errores. Un pedido a la vez, probando entre ellos.

Abrí la versión 1. Lo que no funcionó: <lo que viste, con el mensaje de error>.
Corrige solo eso, vuelve a ejecutarlo y dime cómo confirmar que quedó bien.
Detente. Resume en 5 líneas lo que ya intentaste, qué dio error y cuál es la hipótesis.
No ejecutes nada más hasta que te responda.   # cuando el agente se atasca
Lista de verificación

Antes de decir que funcionó

Marca cada elemento. Si alguno falla, ve a "Problemas".

Entorno

  • ./dsh status muestra el modo local, http 200 y /projetos montado.
  • ollama list muestra el modelo sin restricciones con el mismo nombre que el id en el YAML.
  • El modelo responde en el panel y puede ejecutar ls /work (prueba de que llama a herramientas).
  • npx -y rea-agents@6.4.0 --help se ejecuta desde dentro del agente.

Resultado

  • El análisis devolvió evidencia (archivo y fragmento), no solo una opinión.
  • La nueva app tiene nombre e icono propios y ningún archivo copiado del original.
  • La función que faltaba en el original funciona de verdad (prueba manual).
  • El agente enumeró lo que quedó fuera (servidor, partes no vistas).
Solución de problemas

Cuando algo se atasca

Los casos que ya aparecieron en esta máquina o que describe la documentación de REA y dsh.

⏱️ REA bloqueado

REA 6.3.0 se bloqueó en una app con un único archivo JS enorme e ignoró SIGTERM: hubo que matar el proceso huérfano por el PID. En 6.4.0, la misma app terminó. Aun así, ejecútalo siempre con un límite:

# en el host (systemd-run + timeout) o en el contenedor (timeout):
scripts/rea-com-timeout.sh -t 600 -m 6G -- \
  npx -y rea-agents@6.4.0 analyze-javascript-application /abs/app.asar --json

🧠 Modelo demasiado pequeño

Señales: inventa nombres de herramientas, repite el mismo comando, olvida el objetivo. Cambia por uno más grande de la tabla, divide la solicitud en partes más pequeñas y pide al agente que guarde el resumen del análisis en un archivo para volver a leerlo después. El contexto de 32K se llena rápido con JSON grande: pide un resumen, no todo el JSON.

🐉 Ghidra / Java

REA acepta Ghidra 12.1.x con JDK 21+ (64 bits, con javac). JDK 8 no sirve. En Linux ARM64, revisa la carpeta Ghidra/Features/Decompiler/os/linux_arm_64. Diagnóstico:

npx -y rea-agents@6.4.0 doctor --provider ghidra --json

🔌 dsh no muestra las herramientas de REA

Revisa la ruta de rea.mjs dentro del contenedor, el command de node (/usr/local/bin/node) y que cordis.patch.yml no esté vacío (un archivo solo con comentarios da error). Mira el registro:

docker compose logs --tail=50

🧩 El modelo no aparece en el selector

El id no coincide con ollama list, o editaste work/.dsh/settings.yaml y ./dsh local lo sobrescribió. Edita settings.local.yaml y ejecuta ./dsh local otra vez.

📂 El agente no encuentra la app

El contenedor solo ve /work y, en modo local, /projetos. Copia la app (o el .asar) a ~/projetos/dsh-sandbox/work/alvos/ y usa la ruta absoluta dentro del contenedor.

Costos

Nube de pago por uso o máquina propia

REA, Ghidra, dsh y Ollama son gratuitos. Lo que cuesta es el modelo.

EscenarioCostoFuente
Modelo sin restricciones en la nube (prepago)US$ 4 en la 1.ª versión + US$ 5 a 6 de ajustesvideo de referencia no medido aquí
Modelo local en OllamaR$ 0 por solicitud; solo máquina y energíasin clave de API
Tiempo hasta la 1.ª versión20 a 30 min (nube); en local depende del modelo y de la máquinavideo de referencia no medido aquí
Memoria del modelo local14 a 24 GB (tabla de modelos); dsh en sí usa ~85 MBpágina de Ollama + medición de dsh-sandbox
Sin trabas · nube

¿Sin máquina? Dos plataformas al estilo de OpenRouter

Claude, Codex y Gemini a veces rechazan partes de una ingeniería inversa, aunque sea legítima. La salida es un modelo abierto que no rechaza. Si tu computadora no corre el modelo, estas dos plataformas prepagas lo alojan por ti: cargas US$ 5 a 10 de crédito, tomas la clave y le pides al agente (dsh, Claude Code, Codex) que la use.

1. abliteration.ai

Modelos abiertos "abliterated" (sin el reflejo de rechazo en los pesos), por una API compatible con la de OpenAI. Prepago por token o plan mensual.

# Dirección de la API
https://api.abliteration.ai/v1

Abrir el sitio →

2. OrcaRouter

Un enrutador con más de 200 modelos en una sola dirección, igual que OpenRouter. Tiene una versión abierta (MIT) que puedes alojar tú mismo.

Abrir el sitio →

Atención: en la nube, tu código sale de tu máquina. Para tu propia app o archivos sensibles, prefiere el modelo local (Ollama). Precios y catálogo cambian: revisa la página antes de cargar crédito.

Uso responsable

"Sin restricciones" no significa "sin reglas"

Sin restricciones quiere decir que el modelo no rechaza tareas legítimas de ingeniería inversa. No es para nada ilegal.

✅ Permitido

  • Estudiar un programa que tienes y usas para entender cómo funciona.
  • Hacer tu propia versión para uso personal e interoperabilidad (abrir tus archivos, conectar con tus herramientas).
  • Escribir el código desde cero, con tu propio nombre, icono y aspecto visual.

⛔ No permitido

  • Redistribuir código, iconos, textos o marcas del fabricante.
  • Vender una copia de un programa: infringe los derechos de autor y la licencia.
  • Romper protecciones contra copia, licencias o DRM, o apuntar a un programa que no tienes derecho a usar.
  • Ejecutar un binario desconocido fuera de una máquina aislada: REA no es un sandbox.
Muchas licencias de software prohíben la ingeniería inversa; las leyes varían según el país. En caso de duda, mantente en terreno seguro: tus propios programas, código abierto, retos de seguridad y aquello que tienes autorización para analizar.
Vídeo

Mira el video

El video de esta guía, con el paso a paso explicado.

▶ Ver el video
Transparencia

Qué se midió y qué no

Para que sepas dónde puedes pisar con seguridad.

ElementoEstadoDetalle
dsh en modo local con OllamamedidoArranque ~18 s, ~85 MB en reposo, qwen3.8:27b ~18–20 GB (dsh-sandbox, 08/2026).
REA, análisis JS sin Ghidramedido6.3.0: 97 archivos en 20 s; 6.4.0: 202 archivos JS en 94,5 s, pico de 1,26 GB (Linux ARM, 10–12/10/2026).
REA bloqueado en un archivo JS gigantemedido6.3.0 se bloqueó e ignoró SIGTERM; 6.4.0 terminó. Límite con scripts/rea-com-timeout.sh probado en ambos modos.
Modelos sin restricciones de la tablano medidoVerificados en la página de Ollama; ninguno descargado (disco al 98%).
REA como MCP dentro de dshno medidoReceta manual según la documentación de REA y de dsh-mcp-client 0.1.1-rc.1.
Ghidra en esta máquinano medidoSolo hay JDK 8; Ghidra 12.1.x requiere JDK 21 y, en ARM64, su propio descompilador nativo.
El clon de QuickTime, costos y tiemposno medidoCifras del video de referencia (macOS, modelo en la nube).
Próximos pasos

Qué falta medir

Elementos pendientes de esta guía, en el orden en que más impacto tienen.

Fase 1
Medir un modelo sin restricciones en dshDescargar huihui_ai/Qwen3.8-abliterated:27b cuando haya espacio en disco y ejecutar el camino A en una app pequeña de Electron: tiempo, memoria, cuántas solicitudes hasta la primera versión.
Fase 2
REA como MCP en dshAplicar cordis.patch.yml, confirmar las herramientas mcp__rea__… en el panel y el valor de toolCallTimeoutMs.
Fase 3
Ghidra en Linux ARM64JDK 21 + Ghidra 12.1.x con el descompilador linux_arm_64, visibles en el contenedor, para binarios nativos.

Guía anterior, con la técnica, los casos y la nueva prueba de 6.4.0: REA, ingeniería inversa con IA (en portugués). Repositorio de REA: morluto/rea (MIT, ~147 mil estrellas al 12/10/2026).