
إخفاء آثار الذاكرة باستخدام ROP ونقاط التوقف العتادية.
هذه الأداة عبارة عن إثبات مفهوم (PoC) بسيط لكيفية إخفاء آثار الذاكرة باستخدام سلسلة ROP بالإضافة إلى نقاط توقف الأجهزة. ستقوم سلسلة ROP بتغيير حماية صفحة الذاكرة الخاصة بالوحدة الرئيسية إلى N/A أثناء النوم (أي عند استدعاء الدالة Sleep). لمزيد من المعلومات التفصيلية حول هذه التقنية لتجنب مسح الذاكرة، تحقق من المشروع الأصلي Gargoyle. x64 فقط.
الفكرة هي إعداد نقطة توقف أجهزة في kernel32!Sleep ومرشح جديد من المستوى الأعلى للتعامل مع الاستثناء. عند استدعاء Sleep، يتم تشغيل دالة مرشح الاستثناء التي تم تعيينها من قبل، مما يسمح لنا باستدعاء سلسلة ROP دون الحاجة إلى استخدام خطافات الدوال التقليدية. بهذه الطريقة، نتجنب ترك مناطق ذاكرة خاصة غريبة وغير عادية في العملية مرتبطة بـ dlls المعروفة.
تقوم سلسلة ROP ببساطة باستدعاء VirtualProtect() لتعيين صفحة الذاكرة الحالية إلى N/A، ثم تستدعي SleepEx وأخيراً تستعيد حماية الذاكرة RX.
نظرة عامة على العملية كما يلي:
تتكرر هذه العملية إلى أجل غير مسمى.
كما يمكن رؤيته في الصورة، يتم تغيير حماية الذاكرة للوحدة الرئيسية إلى N/A أثناء النوم، مما يتجنب عمليات مسح الذاكرة التي تبحث عن صفحات بإذن التنفيذ.

نظرًا لأننا نستخدم إضافة LITCRYPT لتعتيم حرفيات السلاسل، فمن المطلوب تعيين متغير البيئة LITCRYPT_ENCRYPT_KEY قبل تجميع الكود:
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"
بعد ذلك، قم ببساطة بتجميع الكود وتشغيل الأداة:
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
هذه الأداة هي مجرد إثبات مفهوم (PoC) ويجب تنفيذ بعض الميزات الإضافية لتكون وظيفية بشكل كامل. كان الغرض الرئيسي من المشروع هو تعلم كيفية تنفيذ سلسلة ROP ودمجها داخل Rust. لهذا السبب، ستعمل هذه الأداة فقط إذا استخدمتها كما هي، ومن المتوقع حدوث أعطال إذا حاولت استخدامها بطرق أخرى (على سبيل المثال، تجميعها في dll ومحاولة تحميلها وتنفيذها بشكل انعكاسي).