
محمّل شيلكود ديناميكي مع قدرات مراوغة متطورة
AsmLdr هو محمّل شيلكود متقدم مكتوب بلغة التجميع x64، مصمم لبيئات Windows x64. الغرض الأساسي منه هو تنفيذ حمولات مشفرة مع تقليل احتمالية اكتشافه بواسطة برامج مكافحة الفيروسات المتقدمة، وأنظمة كشف نقطة النهاية والاستجابة (EDR)، وبيئات العزل (sandboxes)، ومصححات الأخطاء. يحقق ذلك من خلال حلّ الوحدات (modules) وواجهات البرمجة (APIs) واستدعاءات النظام ديناميكيًا في وقت التشغيل، مما يلغي الاعتماديات الثابتة مثل جداول الاستيراد أو العناوين المثبتة. هذا النهج يُنتج ملفًا ثنائيًا مضغوطًا ببصمة اكتشاف منخفضة.
يستخدم المحمّل تقنية module stomping لوضع الشيلكود داخل القسم القابل للتنفيذ لملف DLL موجود، ويفك تشفير الحمولة في الذاكرة، ثم يشغّلها عبر استدعاءات نظام غير مباشرة مع انتحال مكدس (stack spoofing). يتضمن ميزات مراوغة مثل إجراءات مضادة لتصحيح الأخطاء، وضبط التوقيت لمحاكاة أنماط التطبيقات الطبيعية، وتجاوز تتبع أحداث Windows (ETW). هذه الإمكانات تجعله أداة للفريق الأحمر (red teaming) والبحث الأمني. إخلاء مسؤولية أخلاقي: هذا المشروع لأغراض تعليمية وبحثية فقط. إنه يوضح التفاصيل الداخلية لنظام Windows منخفضة المستوى، بما في ذلك اجتياز PEB، وتحليل جدول التصدير، وفك ربط استدعاءات النظام (syscall unhooking)، والتلاعب بحمايات الذاكرة. استخدمه في بيئات خاضعة للتحكم (مثل الأجهزة الافتراضية). إساءة الاستخدام لأغراض ضارة غير قانونية وغير أخلاقية. لا يتحمل المؤلف أي مسؤولية عن أي إساءة استخدام.
يقدم AsmLdr مجموعة من الميزات لتنفيذ الحمولات والمراوغة بشكل خفي. كل منها موصوف أدناه، مع التركيز على وظيفته وفوائده:
حلّ الوحدات عبر اجتياز PEB: يعدد المحمّل الوحدات قيد التشغيل باتباع سلسلة وحدات PEB. يطابق أسماء الوحدات عبر مقارنات Unicode للعثور على العنوان الأساسي للـ DLL المطلوب وإرجاعه. تتجاوز هذه الطريقة دوال التحميل القياسية، مما يقلل من خطر الاعتراض.
حلّ واجهات البرمجة من جداول التصدير: يفحص المحمّل دليل تصدير الـ DLL لتحديد موقع الدوال. يطابق واجهات البرمجة باستخدام التجزئة (hashing) أو اختياريًا فحوصات الأسماء المباشرة مع التحقق من الطول لمنع الخلط بين أسماء الدوال المتشابهة. يوفر ذلك عنوان الدالة دون الاعتماد على عمليات الاستيراد المرتبطة مسبقًا.
حمايات مضادة لتصحيح الأخطاء: يكتشف المحمّل تصحيح الأخطاء من خلال فحوصات متعددة وينهي العمل بشكل نظيف إذا أشار أي منها إلى وجود تحليل.
توليد كود غير ضروري لمقاومة التحليل: يشغّل المحمّل تسلسلات من العمليات غير الأساسية لإنشاء أنماط مربكة في التفكيك، مما يجعل التحليل الثابت أصعب دون التأثير على كفاءة وقت التشغيل.
تطبيع التوقيت والسلوك: يقيس المحمّل سرعة النظام لتشغيل أعباء عمل محاكاة تطابق أنماط التطبيقات الطبيعية، مما يساعده على الاندماج مع العمليات المشروعة. كما يتوقف مؤقتًا لفترة وجيزة قبل الإجراءات الرئيسية لتطبيع توقيت التنفيذ.
تجاوز تسجيل ETW: يجهز المحمّل نقاط توقف عتاد على واجهات برمجة تسجيل ETW لاعتراض ومنع استدعاءات تسجيل الأحداث، مما يمنع ظهور آثار في سجلات النظام.
فك ربط متعدد الطبقات: يسترجع المحمّل ديناميكيًا أرقام استدعاءات النظام الصحيحة (SSNs) عن طريق فحص الدوال مباشرة، أو مسح الكود المجاور إذا كانت مربوطًا (hooked)، أو عدّ الأنماط في ntdll لتقدير الرقم، مع التعديل للاستثناءات المعروفة.
التقنيات المستخدمة:
استدعاء نظام غير مباشر وانتحال المكدس: يجد المحمّل مسارات كود نظيفة في ntdll لاستدعاءات النظام ويسلسل حتى 32 عملية، مُخفيًا مكدس الاستدعاءات لتفادي التتبع. يستعيد الحالة الأصلية بعد الاكتمال.
إفراغ DLL (DLL Hollowing): يستحضر المحمّل DLL مستهدفًا، ويسمح مؤقتًا بالكتابة في قسم الكود الخاص به، ويدرج الشيلكود المشفر، ويفك تشفيره، ثم يعيد ضبط الحمايات لتكون للتنفيذ فقط.
فك التشفير في الذاكرة: يفك المحمّل تشفير الشيلكود بتطبيق نمط مفتاح متكرر مباشرة في الذاكرة المحقونة.
الدوال المساعدة: يتضمن المحمّل أدوات لقياس أطوال السلاسل، ومقارنة السلاسل (القياسية أو عريضة الأحرف)، وتجزئة الأسماء لعمليات البحث، والتحقق من صحة مؤشرات الذاكرة، وقراءة الطوابع الزمنية للتحكم في التوقيت.
يقوم السكريبت Python المسمى generate.py بتشفير ملف الشيلكود الخام. يضيف حشوًا للمحاذاة، وينشئ مفتاحًا أو يستخدم مفتاحًا موجودًا، ويطبق عملية XOR على كل بايت مع المفتاح بنمط متكرر. يُعرّف ملف الإخراج shellcode.asm الأحجام، والمصفوفات للبيانات المشفرة والمفتاح، وإجراءً لتحميل البيانات في وقت التشغيل. يتطابق فك التشفير في المحمّل مع هذه العملية في الذاكرة. لاحظ أن المفاتيح الأطول تزيد من زمن الانتظار.
جهّز ملفًا ثنائيًا خامًا للشيلكود (مثل payload.bin). شغّل python generate.py payload.bin [optional_key] لإنتاج shellcode.asm.
عدّل szDllName (كلمات Unicode السداسية في evader.asm) لاستخدام ملفات DLL بديلة مثل urlmon.dll. أعد حساب تجزئات DJB2 لواجهات برمجة جديدة باستخدام منطق str_hash. علّق على وحدات الماكرو (مثل KILL_DEBUGGERS) لأغراض تصحيح الأخطاء.
AsmLdr مُحسَّن لنظامي Windows 10 و 11 x64؛ قد تؤدي تحديثات النواة إلى تغيير الإزاحات (مثل PEB+0x18) أو أنماط NTDLL (مثل 0xb8d18b4c)، مما يتطلب التحقق. تعتمد معالجة الأخطاء على قيم إرجاع NTSTATUS (مثل <0 للفشل)، دون تسجيل مدمج. تستهلك العمليات الوهمية والمزيفة دورات معالجة، مما قد ينبّه مراقبي الموارد على الأنظمة المقيّدة. استخدمه حصريًا في بيئات خاضعة للتحكم.