
полностью автономный ИИ-агент для обратного проектирования
.-. ██ ██ ██ ██████ ██ ██████
(o o) ██ ██ ██ ██ ██ ██ ██
| u | ██ ██ ██ ██████ ██ ██ ███
| | ██ ██ ██ ██ ██ ██ ██ ██ ██
'~-~' █████ ██████ ██ ██ ██ ██████
autonomous reverse-engineering agent · android · binary · frida
Jurig (суданский: призрак) — автономный ИИ-агент, который преследует ваши бинарники. В TUI призрак мигает, покачивается и мерцает, пока работает.
Полностью автономный, ИИ-агентный фреймворк для обратной разработки с TUI. Ориентирован в первую очередь на Android (APK/DEX), а также нативные бинарники. Написан на Go, без MCP — каждый инструмент представляет собой нативную обёртку подпроцесса вокруг портативного RE-бинарника.
| Аспект | Выбор |
|---|---|
| Язык / TUI | Go + Bubble Tea + Lipgloss + Glamour (отчёты в markdown) |
| Агент | Собственный цикл plan→act→observe (internal/agent) — без привязки к фреймворку |
| Инструменты | Нативные Go-обёртки подпроцессов (internal/tools) — без MCP |
| LLM | Единый формат передачи (протокол Anthropic Messages) за роутером |
| Провайдеры | anthropic (напрямую), openrouter («обёртка» Anthropic), claude-cli (подписка) |
| Портативные инструменты | internal/portable разрешает встроенные бинарники → PATH; устанавливает из каталога |
Два протокола передачи за одним роутером:
anthropic — нативный Messages API (/v1/messages).openai — OpenAI Chat Completions (/chat/completions) с
внутренним транслятором Messages↔OpenAI (включая вызовы инструментов). Покрывает любой
OpenAI-совместимый эндпоинт.Предустановленные пресеты (config.json → providers):
| Провайдер | Тип | Эндпоинт | Переменная окружения для ключа |
|---|---|---|---|
| mimo (по умолчанию) | 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 (локальный) | openai | localhost:11434/v1 | — (локальный) |
| 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 (любой OpenAI-совместимый) | openai | вы задаёте base_url | CUSTOM_API_KEY |
| claude-cli (подписка) | claude-cli | бинарник claude | — |
Выбирайте провайдера+модель на лету в TUI с помощью Ctrl+O, либо задайте
JURIG_PROVIDER + JURIG_MODEL, либо отредактируйте active в config.json. Добавляйте модели,
расширяя список models провайдера. Направьте любого провайдера на другой базовый
URL (например, на самостоятельно размещённый шлюз) через base_url.
Ollama: ollama serve + ollama pull qwen2.5-coder:14b, затем Ctrl+O →
выберите ollama/…. Ключ не нужен.
claude-cli (подписка Claude Code): Anthropic блокирует аутентификацию по подписке в
сторонних HTTP-обвязках (апрель 2026), поэтому этот путь вызывает бинарник claude
через shell. Только для консультаций/чата — без нативного вызова инструментов; используйте провайдера openai/anthropic
для полного автономного цикла работы с инструментами.
custom — один универсальный провайдер для ЛЮБОГО OpenAI-совместимого эндпоинта. Jurig
не поставляет жёстко заданный шлюз; вы сами заполняете базовый URL в мастере настройки
(/setup) или в config.json. Работает для:
npx 9router) или OmniRoute,
которые предоставляют доступ к аккаунтам Cursor / Claude Code / Codex на http://localhost:20128/v1.Задайте base_url (например, http://localhost:20128/v1) и, если эндпоинту нужен,
api_key (или переменную окружения CUSTOM_API_KEY / CUSTOM_BASE_URL для URL). Локальный
шлюз считается готовым без ключа. Провайдер custom помечен как auto_models,
поэтому средство выбора (Ctrl+O) при открытии получает актуальный каталог из
/models эндпоинта — нажмите r, чтобы обновить список любого провайдера. Для
роутера подписок идентификаторы моделей содержат префикс маршрута (cu/ Cursor, cc/ Claude
Code, cx/ Codex) — автоматически загруженный список показывает точные идентификаторы.
Использование подписок вне их официальных клиентов может нарушать ToS — ваш аккаунт, ваш риск.
go build -o jurig ./cmd/jurig
Флаги не нужны. Первый запуск (или когда у активного провайдера нет ключа) запускает
интерактивный мастер настройки: выберите провайдера (OpenRouter / Kimi / Qwen / Ollama /
Anthropic / Claude subscription) → ключ → модель → необязательная предустановка инструментов →
сохраняется в ~/.jurig/config.json.
./jurig # first run → wizard, then TUI
./jurig setup # re-run the wizard anytime
./jurig doctor # show provider + toolchain status
./jurig install jadx # pre-warm a tool (also auto-installs on demand)
./jurig -p "analyze ./app.apk" # headless one-shot (skips wizard; needs a key set)
./jurig -target ./work/app -p "..." # pin a per-target work dir
| Клавиша | Действие |
|---|---|
| Enter | выполнить инструкцию / отправить |
| ↑ / ↓ | история запросов |
| PgUp / PgDn | прокрутка расшифровки |
| Ctrl+F | поиск по расшифровке (Enter = следующее совпадение) |
| Ctrl+O | переключить провайдера / модель |
| F1 | оверлей справки |
| Ctrl+C | прервать запуск / выйти |
Когда агент задаёт уточняющий вопрос, появляется меню ответов: ↑/↓ перемещение, Space или 1-9 переключение (множественный выбор), Enter подтвердить.
Возобновление сессии: разговор + история запросов сохраняются в
<work_dir>/session.json и автоматически восстанавливаются при следующем запуске (--fresh начинает с чистого листа).
Карточки кода: всякий раз, когда агент читает исходный файл, TUI показывает небольшой предпросмотр с подсветкой синтаксиса — модель по-прежнему получает полный файл.
Разведка и сортировка
| Инструмент | Назначение |
|---|---|
manifest | разбор AndroidManifest → пакет, разрешения, экспортируемые компоненты |
url_extract | извлечение + дедупликация всех URL → карта API/хостов |
secret_scan | категоризированное сканирование жёстко закодированных секретов (AWS/GCP/JWT/ключи/AES…) |
native_libs | список lib/<abi>/*.so + ABI (поверхность JNI) |
search_code | regex-поиск по исходникам — найти перед чтением |
ask_user | агент спрашивает оператора (меню множественного выбора) |
Статика
| Инструмент | Назначение |
|---|---|
jadx | APK/DEX/XAPK → Java (автоизвлечение бандлов, подробная сводка) |
apktool | APK → smali + декодированный манифест |
radare2 / ghidra | дизассемблирование нативных бинарников / headless-декомпиляция |
elf_info / pe_info | разбор заголовков ELF/PE, символов, импортов (нативно) |
hexdump / strings | сырые байты / печатаемые строки |
unzip | нативное извлечение zip/apk/xapk/apks (без shell) |