EntropyReducer: قلّل إنتروبيا الحمولة الخاصة بك وموّهها باستخدام قوائم مترابطة مُسلسلة
كيف يعمل
تتحدد خوارزمية EntropyReducer بقيمتي BUFF_SIZE وNULL_BYTES. فيما يلي كيفية تنظيم EntropyReducer لحمولتك إذا كانت BUFF_SIZE مضبوطة على 4، وNULL_BYTES على 2.

خوارزمية التمويه
- يتحقق EntropyReducer أولاً مما إذا كان حجم الحمولة الخام المُدخلة من مضاعفات
BUFF_SIZE، وإن لم يكن كذلك، فإنه يحشوها لتكون كذلك.
- ثم يأخذ كل مقطع بحجم
BUFF_SIZE من الحمولة، وينشئ له عقدة قائمة مترابطة، باستخدام الدالة InitializePayloadList، مُهيّئًا الحمولة كقائمة مترابطة.
- ستحتوي العقدة المُنشأة على مخزن مؤقت فارغ بحجم
NULL_BYTES، والذي سيُستخدم لخفض الإنتروبيا
- عند هذه النقطة، ورغم أن EntropyReducer قد أكمل مهمته بخفض إنتروبيا الحمولة، فإنه لا يتوقف هنا. بل يواصل بعد ذلك عشوائية ترتيب كل عقدة في القائمة المترابطة، مما يُفكك ترتيب الحمولة الخام. تُنجز هذه الخطوة عبر خوارزمية الدمج والفرز المُنفّذة من خلال الدالة MergeSort.
- تكون القائمة المترابطة المُرتّبة بترتيب عشوائي لأن القيمة التي تُرتّب بها القائمة المترابطة هي قيمة XOR لأول ثلاثة بايتات من الحمولة الخام، وهذه القيمة تحدد موضعها في القائمة المترابطة المُعاد تنظيمها، ويمكن الاطلاع على هذه الخطوة هنا
- نظرًا لأن حفظ قائمة مترابطة في ملف مستحيل بسبب ارتباطها ببعضها عبر المؤشرات. نُضطر إلى تسلسلها.
- يتم تسلسل القائمة المترابطة المُنشأة عبر الدالة
Obfuscate هنا.
- بعد ذلك، تكون البيانات المُسلسلة جاهزة للكتابة إلى ملف الإخراج.
خوارزمية إزالة التمويه
- نظرًا لأن الخطوة الأخيرة في
خوارزمية التمويه كانت تسلسل القائمة المترابطة، فإن أول ما يجب فعله هنا هو إلغاء تسلسل الحمولة المموّهة، وتوليد قائمة مترابطة منها، وتُنجز هذه الخطوة هنا في الدالة Deobfuscate.
- الخطوة التالية هي ترتيب القائمة المترابطة باستخدام معرّف العقدة (Id)، ويتم ذلك باستخدام نفس خوارزمية الدمج والفرز المُستخدمة سابقًا.
- الآن، أصبحت القائمة المترابطة بالترتيب الصحيح لإعادة بناء بايتات الحمولة كما ينبغي. لذا نقوم ببساطة بتجريد بايتات الحمولة الأصلية من كل عقدة، كما هو مُنفّذ هنا.
- الخطوة الأخيرة هي تحرير العقد المُخصصة، ويتم ذلك هنا.
الاستخدام
- يقرأ EntropyReducer ببساطة ملف الحمولة الخام من سطر الأوامر، ويكتب النسخة المموّهة إلى اسم الملف نفسه مسبوقًا بـ ".ER".
- يتفاوت حجم الحمولة المموّهة النهائية اعتمادًا على قيمتي
BUFF_SIZE وNULL_BYTES. ومع ذلك، يمكن تحديده باستخدام المعادلة التالية
FinalSize = ((OriginalSize + BUFF_SIZE - OriginalSize % BUFF_SIZE ) / BUFF_SIZE) * (BUFF_SIZE + NULL_BYTES + sizeof(INT))
يُستخدم مشروع PoC في هذا المستودع لتنفيذ ملف ".ER" الناتج كمثال على إلغاء تسلسله وإزالة التعتيم عنه.
تضمينه في مشاريعك
كل ما عليك فعله هو إضافة ملفي EntropyReducer.c وEntropyReducer.h إلى مشروعك، واستدعاء الدالة Deobfuscate. يمكنك مراجعة PoC/main.c للاطلاع.
مثال على المخرجات
في هذا المثال، تم ضبط BUFF_SIZE على 3، وNULL_BYTES على 1.
- الحمولة الخام، أول مقطع من الحمولة (
FC 48 83)

- المقطع نفسه من الحمولة، لكن عند إزاحة مختلفة

الفائدة
- شل كود x64 الناتج عن metasploit له إنتروبيا مقدارها
5.883، كما يظهر عبر pestudio.

- الملف نفسه، مشفَّرًا بـ AES، يسجل إنتروبيا مقدارها
7.110.

- نتيجة شبه مطابقة مع خوارزمية RC4 أيضًا؛
7.210

- لكن باستخدام EntropyReducer، تسجل الإنتروبيا قيمة أقل حتى من تلك الخاصة بالحمولة الخام الأصلية؛
4.093

خوارزمية الدمج والفرز (Merge Sort) مأخوذة من c-linked-list.