
un agente de IA totalmente autónomo para ingeniería inversa
.-. ██ ██ ██ ██████ ██ ██████
(o o) ██ ██ ██ ██ ██ ██ ██
| u | ██ ██ ██ ██████ ██ ██ ███
| | ██ ██ ██ ██ ██ ██ ██ ██ ██
'~-~' █████ ██████ ██ ██ ██ ██████
agente autónomo de ingeniería inversa · android · binario · frida
Jurig (sundanés: fantasma) — un agente de IA autónomo que acecha tus binarios. En la TUI el fantasma parpadea, se balancea y brilla mientras trabaja.
Framework de ingeniería inversa totalmente autónomo y agéntico con IA, con una TUI. Android-first (APK/DEX) además de binarios nativos. Escrito en Go, sin MCP — cada herramienta es un wrapper nativo de subproceso alrededor de un binario RE portátil.
| Aspecto | Elección |
|---|---|
| Lenguaje / TUI | Go + Bubble Tea + Lipgloss + Glamour (informes markdown) |
| Agente | Bucle propio plan→actuar→observar (internal/agent) — sin dependencia de framework |
| Herramientas | Wrappers nativos de subproceso en Go (internal/tools) — sin MCP |
| LLM | Un formato de cable (protocolo Messages de Anthropic) detrás de un router |
| Proveedores | anthropic (directo), openrouter (con "piel" de Anthropic), claude-cli (suscripción) |
| Herramientas portátiles | internal/portable resuelve binarios incluidos → PATH; instala desde un catálogo |
Dos protocolos de cable detrás de un router:
anthropic — API Messages nativa (/v1/messages).openai — OpenAI Chat Completions (/chat/completions) con un
traductor interno Messages↔OpenAI (incluidas las llamadas a herramientas). Cubre cualquier
endpoint compatible con OpenAI.Presets incluidos (config.json → providers):
| Proveedor | Tipo | Endpoint | Env de clave |
|---|---|---|---|
| mimo (por defecto) | openai | token-plan-sgp.xiaomimimo.com/v1 | MIMO_API_KEY |
| anthropic | anthropic | api.anthropic.com | ANTHROPIC_API_KEY |
| openrouter | openai | openrouter.ai/api/v1 | OPENROUTER_API_KEY |
| ollama (local) | openai | localhost:11434/v1 | — (local) |
| kimi | openai | api.kimi.com/coding/v1 | KIMI_API_KEY |
| moonshot | openai | api.moonshot.ai/v1 | MOONSHOT_API_KEY |
| dashscope / Qwen (Alibaba) | openai | dashscope-intl…/compatible-mode/v1 | DASHSCOPE_API_KEY |
| custom (cualquier compatible con OpenAI) | openai | tú defines base_url | CUSTOM_API_KEY |
| claude-cli (suscripción) | claude-cli | binario claude | — |
Elige proveedor+modelo en vivo en la TUI con Ctrl+O, o define
JURIG_PROVIDER + JURIG_MODEL, o edita active en config.json. Añade modelos
extendiendo la lista models de un proveedor. Apunta cualquier proveedor a una base
URL distinta (p. ej. un gateway autoalojado) mediante base_url.
Ollama: ollama serve + ollama pull qwen2.5-coder:14b, luego Ctrl+O →
elige ollama/…. No se necesita clave.
claude-cli (suscripción de Claude Code): Anthropic bloquea la autenticación por suscripción en
arneses HTTP de terceros (abr 2026), así que esta ruta invoca el binario claude
mediante shell. Solo consultivo/chat — sin llamadas a herramientas nativas; usa un proveedor
openai/anthropic para el bucle completo de herramientas autónomo.
custom — un proveedor genérico para CUALQUIER endpoint compatible con OpenAI. Jurig
no incluye ningún gateway codificado; tú rellenas la URL base en el asistente de configuración
(/setup) o en config.json. Funciona para:
npx 9router) o OmniRoute,
que ponen al frente cuentas de Cursor / Claude Code / Codex en http://localhost:20128/v1.Define base_url (p. ej. http://localhost:20128/v1) y, si el endpoint necesita una,
api_key (o la env CUSTOM_API_KEY / CUSTOM_BASE_URL para la URL). Un
gateway localhost se considera listo sin clave. El proveedor custom está
marcado como auto_models, así que el selector (Ctrl+O) obtiene el catálogo en vivo desde
el /models del endpoint al abrirse — pulsa r para refrescar la lista de cualquier proveedor. Para un
router de suscripción, los ids de modelo llevan un prefijo de ruta (cu/ Cursor, cc/ Claude
Code, cx/ Codex) — la lista autocargada muestra los ids exactos.
Usar suscripciones fuera de sus clientes oficiales puede violar los ToS — tu cuenta, tu riesgo.
go build -o jurig ./cmd/jurig
No se necesitan flags. La primera ejecución (o cuando el proveedor activo no tiene clave) lanza un
asistente de configuración interactivo: elige proveedor (OpenRouter / Kimi / Qwen / Ollama /
Anthropic / suscripción de Claude) → clave → modelo → preinstalación opcional de herramientas →
guardado en ~/.jurig/config.json.
./jurig # primera ejecución → asistente, luego TUI
./jurig setup # vuelve a ejecutar el asistente cuando quieras
./jurig doctor # muestra el estado del proveedor + toolchain
./jurig install jadx # precalienta una herramienta (también se autoinstala bajo demanda)
./jurig -p "analyze ./app.apk" # one-shot sin interfaz (omite el asistente; requiere una clave definida)
./jurig -target ./work/app -p "..." # fija un directorio de trabajo por objetivo
| Tecla | Acción |
|---|---|
| Enter | ejecutar instrucción / enviar |
| ↑ / ↓ | historial de prompts |
| PgUp / PgDn | desplazar la transcripción |
| Ctrl+F | buscar en la transcripción (Enter = siguiente coincidencia) |
| Ctrl+O | cambiar proveedor / modelo |
| F1 | superposición de ayuda |
| Ctrl+C | abortar ejecución / salir |
Cuando el agente hace una pregunta de alcance, aparece un menú de respuestas: ↑/↓ mueve, Espacio o 1-9 alterna (selección múltiple), Enter confirma.
Reanudación de sesión: la conversación + el historial de prompts persisten en
<work_dir>/session.json y se restauran automáticamente en el siguiente arranque (--fresh empieza limpio).
Tarjetas de código: cada vez que el agente lee un archivo fuente, la TUI muestra una pequeña vista previa con resaltado de sintaxis — el modelo sigue recibiendo el archivo completo.
Reconocimiento y triaje
| Herramienta | Propósito |
|---|---|
manifest | parsea AndroidManifest → paquete, permisos, componentes exportados |
url_extract | extrae + deduplica todas las URLs → mapa de API/host |
secret_scan | escaneo categorizado de secretos embebidos (AWS/GCP/JWT/keys/AES…) |
native_libs | lista lib/<abi>/*.so + ABIs (superficie JNI) |
search_code | grep con regex sobre las fuentes — localiza antes de leer |
ask_user | el agente pregunta al operador (menú de selección múltiple) |
Estático
| Herramienta | Propósito |
|---|---|
jadx | APK/DEX/XAPK → Java (extrae bundles automáticamente, resumen enriquecido) |
apktool | APK → smali + manifest decodificado |
radare2 / ghidra | disasm de binario nativo / descompilación headless |
elf_info / pe_info | parsea cabeceras ELF/PE, símbolos, imports (nativo) |
hexdump / strings | bytes en bruto / cadenas imprimibles |
unzip | extracción nativa de zip/apk/xapk/apks (sin shell) |