
بيئة تطوير متكاملة للهندسة العكسية الوكيلة مع مفكك تجميع متعدد المعماريات مكتوب بلغة Rust خالصة، ومفكك شيفرة أصلي، ومنقّح، ووكيل LLM لتحليل الملفات الثنائية وأعمال CTF.
بيئة هندسة عكسية قائمة على الوكلاء — تطبيق سطح مكتب من فئة Ghidra بروح "Cursor للهندسة العكسية". مبني باستخدام Tauri 2 (واجهة أمامية React + TypeScript) فوق خلفية تحليل قابلة للتوصيل. الافتراضي هو محرك أصلي بلغة Rust خالصة — لا عملية خارجية، لا اعتماد على copyleft، متعدد المعماريات عبر Capstone. يمكنك أيضًا تشغيل التحليل عبر r2 (radare2): ثبّته، واختره كمحرك، وسيقوده التطبيق بأكمله — أدوات الوكيل والواجهة. أداة الوكيل والواجهة مستقلتان عن الخلفية — راجع 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) مع تتبع تصحيح لكل دور؛ حلقة الوكيل نفسها تعمل
في الواجهة وفي منصة التقييمlift: ترفع دالة إلى IL لإزالة التشويش بنمط VTIL وتشغّل
تمريرات الانتشار/الطي/إزالة الكود الميت/حل التفرعات على الروتين بأكمله
— مفيدة عندما يبدو التفكيك كموزّع VM أو
سلسلة مسندات مبهمة (راجع docs/vtil-lift.md)decompile يُنتج شبه كود شبيه بـ C (if/while
بالبنية، تغطية تعليمات كاملة) من نفس خط أنابيب recurse-vtil
— لا أداة خارجية، لا حاجة لـ r2recurse-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 (افتراضي) — تحليل ELF/PE/Mach-O بلغة Rust خالصة وتفكيك متعدد المعماريات
(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) لا
يُعلن عنه إلا عند توفره. تستهلك الواجهة أنواع نتائج قانونية، وليس JSON أي محرك.
راجع docs/backends.md للسمة، وخيارات الحزم، وأساس
الترخيص. فتح ملف ثنائي كبير سريع لأن التحليل كسول — الاكتشاف يفهرس
الدوال بتكلفة زهيدة والكتل الأساسية تُفكّك فقط عند عرض دالة؛ راجع
docs/lazy-analysis.md.
ربط خادم MCP بـ IDA/Ghidra، أو لصق التفكيك في وكيل CLI، ينجح مع تحديات CTF من 5 دوال وينهار مع الملفات الثنائية الحقيقية. Recurse بيئة مبنية لغرض محدد، وليست غلافًا لروبوت محادثة:
pdF إلى السياق كل دور، لا 0x401023s مختلقة.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 ملف 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 من جذر مساحة العمل. 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 / .AppImage لـ Linuxtarget/release/recurseعلى Arch وتوزيعات rolling الأخرى تحتاج خطوة 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 في الجذر؛ npm run lint / npm run format /
npm run build داخل tauri/.
يُقيَّم الوكيل بدون واجهة مقابل مستويات 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 التقييم.
تعمل لوحة محادثة الوكيل على أي نقطة نهاية متوافقة مع 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
كامل كلاهما يعمل) واختر نموذجًا من كتالوج ذلك الخادم، أو اكتب معرّف نموذج
(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 الخاصة بنقطة النهاية.
تُعامل نقطة النهاية المخصصة كمهيّأة بدون مفتاح، لذا تعمل
المحادثة مباشرة مع خادم محلي.
بدون بيانات اعتماد يتراجع إلى عميل صدى ليبقى الربط قابلًا للاختبار.
يرى الوكيل سياق الملف الثنائي الحي (المعمارية، البتات، النوع) ويمكنه قيادة سطح التحليل الكامل (التفكيك، الإحالات المرجعية، السلاسل، الواردات، التفكيك) عبر الجلسة.
Apache-2.0 — © 2026 Aayush Khanna