IDE для агентной обратной разработки с мультиархитектурным дизассемблером на чистом Rust, нативным декомпилятором, отладчиком и LLM-агентом для анализа бинарных файлов и работы с CTF.
Среда агентного реверс-инжиниринга — десктопное приложение класса Ghidra в духе «Cursor для реверс-инжиниринга». Построено на Tauri 2 (фронтенд на React + TypeScript) поверх подключаемого бэкенда анализа. По умолчанию используется чисто-Rust нативный движок — без внешних процессов, без copyleft-зависимостей, мультиархитектурность через Capstone. Также можно запускать анализ через r2 (radare2): установите его, выберите в качестве движка, и всё приложение — инструменты агента и UI — будет работать через него. Инструмент агента и UI не зависят от бэкенда — см. docs/backends.md.

Cargo workspace в корне; десктопное приложение — один из пакетов в нём.
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 управляет агентом в headless-режиме. Все они — члены workspace, поэтому один
Cargo.lock и один target/ покрывают весь репозиторий.
Ctrl+L)checksec), и счётчики анализа/clear и переоткрытие, и засевают следующую сессиюrecurse-agent) с отладкой трассировки по ходам; один и тот же цикл агента работает
в UI и в eval-харнессеlift: поднимает функцию в VTIL-подобный IL деобфускации и выполняет
над ней проходы распространения/свёртывания/удаления мёртвого кода/разрешения ветвлений
по всей процедуре — полезно, когда дизассемблирование выглядит как диспетчер VM или
цепочка непрозрачных предикатов (см. docs/vtil-lift.md)decompile рендерит C-подобный псевдокод (if/while
структурирование, полное покрытие инструкций) из того же конвейера recurse-vtil
— без внешних инструментов, r2 не требуетсяrecurse-mcp: тот же Engine через MCP stdio для любого
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 в сборке. Включает декомпилятор
(конвейер lift → optimize → structure из recurse-vtil — см.
docs/vtil-lift.md) и операцию lift для VTIL-подобной деобфускации.Выбор через меню настроек, переменную окружения RECURSE_BACKEND или сохранённую
конфигурацию. Агент получает один нейтральный к бэкенду инструмент 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-агента работает для CTF с 5 функциями и разваливается на реальных бинарниках. Recurse — это специализированная среда, а не обёртка над чат-ботом:
pdF в контекст на каждом ходу, никаких выдуманных 0x401023.npm test — верификация
визуальна. Переименования агентом мгновенно распространяются на список функций, граф и декомпиляцию,
так что человек подтверждает или отклоняет в один клик.| Инструмент | Версия (протестировано) | Установка |
|---|---|---|
| Node.js | ≥ 20 (использовалась 23.11) | https://nodejs.org или nvm |
| npm | ≥ 10 | поставляется с Node.js |
| Rust | ≥ 1.77 (использовалась 1.97) | https://rustup.rs |
| cargo | — | поставляется с Rust (rustup) |
Проверка:
node --version && npm --version && rustc --version && cargo --version
Движок по умолчанию native — чистый Rust — устанавливать ничего не нужно. Чтобы использовать r2 (radare2)
в качестве движка анализа, установите его и выберите (меню настроек или
RECURSE_BACKEND=r2); Recurse управляет бинарником r2 в вашем PATH. 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.
Оба движка предоставляют его: native рендерит псевдокод через recurse-vtil
(lift → optimize → structure — см. docs/vtil-lift.md),
устанавливать ничего не нужно; r2 может предоставить свой, более полный декомпилятор,
когда установлен его плагин.
Зависимости приложения находятся в tauri/; Rust — из корня workspace. just оборачивает
оба (см. just --list), или управляйте ими напрямую.
just dev
# equivalent: cd tauri && npm install && npm run tauri dev
Это запускает dev-сервер Vite и открывает окно Tauri. Первая компиляция занимает некоторое время (сборка Rust); последующие — быстрые.
just build
# equivalent: cd tauri && npm run tauri build
Бандл оказывается в target/release/bundle/ (целевой каталог workspace):
.deb / .rpm / .AppImage для Linuxtarget/release/recurseНа Arch и других rolling-дистрибутивах шаг AppImage требует одноразового локального исправления
(upstream 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 в корне; npm run lint / npm run format /
npm run build внутри tauri/.
Агент оценивается в headless-режиме на уровнях 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 на задачу с полной пошаговой беседой. Бэкенд (native или
r2) выбирается для каждого запуска — см. README по eval.
Панель чата агента работает на любом 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-server из llama.cpp, 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 эндпоинта. Пользовательский эндпоинт считается настроенным без ключа, поэтому
чат работает из коробки с локальным сервером.
Без учётных данных он откатывается к echo-клиенту, чтобы связка оставалась проверяемой.
Агент видит живой контекст бинарника (архитектура, разрядность, тип) и может управлять всей поверхностью анализа (дизассемблирование, xrefs, строки, импорты, декомпиляция) через сессию.
Apache-2.0 — © 2026 Aayush Khanna