مرفق نسخة 32-bit من البرنامج بنفس حجم البرماج الأصلي.
#include <Windows.h>
int main() {
CreateEventA(NULL, TRUE, FALSE, "at4re");
while (true);
return 0;
}
ال compiler المستعمل هو Visual Studio. أوامر ال linker التي ساعدت على تقليص حجم الملف من 9KB إلى 656 Bytes
/MANIFEST:NO /LTCG /DYNAMICBASE:NO [names, this is parameter not part of the options] /ENTRY:"main" /SUBSYSTEM:WINDOWS /WX:NO /NOLOGO /ALIGN:16 /ASSEMBLYDEBUG:DISABLE /NODEFAULTLIB /DEBUG:NONE /EMITPOGOPHASEINFO
بعضها قد يكون لا داعي له
، الموضوع مفتوح للتجربة عموما. بالطبع استعنت
بموقع مايكروسوفت حيث يمكن البحث في الشريط الأيسر.
من الغريب أن الأمر EMITPOGOPHASEINFO غير موجود على الموقع، وجدته
هنا.
لإنقاص الحجم إلى 592 Bytes قمت يدوياً بالتالي.
وجدت أن ال DOS Header ينتهي عن 0x40 وال NT Headers تبدأ عند 0xB8، وما بينهما توجد الرسالة "This program cannot be run in DOS mode" وأشياء أخرى لم أهتم بها. يمكننا بدء ال NT Headers من 0x80، فنزيل الرسالة التي ذكرناها وأكثير منها قليلا. بعد فعل هذا علينا تعديل البايت رقم 0x3c لتكون قيمته 0x80. ثم نفتح هذه السنخة المعدلة في CFF Explorer ومن هنا يتوجب علينا إصلاح عناوين الأقسام والاستيرادات. كتابة العملية متعبة وكن ملخصها كالتالي:
استعملت برنامج CFF Explorer
1- في ال optional header نعدل
AddressOfEntryPoint
BaseOfCode
SizeOfHeaders
2- في ال Data Directories نعدل
Import Directory RVA
Exception Directory RVA (لا يبدو مهما)
Import Address Table Directory RVA
3- في ال section Headers نعدل
Raw Address لكل قسم
Virtual Address لكل قسم
ثم يتوجب علينا إصلاح عناوين الدوال المستوردة، بشكل عام في هذا البرنامج الصغير في قسم .rdata غير أي بايتين على الشكل
xx 02
طريقة التعديل على جميع ما سبق ببساطة طرح حجم ما حذفناه، وهو 0x78. على سبيل المثال إذا كانت قيمة إحدى القيم 0x220 فبعد الطرح تصبح 0x1A8، وبالنسبة للبايتين كمثال
78 20 to 00 20
ملاحظة: أثناء عملية تعديلي حذفت 8 بايتات أخرى لأتبع محاذاة البرنامج (0x10)، يمكنك من البداية أن تبدأ ال NT Headers من 0x88 لتجنب هذا واتباع نفس الخطوات.