BumbleCrypt
أداة Crypter مستوحاة من Bumblebee
الخلفية
تم استيحاء BumbleCrypt من أداة Crypter الخاصة بـ Bumblebee؛ ففي حالة Bumblebee، يتم تحميل ملف DLL الرئيسي الخاص بـ Bumblebee في الذاكرة وتنفيذه بالطريقة التالية:
- يفك تشفير الحمولة (payload) ويكتبها في الكومة (Heap)
- يربط ثلاث واجهات من NtApi - NtOpenFile وNtCreateSection وNtMapViewOfSection
- يستدعي LoadLibraryW("gdiplus.dll") مما يؤدي إلى تفعيل خطافات الاستدعاء المضمّنة (inline hooks) نظراً لأن الواجهات الثلاث المذكورة أعلاه تُستخدم بواسطة LoadLibrary() لتحميل أي مكتبة.
- تقوم الخطافات المضمّنة وLoadLibrary نفسها بعد ذلك بتحميل ملف Bumblebee DLL الرئيسي بدلاً من "gdiplus.dll"
- وأخيراً، يتم نقل التحكم إلى الدالة المُصدَّرة "SetPath" الخاصة بملف Bumblebee DLL الرئيسي
آلية عمل BumbleCrypt
أثناء تحليل أداة Crypter الخاصة بـ BumbleBee، أدركت أنه يمكن تحميل ملف DLL الذي تم فك تشفيره باستخدام خطاف مضمّن واحد فقط على "NtMapViewOfSection" بدلاً من الخطافات الثلاثة المستخدمة في أداة Crypter الخاصة بـ Bumblebee. ونتيجة لذلك، تم تطوير "BumbleCrypt".
BumbleCrypt:
-
يقوم BumbleCrypt أولاً بتحميل مورد مشفّر من قسم .rsrc ثم يفك تشفير حمولة DLL النهائية: مورد مشفّر -> فك ترميز Base64 -> فك تشفير Rc4 -> فك تشفير xor
-
تستخدم الأداة الكومة (Heap) لتخزين حمولة DLL بعد فك تشفيرها تماماً مثل أداة Crypter الخاصة بـ Bumblebee
-
بمجرد فك تشفير الحمولة النهائية، يقوم BumbleCrypt بربط واجهة NtApi "NtMapViewOfSection" التي تُستخدم لتعيين عرض (View) للقسم في مساحة العناوين الافتراضية.
-
ثم يستدعي BumbleCrypt الدالة LoadLibraryW("msimg32.dll"). والآن دعونا نفهم كيف يتم تفعيل الخطاف المضمّن:
- تستدعي LoadLibraryW() أولاً NtOpenFile للحصول على مقبض (handle) الوحدة التي تم تمريرها كوسيط
- ثم تقوم بإنشاء كائن قسم (section) باستخدام مقبض الوحدة عبر NtCreateSection
- الآن بمجرد إنشاء القسم، تستدعي LoadLibrary الدالة NtMapViewOfSection لتعيين عرض القسم في الذاكرة
- هنا يتم تفعيل الخطاف الخاص بنا على NtMapViewOfSection، حيث تقوم الدالة الوسيطة (proxy) بالإجراءات التالية:
- أولاً، يزيل الخطاف عن NtMapViewOfSection
- ينشئ قسماً بالحجم المطلوب باستخدام NtCreateSection()
- ثم يعيّن عرض القسم الذي تم إنشاؤه في مساحة العناوين الافتراضية باستخدام NtMapViewOfSection (التي تمت إزالة الخطاف عنها مسبقاً)
- وأخيراً، يقوم بتعيين حمولة DLL النهائية التي تم فك تشفيرها سابقاً يدوياً عند العنوان الأساسي للقسم المعيّن في الذاكرة، ثم يُرجع NTSTATUS_SUCCESS إلى LoadLibraryW ويخرج من الدالة الوسيطة
- بعد ذلك، تتلقى LoadLibraryW قيمة NTSTATUS_SUCCESS كاستجابة من NtMapViewOfSection بالإضافة إلى العنوان الأساسي للقسم المعيّن في الذاكرة حيث توجد حمولة DLL الخبيثة المفكوك تشفيرها. بعدها تقوم LoadLibrary بتحميل DLL وفقاً لقيم الإرجاع، والنتيجة هي أن msimg32.dll تظهر ضمن الوحدات المحمّلة لكنها تشير إلى الحمولة المفكوك تشفيرها. كما تقوم الأداة بنقل التحكم إلى DLL المفكوك تشفيرها عبر تنفيذ الدالة المُصدَّرة "CallPath".
-
الآن إذا ألقينا نظرة على لقطة شاشة الوحدات المحمّلة في BumbleCrypt، يمكننا أن نرى أنها تحتوي على "msimg32.dll" لكن العنوان الأساسي يشير إلى الحمولة الخبيثة المفكوك تشفيرها.
لقطة الشاشة


إثبات المفهوم - BumbleCrypter

شكراً جزيلاً! أتمنى أن ينال إعجابكم =D
إلى اللقاء.
يمكنك التواصل معي على تويتر إذا كان لديك أي ملاحظات أو تعليقات
تويتر: https://twitter.com/knight0x07
ملاحظة
لأغراض تعليمية فقط. إنه مشروع شخصي لعطلة نهاية الأسبوع =)