
استعد ما يخفيه التشويش في ثنائيات Rust (السلاسل، والحزم، ودوال المكتبات، وتدفق التحكم المسطّح) عبر التحليل الساكن + محاكاة Unicorn، دون تشغيلها. لفرز البرمجيات الخبيثة، وتدقيق التطبيقات المحمية. ELF/PE/Mach-O، x86-64/ARM64/32-bit.
strings لا يرى شيئًا. FLOSS لا يرى شيئًا. rust-deobf يرى C2.
يستعيد rust-deobf ما تخفيه ثنائيات Rust المُشوَّهة — عناوين C2، ومسارات الملفات، وmutexes، ومفاتيح التسجيل، والإعدادات — دون تشغيل العينة إطلاقًا.
عرض توضيحي · استخدمه من وكيل ذكاء اصطناعي · بدء سريع · النتائج · برمجيات خبيثة حقيقية · القيود
برنامج Rust مُجرَّد بُني بالطريقة التي تُشحن بها البرمجيات الخبيثة (opt-level="z"، وLTO كامل، وpanic=abort)،
مع تشفير مؤشراته الثمانية بواسطة obfstr — إذ تستقر السلاسل النصية
داخل بنية (struct)، وفروع match، والمقارنات، وفرع لا يُنفَّذ أبدًا. ولا يُطبَع أيٌّ منها إطلاقًا.
مُستخرَج من المخرجات المُلتقطة لتشغيل حقيقي (Linux x86-64، وrustc 1.97): النص حرفي، والألوان وحركة الكتابة مُضافة، وانتظار المحاكاة البالغ ~8 ثوانٍ مُسرَّع، و المخرجات مُقتطعة إلى السلاسل النصية المفكوكة. والمخرجات النصية العادية أدناه هي نفس التشغيل.
ما الذي يُظهره لك الملف:
$ B=build/scatter_obfstr__elf__size-lto__strip
$ strings $B | grep -ciE 'northwind|10\.66|NW-5c1e9a|skip-update'
0
ما الذي يستعيده rust-deobf (تحليل ساكن + محاكاة Unicorn؛ لا يُنفَّذ الملف الثنائي أبدًا):
$ python3 scripts/recover.py $B
binary: scatter_obfstr__elf__size-lto__strip format=ELF arch=x86_64
static x86-64 (recover_callsite): 0 strings decoders=9 seconds=0.2
emulation (recover_emulate): 8 strings functions=416/416 timed_out=False workers=1 seconds=6.8
== decoded strings ==
10.66.12.7:8443 [ip]
function 0xf20c (emulation)
C:\ProgramData\NorthwindSvc\state.db [path]
function 0xf20c (emulation)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) NorthwindAgent/2.1
function 0xf20c (emulation)
--skip-update-check
function 0xf443 (emulation)
Software\Northwind\Agent\Settings [registry]
function 0xf51b (emulation)
Global\NW-5c1e9a [mutex]
function 0xf5a8 (emulation)
https://telemetry.northwind.example/api/v3/beacon [url]
function 0xfd58 (emulation)
nw-agent::stage=collect
function 0xfd58 (emulation)
8/8 في أقل من 10 ثوانٍ، كل سلسلة موسومة ومتتبَّعة إلى الدالة التي تبنيها.
أعِد إنتاج ذلك باستخدام ONLY=scatter_obfstr PROFILES=size-lto FORMATS=elf bash scripts/build_all.sh
(المخرجات مختصرة إلى السلاسل المفكوكة). (المدخل برنامج قياس أداء غير ضار؛
كل سلسلة مزروعة مُدرجة في bench_src/manifest.json.)
برمجيات Rust الخبيثة في تزايد، وأدوات إزالة التشويش الخاصة بها غائبة فعليًا. FLOSS — أداة إزالة تشويش السلاسل مفتوحة المصدر المعيارية — لا تستعيد شيئًا من حزم تشويش Rust الشائعة:
| أداة التشويش | strings | FLOSS | rust-deobf |
|---|---|---|---|
| litcrypt / litcrypt2 | 0/5 | 0/5 | 5/5 |
| obfstr (XOR+ADD مضمّنة) | 0/5 | 0/5 | 5/5 |
| cryptify (المفتاح الافتراضي) | 0/5 | 0/5 | 5/5 |
| muddy (ChaCha20-Poly1305 AEAD) | 0/5 | 0/5 | 5/5 |
| سلاسل مكدّسة محكمة | 0/5 | 0/5 | 5/5 |
| XOR / ADD / SUB مكتوبة يدويًا | 0/5 | 0/5 | 5/5 |
قياس أداء Canary، إصدارات release، ELF وPE لمعماريتي x86-64 وAArch64، مجرّدة وغير مجرّدة. الجدول الكامل، بما في ذلك الحالة الوحيدة التي تحتاج إلى استعادة ديناميكية (cryptify بمفتاح مخصص)، ضمن النتائج.
على عينات حقيقية: EDDIESTEALER (PE) — 32 سلسلة مشوّشة بما في ذلك نطاق C2 المخفي و مسار URL، حيث تستعيد الأدوات الساكنة وFLOSS صفرًا. AmnesiaStealer (macOS Mach-O) — رابط تسريب C2، وإعدادات crypto-clipper، ومسارات التجهيز. المزيد أدناه.
إزالة تشويش السلاسل — استعادة ساكنة لموقع الاستدعاء (ثوانٍ) + محرك محاكاة Unicorn مع
محمّل حقيقي، وبيئة تشغيل C، واستكشاف المسارات، وإعادة تشغيل المُنشِئات العامة. يستعيد السلاسل المبنية
فقط في فرع match واحد أو على مسار لا يُنفَّذ أبدًا.
فرز SOC في شاشة واحدة — soc_triage.py: الصيغة/المعمارية، سلسلة أدوات Rust، بصمة قدرات
الحزمة (شبكات / تشفير / استطلاع / استمرارية / تجهيز)، والمؤشرات مجمّعة حسب النوع، و
إشارة معايَرة LOW / MEDIUM / HIGH مع أدلتها. --json لـ SIEM، و--fail-on HIGH
للبوابة البرمجية. --fast (البيانات الوصفية + المؤشرات الحرفية، دون فك ترميز) يتوسّع مع حجم
الملف الثنائي: أقل من ثانية على عينة صغيرة، وحوالي 20 ثانية على ملف ثنائي بحجم 20 ميغابايت.
متعدد المعماريات والصيغ — x86-64 وARM64 وx86 32-بت عبر ELF وPE وMach-O.
يتلاءم مع سير عملك — تصدير متوافق مع FLOSS (--floss-json)، وتعليق Ghidra بلا واجهة
(تعليقات plate، وإشارات مرجعية، وإعادة تسمية)، وتحديد دوال المكتبات عبر بصمة البايت
(lib_<name> في الملفات الثنائية المجرّدة)، ووضع الدفعات على دليل (--jsonl).
أبعد من السلاسل — استخراج الإعدادات/C2، وحل استيرادات API المشوّشة بالتجزئة، ونحت المرحلة الثانية
غير المعبّأة، وكشف تسطيح تدفق التحكم وإعادة بنائه (x86-64 وAArch64،
مُتحقَّق منه على goldberg وOLLVM -fla وتمريرة تسطيح حقيقية من LLVM-18)، وتبسيط MBA / المسندات
المعتمة باستخدام Z3، واستعادة vtable لكائنات سمات Rust (recover_types.py)، و
عكس التحسينات (إلغاء تبديل جداول القفز، وكشف الحلقات غير الملفوفة — premium/opt_reverse.py).
افتراضية الشيفرة — detect_vm.py يرصد الآلات الافتراضية للبايت كود بأسلوب VMProtect/Themida/Tigress؛
وأداة إزالة الافتراضية المميزة ترفعها مرة أخرى. من آلة افتراضية ذات أكواد تشغيل عشوائية ومعاملات
مشفّرة، يعيد بناء:
return (((a0 > 1000) & (((((a0 * 31) + a1) ^ (a0 >> 3)) % 97) == 0)) ? (a1 + a0) : 0xffffffff);
— الكود المصدري الدقيق للدالة.
آمن بحكم التصميم — التحليل الساكن والمحاكاة افتراضيًا: تُشغّل المحاكاة دوال الملف الثنائي تحت Unicorn، وليس الملف الثنائي نفسه أبدًا. الاسترداد الديناميكي (Frida) اختياري وللأجهزة الافتراضية المعزولة فقط.
بيانات وصفية لـ Rust تصمد أمام strip — إصدار rustc، وحزم الطرف الثالث بإصداراتها الدقيقة،
ومواقع panic، معاد بناؤها من مسارات المصدر التي يتركها المترجم في كل ملف ثنائي Rust (دون
حاجة إلى cargo-auditable).
عرض السلاسل النصية في أي مفكك، أو strings، أو FLOSS — أي أداة تقرأ السلاسل النصية من الملف — لا يمكنها
عرض سوى البايتات الموجودة فعليًا في الملف. تضمن حزمة التشويش ألا يكون النص الصريح موجودًا أبدًا، لذا يرى وكيل
الذكاء الاصطناعي الذي يقرأ مخرجات مفكك الشيفرة نفس اللاشيء الذي تراه أنت. بدلًا من ذلك، يمنحه rust-deobf الحقائق.
إنه أداة سطر أوامر (CLI) بمخرجات JSON، لذا يمكن لأي وكيل قادر على تشغيل أوامر shell (Claude Code، Codex، Cursor، …) استدعاؤه إلى جانب أي أدوات تفكيك شيفرة يستخدمها بالفعل: