
um agente de IA totalmente autônomo para engenharia reversa
.-. ██ ██ ██ ██████ ██ ██████
(o o) ██ ██ ██ ██ ██ ██ ██
| u | ██ ██ ██ ██████ ██ ██ ███
| | ██ ██ ██ ██ ██ ██ ██ ██ ██
'~-~' █████ ██████ ██ ██ ██ ██████
agente autônomo de engenharia reversa · android · binário · frida
Jurig (sundanês: fantasma) — um agente de IA autônomo que assombra seus binários. Na TUI o fantasma pisca, balança e cintila enquanto trabalha.
Framework de engenharia reversa totalmente autônomo e agêntico com IA, com uma TUI. Focado em Android (APK/DEX) além de binários nativos. Escrito em Go, sem MCP — cada ferramenta é um wrapper nativo de subprocesso em torno de um binário de RE portátil.
| Concern | Choice |
|---|---|
| Linguagem / TUI | Go + Bubble Tea + Lipgloss + Glamour (relatórios markdown) |
| Agente | Loop próprio plan→act→observe (internal/agent) — sem lock-in de framework |
| Ferramentas | Wrappers nativos de subprocesso em Go (internal/tools) — sem MCP |
| LLM | Um formato de wire (protocolo Anthropic Messages) atrás de um roteador |
| Provedores | anthropic (direto), openrouter (pele Anthropic), claude-cli (assinatura) |
| Ferramentas portáteis | internal/portable resolve binários empacotados → PATH; instala de um catálogo |
Dois protocolos de wire atrás de um roteador:
anthropic — API Messages nativa (/v1/messages).openai — OpenAI Chat Completions (/chat/completions) com um
tradutor interno Messages↔OpenAI (incluindo tool-calls). Cobre qualquer
endpoint compatível com OpenAI.Presets incluídos (config.json → providers):
| Provider | Kind | Endpoint | Key env |
|---|---|---|---|
| mimo (padrão) | 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 (qualquer OpenAI-compat) | openai | você define base_url | CUSTOM_API_KEY |
| claude-cli (assinatura) | claude-cli | binário claude | — |
Escolha provedor+modelo ao vivo na TUI com Ctrl+O, ou defina
JURIG_PROVIDER + JURIG_MODEL, ou edite active em config.json. Adicione modelos
estendendo a lista models de um provedor. Aponte qualquer provedor para uma base
URL diferente (ex.: um gateway auto-hospedado) via base_url.
Ollama: ollama serve + ollama pull qwen2.5-coder:14b, depois Ctrl+O →
escolha ollama/…. Nenhuma chave necessária.
claude-cli (assinatura Claude Code): a Anthropic bloqueia autenticação por assinatura em
harnesses HTTP de terceiros (abr 2026), então este caminho invoca o binário claude.
Apenas consultivo/chat — sem tool-calling nativo; use um provedor openai/anthropic
para o loop autônomo completo de ferramentas.
custom — um provedor genérico para QUALQUER endpoint compatível com OpenAI. O Jurig
não inclui nenhum gateway hardcoded; você preenche a base URL no assistente de configuração
(/setup) ou em config.json. Funciona para:
npx 9router) ou OmniRoute,
que fazem frente a contas Cursor / Claude Code / Codex em http://localhost:20128/v1.Defina base_url (ex.: http://localhost:20128/v1) e, se o endpoint precisar,
api_key (ou a env CUSTOM_API_KEY / CUSTOM_BASE_URL para a URL). Um
gateway localhost é tratado como pronto sem chave. O provedor custom é
marcado como auto_models, então o seletor (Ctrl+O) busca o catálogo ao vivo do
/models do endpoint ao abrir — pressione r para atualizar a lista de qualquer provedor. Para um
roteador de assinatura, os ids de modelo carregam um prefixo de rota (cu/ Cursor, cc/ Claude
Code, cx/ Codex) — a lista auto-carregada mostra os ids exatos.
Usar assinaturas fora de seus clientes oficiais pode violar os ToS — sua conta, seu risco.
go build -o jurig ./cmd/jurig
Nenhuma flag necessária. A primeira execução (ou quando o provedor ativo não tem chave) inicia um
assistente de configuração interativo: escolha o provedor (OpenRouter / Kimi / Qwen / Ollama /
Anthropic / Claude subscription) → chave → modelo → pré-instalação opcional de ferramentas →
salvo em ~/.jurig/config.json.
./jurig # primeira execução → assistente, depois TUI
./jurig setup # reexecutar o assistente a qualquer momento
./jurig doctor # mostrar status do provedor + toolchain
./jurig install jadx # pré-aquecer uma ferramenta (também auto-instala sob demanda)
./jurig -p "analyze ./app.apk" # one-shot headless (pula o assistente; precisa de uma chave definida)
./jurig -target ./work/app -p "..." # fixar um diretório de trabalho por alvo
| Tecla | Ação |
|---|---|
| Enter | executar instrução / enviar |
| ↑ / ↓ | histórico de prompts |
| PgUp / PgDn | rolar transcrição |
| Ctrl+F | buscar na transcrição (Enter = próxima ocorrência) |
| Ctrl+O | trocar provedor / modelo |
| F1 | overlay de ajuda |
| Ctrl+C | abortar execução / sair |
Quando o agente faz uma pergunta de escopo, um menu de respostas aparece: ↑/↓ move, Space ou 1-9 alterna (multi-seleção), Enter confirma.
Retomada de sessão: a conversa + histórico de prompts persistem em
<work_dir>/session.json e são restaurados automaticamente na próxima inicialização (--fresh começa limpo).
Cards de código: sempre que o agente lê um arquivo fonte, a TUI mostra uma pequena prévia com destaque de sintaxe — o modelo ainda recebe o arquivo completo.
Reconhecimento e triagem
| Ferramenta | Propósito |
|---|---|
manifest | analisa AndroidManifest → pacote, permissões, componentes exportados |
url_extract | extrai + deduplica todas as URLs → mapa de API/host |
secret_scan | varredura categorizada de segredos hardcoded (AWS/GCP/JWT/chaves/AES…) |
native_libs | lista lib/<abi>/*.so + ABIs (superfície JNI) |
search_code | grep regex sobre fontes — localizar antes de ler |
ask_user | agente pergunta ao operador (menu multi-seleção) |
Estático
| Ferramenta | Propósito |
|---|---|
jadx | APK/DEX/XAPK → Java (auto-extrai bundles, resumo rico) |
apktool | APK → smali + manifest decodificado |
radare2 / ghidra | disasm de binário nativo / decompilação headless |
elf_info / pe_info | analisa cabeçalhos ELF/PE, símbolos, imports (nativo) |
hexdump / strings | bytes brutos / strings imprimíveis |
unzip | extração nativa de zip/apk/xapk/apks (sem shell) |