一个用于逆向工程的全自主AI代理
.-. ██ ██ ██ ██████ ██ ██████
(o o) ██ ██ ██ ██ ██ ██ ██
| u | ██ ██ ██ ██████ ██ ██ ███
| | ██ ██ ██ ██ ██ ██ ██ ██ ██
'~-~' █████ ██████ ██ ██ ██ ██████
autonomous reverse-engineering agent · android · binary · frida
Jurig(巽他语:幽灵)—— 一个自主 AI 代理,萦绕在你的二进制文件之间。 在 TUI 中,幽灵会在工作时眨眼、上下浮动并闪烁微光。
完全自主、AI 代理化的逆向工程框架,带 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(阿里) | 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,或编辑 config.json 中的 active。通过扩展提供商的 models 列表来添加模型。通过 base_url 将任意提供商指向不同的基础
URL(例如自托管网关)。
Ollama:ollama serve + ollama pull qwen2.5-coder:14b,然后 Ctrl+O →
选择 ollama/…。无需密钥。
claude-cli(Claude Code 订阅):Anthropic 阻止第三方 HTTP 工具中的订阅认证
(2026 年 4 月),因此此路径会调用 claude
二进制。仅限咨询/聊天 —— 无原生工具调用;使用 openai/anthropic
提供商以获得完整的自主工具循环。
custom —— 一个通用提供商,适用于任何 OpenAI 兼容端点。Jurig
不附带硬编码网关;你在设置向导
(/setup)或 config.json 中自行填写基础 URL。适用于:
npx 9router)或 OmniRoute,
它们在 http://localhost:20128/v1 上代理 Cursor / Claude Code / Codex 账户。设置 base_url(例如 http://localhost:20128/v1),如果端点需要,还需设置
api_key(或 CUSTOM_API_KEY 环境变量 / URL 用 CUSTOM_BASE_URL)。localhost 网关被视为无需密钥即可就绪。custom 提供商标记为 auto_models,因此选择器(Ctrl+O)在打开时会从端点的 /models 获取实时目录 —— 按 r 刷新任意提供商的列表。对于订阅路由器,模型 ID 带有路由前缀(cu/ Cursor、cc/ Claude
Code、cx/ Codex)—— 自动加载的列表会显示确切的 ID。
在官方客户端之外使用订阅可能违反服务条款 —— 你的账户,你的风险。
go build -o jurig ./cmd/jurig
无需标志。首次运行(或当活动提供商没有密钥时)会启动交互式设置向导:选择提供商(OpenRouter / Kimi / Qwen / Ollama /
Anthropic / Claude 订阅)→ 密钥 → 模型 → 可选工具预安装 →
保存到 ~/.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/keys/AES…) |
native_libs | 列出 lib/<abi>/*.so + ABI(JNI 表面) |
search_code | 对源代码进行正则 grep —— 先定位再阅读 |
ask_user | 代理询问操作员(多选菜单) |
静态
| 工具 | 用途 |
|---|---|
jadx | APK/DEX/XAPK → Java(自动提取捆绑包,丰富摘要) |
apktool | APK → smali + 解码后的 manifest |
radare2 / ghidra | 原生二进制反汇编 / 无头反编译 |
elf_info / pe_info | 解析 ELF/PE 头、符号、导入(原生) |
hexdump / strings | 原始字节 / 可打印字符串 |
unzip | 原生 zip/apk/xapk/apks 解压(无 shell) |
动态与网络
| 工具 | 用途 |
|---|---|
adb | 设备控制 |
frida_ps | 列出设备应用/进程 |
frida | 运行自定义 Frida JS 脚本 |
frida_preset | 内置:ssl_unpin、list_classes、dump_class、hook、trace_http |
proxy | 原生 Go MITM 代理(goproxy)—— 捕获实时 HTTPS 流量 |
http_request | 重放/测试发现的 API 端点 |
download | 将 URL 获取到工作目录 |
实时网络捕获: proxy start 启动一个进程内 MITM 代理并
导出 CA。代理将设备指向它(adb)+ 安装 CA + 运行
frida_preset ssl_unpin,然后用 proxy flows 读取流。捕获的
请求/响应在 TUI 的 NET 侧面板中实时流式显示(当
终端足够宽时显示 —— 布局完全响应式)。
文件系统 / shell: read_file、write_file、list_dir、shell(Windows 上默认 PowerShell)。
标题栏在代理运行时显示实时令牌使用量(Nk↑ Nk↓)。
在 TUI 中:输入目标/指令,Enter 运行,PgUp/PgDn 滚动, Ctrl+C 中止/退出。代理会反编译、检查、用 frida 挂钩,并写出一个用 Glamour 内联渲染的 Markdown 报告。
工具从 PATH 或 tools_dir(~/.jurig/tools)解析。当代理
调用一个二进制缺失但目录已知的工具(jadx、apktool)时,它会
在运行中途自动下载 —— 无需手动步骤。jurig install <tool> 仍
可用于预热。重型/需许可的工具(ghidra)保持手动。
已检测/可安装:
| 工具 | 用途 | 获取方式 |
|---|---|---|
| jadx | APK/DEX → Java(固定 1.4.7;1.5.x 在 Java 21/Win 上 NPE) | jurig install jadx |
| apktool | APK → smali + manifest | jurig install apktool(jar;需要包装器) |
| radare2 | 原生反汇编/分析 | 系统包 |
| adb | 设备控制 | Android platform-tools |
| frida | 动态插桩 | pip install frida-tools + 设备上的 frida-server |
| ghidra | 无头反编译 | 手动安装,将 tools_dir/ghidra 指向它 |
~/.jurig/config.json(见 config.example.json)。环境变量覆盖:
ANTHROPIC_API_KEY、OPENROUTER_API_KEY、JURIG_PROVIDER、
ANTHROPIC_BASE_URL、JURIG_TOOLS_DIR。
cmd/jurig entrypoint, TUI/headless/install/doctor
internal/config config + env overlay
internal/llm Messages types, router, anthropic + openai-compat + claude-cli
internal/tools registry + tools (shell,fs,unzip,strings,radare2,jadx,apktool,adb,frida)
internal/portable resolve + install portable binaries
internal/agent autonomous loop + system prompt + events
internal/tui Bubble Tea app, Glamour rendering
MVP 可用:代理循环、提供商路由器、工具注册表、TUI、可移植管理器。 下一步:响应流式传输、网络捕获(mitmproxy)工具、ghidra 无头 工具、按目标会话持久化、frida-server 自动推送。