
يُولّد شيلكود مستقل عن الموقع (position-independent shellcode) من نوع x86 أو x64 أو AMD64+x86 يُحمّل تجميعات .NET وملفات PE وغيرها من تحميلات Windows من الذاكرة ويُشغّلها مع وسائط.

الإصدار الحالي: v1.1
دونات (Donut) هو كود مستقل عن الموقع يمكنه تنفيذ ملفات VBScript وJScript وEXE وDLL وتجميعات dotNET في الذاكرة. يمكن تحميل الوحدة التي أنشأها دونات إما من خادم HTTP أو تضمينها مباشرة داخل المُحمِّل نفسه. يتم تشفير الوحدة اختياريًا باستخدام تشفير الكتلة Chaskey ومفتاح 128 بت يتم إنشاؤه عشوائيًا. بعد تحميل الملف وتنفيذه في الذاكرة، يتم مسح المرجع الأصلي لردع ماسحات الذاكرة. يدعم المُولِّد والمُحمِّل الميزات التالية:
توجد مكتبات ديناميكية وثابتة لكل من Linux وWindows يمكن دمجها في مشاريعك الخاصة. يوجد أيضًا وحدة Python يمكنك قراءة المزيد عنها في بناء واستخدام إضافة Python.
يحتوي دونات على مُحمِّلين منفصلين لكل نوع ملف مدعوم. بالنسبة لتجميعات dotNET EXE/DLL، يستخدم دونات واجهة استضافة CLR غير المُدارة (Unmanaged CLR Hosting API) لتحميل بيئة التشغيل العامة (CLR). بمجرد تحميل CLR في العملية المضيفة، يتم إنشاء نطاق تطبيق جديد (Application Domain) للسماح بتشغيل التجميعات في نطاقات تطبيقات قابلة للتخلص. عندما يصبح نطاق التطبيق جاهزًا، يتم تحميل تجميع dotNET عبر طريقة AppDomain.Load_3. أخيرًا، يتم استدعاء نقطة الدخول لملفات EXE أو الطريقة العامة لملفات DLL التي يحددها المستخدم مع أي معلمات إضافية. راجع MSDN للتوثيق حول واجهات استضافة CLR غير المُدارة. للحصول على مثال مستقل لمضيف CLR، راجع الكود هنا.
يتم تنفيذ ملفات VBScript وJScript باستخدام واجهة IActiveScript. يوجد أيضًا دعم محدود لبعض الطرق التي يوفرها مضيف Windows Script Host (wscript/cscript). للحصول على مثال مستقل، راجع الكود هنا. للحصول على وصف أكثر تفصيلاً، اقرأ: تنفيذ JavaScript وVBScript وJScript وXSL في الذاكرة
يتم تنفيذ ملفات EXE/DLL غير المُدارة (الأصلية) باستخدام مُحمِّل PE مخصص يدعم الاستيرادات المتأخرة وTLS وتصحيح سطر الأوامر. يتم دعم فقط الملفات التي تحتوي على معلومات إعادة التوطين. اقرأ تنفيذ DLL في الذاكرة للمزيد من المعلومات.
يمكن للمُحمِّل تعطيل AMSI وWLDP للمساعدة في التهرب من اكتشاف الملفات الضارة التي يتم تنفيذها في الذاكرة. للمزيد من المعلومات، اقرأ كيف تتجاوز الفرق الحمراء AMSI وWLDP للكود الديناميكي لـ .NET. كما أنه يدعم فك ضغط الملفات في الذاكرة باستخدام aPLib أو واجهة برمجة التطبيقات RtlDecompressBuffer. اقرأ ضغط البيانات للمزيد من المعلومات.
اعتبارًا من الإصدار v1.0، تم تجاوز ETW أيضًا. مثل AMSI/WLDP، هذا نظام معياري يسمح لك باستبدال التجاوز الافتراضي بتجاوز خاص بك. التجاوز الافتراضي مستمد من بحث قام به XPN. اقرأ إخفاء .NET الخاص بك - ETW للمزيد من المعلومات.
افتراضيًا، سيقوم المُحمِّل بالكتابة فوق رؤوس PE لملفات PE غير المُدارة (من العنوان الأساسي إلى `IMAGE_OPTIONAL_HEADER.SizeOfHeaders`). إذا لم يتم استخدام وحدة خادعة (تحميل الوحدة الزائد)، فسيتم تصفير رؤوس PE. إذا تم استخدام وحدة خادعة، فسيتم استخدام رؤوس PE للوحدة الخادعة للكتابة فوق تلك الخاصة بوحدة الحمولة. وذلك لردع الكشف عن طريق مقارنة رؤوس PE للوحدات في الذاكرة مع الملف الداعم لها على القرص. يمكن للمستخدم أن يطلب الاحتفاظ بجميع رؤوس PE في حالتها الأصلية. هذا مفيد في السيناريوهات التي تحتاج فيها وحدة الحمولة إلى الوصول إلى رؤوس PE الخاصة بها، مثل عند البحث عن موارد PE المضمنة.
للحصول على جولة تفصيلية باستخدام المُولِّد وكيفية تأثير دونات على فنيات العمل، اقرأ دونات - حقن تجميعات .NET كشيل كود. للمزيد من المعلومات حول المُحمِّل، اقرأ تحميل تجميعات .NET من الذاكرة.
من يرغب في معرفة المزيد عن الدواخل الداخلية يجب أن يرجع إلى ملاحظات المطور.
هناك نوعان من البناء. إذا كنت ترغب في تصحيح أخطاء دونات، يرجى الرجوع إلى التوثيق هنا. إذا لم يكن الأمر كذلك، تابع القراءة للحصول على بناء الإصدار.
من موجه أوامر Windows أو محطة Linux، قم باستنساخ المستودع.
git clone http://github.com/thewover/donut.git
الخطوة التالية تعتمد على نظام التشغيل الخاص بك والمترجم الذي تقرر استخدامه. حاليًا، يمكن تجميع قالب المُولِّد والمُحمِّل الخاص بدونات بنجاح باستخدام كل من Microsoft Visual Studio 2019 وMingGW-64. لاستخدام المكتبات في مشروع C/C++ الخاص بك، يرجى الرجوع إلى الأمثلة المقدمة هنا.
لإنشاء قالب المُحمِّل، المكتبة الديناميكية donut.dll، المكتبة الثابتة donut.lib والمُولِّد donut.exe. ابدأ موجه أوامر مطور x64 لـ Microsoft Visual Studio، انتقل إلى الدليل حيث استنسخت مستودع دونات وأدخل ما يلي:
nmake -f Makefile.msvc
لفعل الشيء نفسه، ولكن باستخدام MinGW-64 على Windows أو Linux، انتقل إلى الدليل حيث استنسخت مستودع دونات وأدخل ما يلي:
make -f Makefile.mingw