
un agente AI completamente autonomo per il reverse engineering
.-. ██ ██ ██ ██████ ██ ██████
(o o) ██ ██ ██ ██ ██ ██ ██
| u | ██ ██ ██ ██████ ██ ██ ███
| | ██ ██ ██ ██ ██ ██ ██ ██ ██
'~-~' █████ ██████ ██ ██ ██ ██████
agente autonomo di reverse-engineering · android · binary · frida
Jurig (sundanese: fantasma) — un agente AI autonomo che infesta i tuoi binari. Nella TUI il fantasma lampeggia, oscilla e brilla mentre lavora.
Framework di reverse-engineering completamente autonomo e agentico basato su AI, con una TUI. Android-first (APK/DEX) più binari nativi. Scritto in Go, senza MCP — ogni strumento è un wrapper nativo di sottoprocesso attorno a un binario RE portabile.
| Aspetto | Scelta |
|---|---|
| Linguaggio / TUI | Go + Bubble Tea + Lipgloss + Glamour (report markdown) |
| Agente | Ciclo plan→act→observe proprio (internal/agent) — nessun lock-in su framework |
| Strumenti | Wrapper nativi Go di sottoprocessi (internal/tools) — nessun MCP |
| LLM | Un unico formato wire (protocollo Anthropic Messages) dietro un router |
| Provider | anthropic (diretto), openrouter ("skin" Anthropic), claude-cli (abbonamento) |
| Strumenti portabili | internal/portable risolve binari inclusi → PATH; installa da un catalogo |
Due protocolli wire dietro un unico router:
anthropic — API Messages nativa (/v1/messages).openai — OpenAI Chat Completions (/chat/completions) con un
traduttore interno Messages↔OpenAI (tool-call inclusi). Copre qualsiasi
endpoint compatibile OpenAI.Preset inclusi (config.json → providers):
| Provider | Tipo | Endpoint | Env chiave |
|---|---|---|---|
| mimo (predefinito) | 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 (locale) | openai | localhost:11434/v1 | — (locale) |
| 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 (qualsiasi compatibile OpenAI) | openai | imposti tu base_url | CUSTOM_API_KEY |
| claude-cli (abbonamento) | claude-cli | binario claude | — |
Scegli provider+modello a caldo nella TUI con Ctrl+O, oppure imposta
JURIG_PROVIDER + JURIG_MODEL, oppure modifica active in config.json. Aggiungi modelli
estendendo la lista models di un provider. Punta qualsiasi provider a un base
URL diverso (es. un gateway self-hosted) tramite base_url.
Ollama: ollama serve + ollama pull qwen2.5-coder:14b, poi Ctrl+O →
scegli ollama/…. Nessuna chiave necessaria.
claude-cli (abbonamento Claude Code): Anthropic blocca l'autenticazione tramite abbonamento in
harness HTTP di terze parti (apr 2026), quindi questo percorso invoca il binario claude.
Solo advisory/chat — nessun tool-calling nativo; usa un provider openai/anthropic
per il ciclo completo di strumenti autonomi.
custom — un provider generico per QUALSIASI endpoint compatibile OpenAI. Jurig
non include alcun gateway hardcoded; inserisci tu stesso il base URL nella procedura guidata di setup
(/setup) o in config.json. Funziona per:
npx 9router) o OmniRoute,
che fanno da frontend per account Cursor / Claude Code / Codex su http://localhost:20128/v1.Imposta base_url (es. http://localhost:20128/v1) e, se l'endpoint ne richiede una,
api_key (o l'env CUSTOM_API_KEY / CUSTOM_BASE_URL per l'URL). Un
gateway localhost è considerato pronto senza chiave. Il provider custom è
contrassegnato come auto_models, quindi il selettore (Ctrl+O) recupera il catalogo live dall'
endpoint /models all'apertura — premi r per aggiornare la lista di qualsiasi provider. Per un
router di abbonamento, gli id dei modelli portano un prefisso di route (cu/ Cursor, cc/ Claude
Code, cx/ Codex) — la lista auto-caricata mostra gli id esatti.
L'uso di abbonamenti al di fuori dei loro client ufficiali può violare i ToS — il tuo account, il tuo rischio.
go build -o jurig ./cmd/jurig
Nessun flag necessario. La prima esecuzione (o quando il provider attivo non ha chiave) avvia una
procedura guidata di setup interattiva: scegli provider (OpenRouter / Kimi / Qwen / Ollama /
Anthropic / Claude subscription) → chiave → modello → pre-installazione opzionale degli strumenti →
salvato in ~/.jurig/config.json.
./jurig # prima esecuzione → wizard, poi TUI
./jurig setup # riesegui il wizard in qualsiasi momento
./jurig doctor # mostra stato di provider + toolchain
./jurig install jadx # pre-riscalda uno strumento (si installa anche automaticamente su richiesta)
./jurig -p "analyze ./app.apk" # one-shot headless (salta il wizard; richiede una chiave impostata)
./jurig -target ./work/app -p "..." # fissa una work dir per-target
| Tasto | Azione |
|---|---|
| Enter | esegui istruzione / invia |
| ↑ / ↓ | cronologia prompt |
| PgUp / PgDn | scorri il transcript |
| Ctrl+F | cerca nel transcript (Enter = corrispondenza successiva) |
| Ctrl+O | cambia provider / modello |
| F1 | overlay di aiuto |
| Ctrl+C | interrompi esecuzione / esci |
Quando l'agente pone una domanda di scoping, appare un menu di risposta: ↑/↓ per muoversi, Spazio o 1-9 per attivare (multi-selezione), Enter per confermare.
Ripresa sessione: la conversazione + la cronologia dei prompt persistono in
<work_dir>/session.json e si ripristinano automaticamente al prossimo avvio (--fresh parte pulito).
Code card: ogni volta che l'agente legge un file sorgente, la TUI mostra una piccola anteprima con syntax highlighting — il modello riceve comunque il file completo.
Recon & triage
| Strumento | Scopo |
|---|---|
manifest | analizza AndroidManifest → package, permessi, componenti esportati |
url_extract | estrae + deduplica tutti gli URL → mappa API/host |
secret_scan | scansione categorizzata di segreti hardcoded (AWS/GCP/JWT/keys/AES…) |
native_libs | elenca lib/<abi>/*.so + ABI (superficie JNI) |
search_code | grep regex sui sorgenti — localizza prima di leggere |
ask_user | l'agente chiede all'operatore (menu multi-selezione) |
Statico
| Strumento | Scopo |
|---|---|
jadx | APK/DEX/XAPK → Java (estrae automaticamente i bundle, riepilogo ricco) |
apktool | APK → smali + manifest decodificato |
radare2 / ghidra | disasm binario nativo / decompilazione headless |
elf_info / pe_info | analizza header ELF/PE, simboli, import (nativo) |
hexdump / strings | byte grezzi / stringhe stampabili |
unzip | estrazione nativa zip/apk/xapk/apks (senza shell) |