
完全自律型のリバースエンジニアリング用AIエージェント
.-. ██ ██ ██ ██████ ██ ██████
(o o) ██ ██ ██ ██ ██ ██ ██
| u | ██ ██ ██ ██████ ██ ██ ███
| | ██ ██ ██ ██ ██ ██ ██ ██ ██
'~-~' █████ ██████ ██ ██ ██ ██████
autonomous reverse-engineering agent · android · binary · frida
Jurig(スンダ語で幽霊)— あなたのバイナリにとりつく自律型 AI エージェント。 TUI では、作業中に幽霊がまばたきし、揺れ、きらめきます。
TUI を備えた、完全自律型の AI エージェントによるリバースエンジニアリングフレームワーク。 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 を解決。カタログからインストール |
1 つのルーターの背後にある 2 つのワイヤープロトコル:
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 を設定するか、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 はハードコードされたゲートウェイを同梱していません。ベース 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 環境変数 / 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 + デコードされたマニフェスト |
radare2 / ghidra | ネイティブバイナリの逆アセンブル / ヘッドレス逆コンパイル |
elf_info / pe_info | ELF/PE ヘッダー、シンボル、インポートを解析(ネイティブ) |
hexdump / strings | 生バイト / 印刷可能な文字列 |
unzip | ネイティブの zip/apk/xapk/apks 展開(シェル不使用) |
動的 & ネットワーク
| ツール | 目的 |
|---|---|
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 サイドパネルにライブでストリーミングされます(ターミナルが十分に広い場合に表示 — レイアウトは完全にレスポンシブ)。
ファイルシステム / シェル: 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 + マニフェスト | 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。