एजेंटिक रिवर्स इंजीनियरिंग IDE, जिसमें बाइनरी विश्लेषण और CTF कार्य के लिए शुद्ध-Rust मल्टी-आर्किटेक्चर डिसअसेंबलर, नेटिव डीकंपाइलर, डीबगर और LLM एजेंट शामिल है।
एजेंटिक रिवर्स इंजीनियरिंग वातावरण — "रिवर्स इंजीनियरिंग के लिए Cursor" की भावना में एक Ghidra-श्रेणी का डेस्कटॉप ऐप। Tauri 2 (React + TypeScript फ्रंटएंड) के साथ एक प्लग करने योग्य विश्लेषण बैकएंड के ऊपर बनाया गया। डिफ़ॉल्ट एक शुद्ध-Rust नेटिव इंजन है — कोई बाहरी प्रक्रिया नहीं, कोई copyleft निर्भरता नहीं, Capstone के माध्यम से बहु-आर्किटेक्चर। आप r2 (radare2) के माध्यम से भी विश्लेषण चला सकते हैं: इसे इंस्टॉल करें, इसे इंजन के रूप में चुनें, और पूरा ऐप — एजेंट टूल्स और UI — इसके बजाय इसे चलाता है। एजेंट टूल और UI बैकएंड-अज्ञेय हैं — देखें docs/backends.md।

रूट पर Cargo वर्कस्पेस; डेस्कटॉप ऐप इसमें एक पैकेज है।
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 एजेंट को हेडलेस रूप से चलाता है। सभी वर्कस्पेस सदस्य हैं, इसलिए एक Cargo.lock और एक target/ पूरे रेपो को कवर करते हैं।
Ctrl+L से टॉगल करें)checksec नहीं), और विश्लेषण गणनाएँ/clear और पुनः खोलने के बाद भी बने रहते हैं, और अगले सत्र को सीड करते हैंrecurse-agent) प्रति-टर्न डीबग ट्रेसिंग के साथ; वही एजेंट लूप
UI में और eval harness में चलता हैlift ऑप: एक फ़ंक्शन को VTIL-शैली de-obfuscation IL में उठाता है और उस पर
पूरे-रूटीन propagation/folding/dead-code-elimination/branch-resolution
पास चलाता है — उपयोगी जब disassembly VM dispatcher या
opaque-predicate श्रृंखला जैसी दिखती है (देखें docs/vtil-lift.md)decompile उसी recurse-vtil
पाइपलाइन से C-जैसा pseudocode (if/while
संरचना, कुल निर्देश कवरेज) प्रस्तुत करता है — कोई बाहरी टूल नहीं, r2 आवश्यक नहींrecurse-mcp सर्वर: किसी भी
MCP-सक्षम एजेंट (Claude Code, Cursor, Claude Desktop, …) के लिए MCP stdio पर वही Engine — कोई Tauri नहीं, कोई
IDA सीट नहीं, कोई Python ब्रिज नहीं (देखें docs/recurse-mcp.md)विश्लेषण एक ही Engine ट्रेट (crates/recurse-static/src/engine.rs) से होकर जाता है, इसलिए
इंजन एक विकल्प है, कठोर निर्भरता नहीं:
native (डिफ़ॉल्ट) — शुद्ध-Rust ELF/PE/Mach-O पार्सिंग और बहु-आर्किटेक्चर disassembly
(object + capstone): x86/x86-64, ARM, AArch64, MIPS, PowerPC, RISC-V, SPARC, SystemZ,
M68K, BPF। कोई चाइल्ड प्रोसेस नहीं, कोई बाहरी टूल नहीं, बिल्ड में कोई LGPL नहीं। इसमें एक decompiler
(recurse-vtil की lift → optimize → structure पाइपलाइन — देखें
docs/vtil-lift.md) और VTIL-शैली de-obfuscation के लिए एक lift ऑप शामिल है।सेटिंग्स मेनू, RECURSE_BACKEND एनवायरनमेंट वेरिएबल, या संग्रहीत
कॉन्फ़िग से चुनें। एजेंट को एक बैकएंड-न्यूट्रल analyze टूल मिलता है (functions, disasm, graph,
lift, decompile, xrefs, strings, imports, info, साथ ही इंजन कंसोल के लिए raw) —
सक्रिय इंजन वास्तव में जिन ऑप्स का समर्थन करता है उन्हीं तक फ़िल्टर किया गया, इसलिए raw (नेटिव में कोई कंसोल नहीं) केवल
उपलब्ध होने पर ही विज्ञापित किया जाता है। UI किसी भी इंजन के JSON को नहीं, बल्कि कैनोनिकल परिणाम प्रकारों का उपभोग करता है।
ट्रेट, क्रेट विकल्पों, और लाइसेंसिंग
तर्क के लिए देखें docs/backends.md। एक बड़ी बाइनरी खोलना तेज़ है क्योंकि विश्लेषण lazy है — डिस्कवरी
फ़ंक्शन को सस्ते में इंडेक्स करती है और बेसिक ब्लॉक केवल तब डिकोड होते हैं जब किसी फ़ंक्शन को देखा जाता है; देखें
docs/lazy-analysis.md।
IDA/Ghidra पर एक MCP सर्वर स्टेपल करना, या CLI एजेंट में disassembly पेस्ट करना, 5-फ़ंक्शन CTFs के लिए काम करता है और वास्तविक बाइनरी पर विफल हो जाता है। Recurse एक उद्देश्य-निर्मित वातावरण है, चैटबॉट रैपर नहीं:
pdF डंप को कॉन्टेक्स्ट में फिर से पार्स करने की आवश्यकता नहीं, कोई आविष्कृत 0x401023 नहीं।npm test नहीं होता — सत्यापन
दृश्यात्मक है। एजेंट के नाम बदलाव तुरंत फ़ंक्शन सूची, ग्राफ़ और decompile में
प्रसारित होते हैं, इसलिए एक मानव एक क्लिक में पुष्टि या अस्वीकार करता है।| 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) के माध्यम से pseudocode प्रस्तुत करता है,
इंस्टॉल करने के लिए कुछ नहीं; r2 अपना अधिक पूर्ण decompiler प्रदान कर सकता है
जब इसका प्लगइन इंस्टॉल हो।
ऐप निर्भरताएँ tauri/ में रहती हैं; Rust वर्कस्पेस रूट से आता है। just दोनों को रैप करता है
(देखें just --list), या उन्हें सीधे चलाएँ।
just dev
# equivalent: cd tauri && npm install && npm run tauri dev
यह Vite dev सर्वर शुरू करता है और 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 tiers के विरुद्ध हेडलेस रूप से किया जाता है (देखें
crates/recurse-eval/README.md)। Tiers 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) प्रति रन चयन योग्य है — eval README देखें।
एजेंट चैट पैनल किसी भी OpenAI-संगत एंडपॉइंट पर चलता है। API कुंजी,
बेस URL, और मॉडल को इन-ऐप Model & Provider डायलॉग से कॉन्फ़िगर करें (जो
~/.recurse/recurse.db में संग्रहीत होता है), या env के माध्यम से:
# 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
रूट दोनों काम करते हैं) और उस सर्वर की कैटलॉग से एक मॉडल चुनें, या सीधे एक मॉडल आईडी
(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 क्लाइंट पर वापस आ जाता है ताकि वायरिंग व्यायाम योग्य बनी रहे।
एजेंट लाइव बाइनरी कॉन्टेक्स्ट (arch, bits, type) देखता है और सत्र के माध्यम से पूरी विश्लेषण सतह (disassembly, xrefs, strings, imports, decompilation) चला सकता है।
Apache-2.0 — © 2026 Aayush Khanna