
バイナリ解析とCTF作業のための、純粋なRust製マルチアーキテクチャ逆アセンブラ、ネイティブ逆コンパイラ、デバッガ、およびLLMエージェントを備えたエージェント型リバースエンジニアリングIDE。
エージェント型リバースエンジニアリング環境 — 「リバースエンジニアリングのための Cursor」の精神で作られた Ghidra クラスのデスクトップアプリ。Tauri 2(React + TypeScript フロントエンド)で構築され、プラグイン可能な解析バックエンドの上に成り立っています。デフォルトは純粋な Rust ネイティブエンジン — 外部プロセスなし、コピーレフト依存なし、Capstone によるマルチアーキテクチャ対応。r2(radare2)を通じて解析を実行することもできます。インストールしてエンジンとして選択すれば、アプリ全体 — エージェントツールと UI — がそれを使って動作します。エージェントツールと UI はバックエンド非依存です — docs/backends.md を参照してください。

ルートに Cargo ワークスペースがあり、デスクトップアプリはその中の 1 パッケージです。
tauri/ desktop app (Tauri + React)
src/ React frontend
src-tauri/ Tauri Rust backend (engine sessions, agent wiring)
package.json app scripts (Vite, Vitest, Tauri CLI)
crates/
recurse-agent/ agent framework: LLM loop, tool runtime, SQLite memory
recurse-static/ static analysis: ELF/PE/Mach-O parsing, multi-arch disassembly,
CFG and cross-reference recovery, the engine seam
recurse-vtil/ VTIL-inspired de-obfuscation/de-virtualization IL, lifter, optimizer
recurse-mcp/ standalone headless MCP server (stdio) over the engine — no Tauri, no IDA
recurse-debug/ cross-platform debugger (ptrace/Mach/Win32, breakpoints, stepping)
recurse-eval/ headless eval harness (YAML-configured tiers)
justfile single entry point for both halves
recurse-agent はエージェントのみです。静的解析は recurse-static に、デバッガは recurse-debug にあるため、エージェントは使用しないシステムコードを取り込みません。どのクレートも Tauri に依存せず、それぞれ単独でビルド/テストできます。recurse-eval はエージェントをヘッドレスで駆動します。すべてワークスペースメンバーなので、1 つの Cargo.lock と 1 つの target/ がリポジトリ全体をカバーします。
Ctrl+L で切り替え)checksec 不要)、および解析カウント/clear や再オープンを経ても保持され、次のセッションのシードになりますrecurse-agent)。同じエージェントループが UI と eval ハーネスの両方で動作しますlift オペレーション: 関数を VTIL スタイルの難読化解除 IL に持ち上げ、ルーチン全体の伝播/畳み込み/デッドコード除去/分岐解決パスを実行します — 逆アセンブリが VM ディスパッチャや不透明述語チェーンのように見える場合に有用です(docs/vtil-lift.md を参照)decompile は同じ recurse-vtil パイプラインから C ライクな擬似コード(if/while 構造化、全命令カバレッジ)を生成します — 外部ツール不要、r2 も不要recurse-mcp サーバー: MCP stdio 経由で同じ Engine を任意の MCP 対応エージェント(Claude Code、Cursor、Claude Desktop など)に提供 — Tauri 不要、IDA シート不要、Python ブリッジ不要(docs/recurse-mcp.md を参照)解析は単一の Engine トレイト(crates/recurse-static/src/engine.rs)を通じて行われるため、エンジンは選択肢であり、ハード依存ではありません:
native(デフォルト) — 純粋な Rust による ELF/PE/Mach-O パースとマルチアーキテクチャ逆アセンブリ(object + capstone): x86/x86-64、ARM、AArch64、MIPS、PowerPC、RISC-V、SPARC、SystemZ、M68K、BPF。子プロセスなし、外部ツールなし、ビルドに LGPL なし。逆コンパイラ(recurse-vtil の lift → optimize → structure パイプライン — docs/vtil-lift.md を参照)と、VTIL スタイルの難読化解除のための lift オペレーションを含みます。設定メニュー、RECURSE_BACKEND 環境変数、または保存された設定で選択します。エージェントは 1 つのバックエンド中立な analyze ツール(functions、disasm、graph、lift、decompile、xrefs、strings、imports、info、およびエンジンコンソール用の raw)を取得します — アクティブなエンジンが実際にサポートするオペレーションにフィルタリングされるため、raw(native にはコンソールがない)は利用可能な場合にのみ通知されます。UI は任意のエンジンの JSON ではなく、正規の結果型を消費します。トレイト、クレートの選択、ライセンスの根拠については docs/backends.md を参照してください。大きなバイナリを開くのが高速なのは、解析が遅延であるためです — ディスカバリは関数を安価にインデックス化し、基本ブロックは関数が表示されたときにのみデコードされます。docs/lazy-analysis.md を参照してください。
MCP サーバーを IDA/Ghidra に接ぎ木したり、逆アセンブリを CLI エージェントに貼り付けたりするのは、5 関数の CTF なら機能しますが、実際のバイナリでは破綻します。Recurse はチャットボットのラッパーではなく、目的に特化して作られた環境です:
pdF ダンプをコンテキストに再パースする必要も、でっち上げの 0x401023 もありません。npm test がありません — 検証は視覚的に行います。エージェントのリネームは関数リスト、グラフ、逆コンパイルに即座に反映されるため、人間がワンクリックで確認または却下できます。| Tool | Version (tested) | Install |
|---|---|---|
| Node.js | ≥ 20 (23.11 used) | https://nodejs.org or nvm |
| npm | ≥ 10 | ships with Node.js |
| Rust | ≥ 1.77 (1.97 used) | https://rustup.rs |
| cargo | — | ships with Rust (rustup) |
確認:
node --version && npm --version && rustc --version && cargo --version
デフォルトの native エンジンは純粋な Rust です — インストールするものはありません。代わりに r2(radare2)を解析エンジンとして使用するには、インストールして選択します(設定メニュー、または RECURSE_BACKEND=r2)。Recurse は PATH 上の r2 バイナリを駆動します。r2 はオプションであり、ビルドで要求されることはなく、Recurse と共に配布されることもありません — ご自身でインストールしてください。
Debian/Ubuntu/Pop!_OS:
sudo apt update
sudo apt install -y libwebkit2gtk-4.1-dev build-essential \
curl wget file libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
その他のディストリビューション: 公式の Tauri prerequisites に従ってください。
両方のエンジンが提供します: native は recurse-vtil を介して擬似コードを生成し(lift → optimize → structure — docs/vtil-lift.md を参照)、インストールするものはありません。r2 はプラグインがインストールされていれば、より完全な独自の逆コンパイラを提供できます。
アプリの依存関係は tauri/ にあり、Rust はワークスペースルートから取得します。just は両方をラップします(just --list を参照)、または直接駆動することもできます。
just dev
# equivalent: cd tauri && npm install && npm run tauri dev
これにより Vite 開発サーバーが起動し、Tauri ウィンドウが立ち上がります。最初のコンパイルにはしばらくかかります(Rust ビルド)が、以降は高速です。
just build
# equivalent: cd tauri && npm run tauri build
バンドルは target/release/bundle/(ワークスペースターゲット)に出力されます:
.deb / .rpm / .AppImagetarget/release/recurse にあるスタンドアロンバイナリArch やその他のローリングディストリビューションでは、AppImage ステップに一度きりのローカル修正が必要です(上流の linuxdeploy がディストリビューションのツールチェーンに遅れているため) — docs/linux-appimage-build.md を参照してください。
just preview
# equivalent: cd tauri && npm run build && npm run preview
just lint # cargo clippy --workspace + eslint
just fmt # cargo fmt --all + prettier
just fmt-check # verify without writing
just test # cargo test --workspace + vitest
同等の直接コマンド: ルートで cargo clippy --workspace --all-targets、cargo test --workspace。tauri/ 内で npm run lint / npm run format / npm run build。
エージェントは crackme ティアに対してヘッドレスで評価されます(crates/recurse-eval/README.md を参照)。ティアは YAML です: データセットに対する選択フィルタ、または凍結された hexid リスト、および実行ノブ。
just eval-fetch # download the tier's binaries
just eval-test # harness self-tests (no API key needed, no LLM calls)
just eval-run # run the tier — the only way to execute an eval YAML
eval-run はテストではなくバイナリであるため、cargo test がエージェントに金銭や時間を費やすことはありません。エンドポイント + キーは crates/recurse-eval/.env に記述します(.env.example をコピー)。各実行は target/eval-traces/<tier>/<backend>/run.log(完全なナラティブ)と、タスクごとに完全なターンごとの会話を含む <hexid>.json を 1 つ書き出します。バックエンド(native または r2)は実行ごとに選択可能です — eval README を参照してください。
エージェントチャットパネルは任意の OpenAI 互換エンドポイントで動作します。API キー、ベース URL、モデルはアプリ内の Model & Provider ダイアログから設定するか(~/.recurse/recurse.db に永続化)、環境変数で設定します:
# Hosted provider (default)
export RECURSE_LLM_API_KEY=sk-or-... # or OPENROUTER_API_KEY
export RECURSE_LLM_ENDPOINT=https://openrouter.ai/api/v1/chat/completions # optional
export RECURSE_LLM_MODEL=openrouter/auto # optional
エージェントを任意のローカルまたはセルフホストの OpenAI 互換サーバー — Ollama、LM Studio、llama.cpp の llama-server、vLLM、text-generation-webui、またはリモートゲートウェイ — に向けます。ダイアログで Base URL を設定し(ベアなベース URL でも完全な /chat/completions ルートでも動作します)、そのサーバーのカタログからモデルを選択するか、モデル ID(llama3.1:8b、qwen2.5-coder など)を直接入力します:
export RECURSE_LLM_ENDPOINT=http://localhost:11434/v1 # Ollama
export RECURSE_LLM_MODEL=llama3.1:8b
export RECURSE_LLM_API_KEY= # usually unnecessary locally
ローカルエンドポイントには API キーは不要です: キーが空の場合、リクエストは Authorization ヘッダーなしで送信され、モデルリストはエンドポイント自身の {base}/models から読み取られます。カスタムエンドポイントはキーなしで設定済みとして扱われるため、チャットはローカルサーバーに対してすぐに動作します。
認証情報がない場合はエコークライアントにフォールバックするため、配線は引き続き試すことができます。
エージェントはライブのバイナリコンテキスト(アーキテクチャ、ビット数、タイプ)を認識し、セッションを通じて完全な解析サーフェス(逆アセンブリ、xref、文字列、インポート、逆コンパイル)を駆動できます。
Apache-2.0 — © 2026 Aayush Khanna