
RefleXXion هي أداة مصممة للمساعدة في تجاوز خطافات وضع المستخدم التي تستخدمها برامج مكافحة الفيروسات (AV) وأنظمة حماية نقطة النهاية (EPP) وأدوات كشف الاستجابة (EDR) وغيرها. من أجل تجاوز خطافات وضع المستخدم، تقوم أولاً بجمع أرقام استدعاءات النظام الخاصة بـ NtOpenFile وNtCreateSection وNtOpenSection وNtMapViewOfSection الموجودة في مصفوفة LdrpThunkSignature.

RefleXXion هي أداة مصممة للمساعدة في تجاوز الخطافات (hooks) على مستوى المستخدم التي تستخدمها برامج مكافحة الفيروسات / منصات الحماية من نقاط النهاية / كشف والاستجابة على نقاط النهاية (AV/EPP/EDR) وغيرها. لتجاوز هذه الخطافات، تقوم الأداة أولاً بجمع أرقام استدعاءات النظام (syscall numbers) للدوال NtOpenFile و NtCreateSection و NtOpenSection و NtMapViewOfSection الموجودة في مصفوفة LdrpThunkSignature. بعد ذلك، هناك تقنيتان يمكن للمستخدم اختيار واحدة منهما لتجاوز الخطافات.
التقنية الأولى تقرأ NTDLL كملف من C:\Windows\System32\ntdll.dll. بعد التحليل، يتم استبدال مقطع .TEXT الخاص بـ NTDLL المحمل بالفعل في الذاكرة (حيث يتم تنفيذ الخطافات) بمقطع .TEXT الخاص بـ NTDLL النظيف.
في التقنية الثانية، تُقرأ NTDLL كـ Section من KnownDlls، \KnownDlls\ntdll.dll. (لأن ملفات DLL مخزنة مؤقتاً في KnownDlls كـ Section.) بعد التحليل، يتم استبدال مقطع .TEXT الخاص بـ NTDLL المحمل بالفعل في الذاكرة (حيث يتم تنفيذ الخطافات) بمقطع .TEXT الخاص بـ NTDLL النظيف.
التفصيل الدقيق للمنهجية وجميع التقنيات موضح أدناه.

يمكنك فتح المشروع وتجميعه باستخدام Visual Studio. يدعم المشروع بأكمله بنية x64 لكل من وضعي Debug و Release.
يقوم حل RefleXXion-EXE بإنشاء ملف EXE لأغراض إثبات المفهوم (PoC). إذا كنت تريد فهم كيفية عمل المشروع خطوة بخطوة، فإنه سيسهل مهمتك. تحتوي الدالة الرئيسية (Main) على تعريفات لدالتي Technique1 و Technique2. علّق على إحداهما وقم بالتجميع. لا تستخدم كلتا الدالتين في نفس الوقت.
يقوم حل RefleXXion-DLL بإنشاء DLL تقوم بحقنه في العملية التي تريد تجاوز الخطافات على مستوى المستخدم فيها لـ NTDLL. في بداية ملف main.cpp، توجد تعريفات لأي تقنية سيتم استخدامها. يمكنك اختيار إحداها وتجميعها. لا تقم بتعيين جميع القيم في نفس الوقت، قم فقط بتعيين التقنية التي تريدها. مثال على التكوين موضح أدناه.
// قسم تكوين التقنيات
#define FROM_DISK 1 // إذا قمت بتعيينها إلى 1، سيتم استخدام التقنية-1. لمزيد من المعلومات؛ https://github.com/hlldz/RefleXXion
#define FROM_KNOWNDLLS 0 // إذا قمت بتعيينها إلى 1، سيتم استخدام التقنية-2. لمزيد من المعلومات؛ https://github.com/hlldz/RefleXXion
يدعم RefleXXion حالياً بنية x64 فقط.
يقوم RefleXXion بإزالة الخطافات فقط من دوال NTDLL، قد تحتاج أيضاً إلى إزالة الخطافات من DLLs أخرى (مثل kernel32.dll و advapi32.dll). للقيام بذلك، يمكنك بسهولة تعديل الأماكن اللازمة في المشروع.
يستخدم RefleXXion فقط منطقة الذاكرة RWX عند بدء عملية الكتابة فوق مقطع .TEXT. لا يتم إنشاء منطقة ذاكرة جديدة لهذه العملية، بل يتم تحويل منطقة الذاكرة الموجودة (مقطع .TEXT الخاص بـ NTDLL المحمل بالفعل) إلى RWX ثم تحويلها إلى RX.
ULONG oldProtection;
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy()...
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, oldProtection, &oldProtection);
ملاحظة: يستدعي RefleXXion API NtProtectVirtualMemory عبر NTDLL النظيف المثبت. يستخدم دالة CustomGetProcAddress لهذا الغرض لأن NTDLL النظيف غير موجود في InLoadOrderModuleList على الرغم من تحميله في الذاكرة. لذا فإن حلًا مثل هذا (https://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32) لن يعمل. لهذا السبب توجد دالة GetProcAddress المخصصة ويتم استخدامها.
يمكنك تحميل RefleXXion DLL من القرص إلى العملية المستهدفة. قد لا تفضل مثل هذا التشغيل للأعمال الحساسة مثل عمليات الفريق الأحمر. لذلك، يمكنك تحويل RefleXXion DLL إلى شيل كود باستخدام مشروع sRDI أو دمج كود RefleXXion في المحمل الخاص بك أو مشروعك.
حتى إذا تم إعادة تحميل NTDLL (كملف أو كـ Section) إلى العملية المحقونة، فإنها لا تبقى محملة. يقوم RefleXXion بإغلاق جميع المقابض المفتوحة (مقابض الملفات والأقسام) لعملياته الخاصة.