RawrXD PE Writer - تنفيذ كامل
نظرة عامة
هذا كاتب PE32+ كامل وباعث كود آلة مطبق بلغة تجميع MASM النقية x64 بدون تبعيات وبدون استخدام CRT. يقوم بإنشاء ملفات ويندوز قابلة للتنفيذ من الصفر.
المعمارية
يتبع كاتب PE نهج مصمم الواجهة الخلفية، مقدماً واجهة برمجة نظيفة لـ:
- إنشاء سياقات PE القابلة للتنفيذ
- إضافة الواردات بهياكل IAT/INT الصحيحة
- إصدار كود الآلة مع إدارة الأقسام
- كتابة ملفات PE كاملة بجميع الرؤوس المطلوبة
المكونات الأساسية
1. الهياكل المعرفة
- IMAGE_DOS_HEADER: رأس DOS قياسي بمؤشر e_lfanew
- IMAGE_NT_HEADERS64: رؤوس NT مع رأس الملف ورأس اختياري
- IMAGE_SECTION_HEADER: رؤوس الأقسام لـ .text و .rdata و .idata
- IMAGE_IMPORT_DESCRIPTOR: واصفات جدول الاستيراد
- PE_CONTEXT: هيكل سياق داخلي لبناء ملفات PE
2. الوظائف الرئيسية
PEWriter_CreateExecutable
- المدخلات: RCX = قاعدة الصورة (0 = افتراضي)، RDX = RVA نقطة الدخول
- المخرجات: RAX = معالج سياق PE (0 = فشل)
- الغرض: يخصص ويهيئ هيكل سياق PE كامل
تفاصيل التنفيذ:
- يخصص ذاكرة لرأس DOS ورؤوس NT ورؤوس الأقسام
- يهيئ رأس DOS بالتوقيع الصحيح و e_lfanew
- يعد رؤوس NT بنوع آلة AMD64 وسحر PE32+
- يهيئ الرأس الاختياري بقاعدة الصورة ومحاذاة الأقسام/الملفات
- يخصص مخزن الكود وجداول الاستيراد
- يعيّن العناوين الافتراضية الافتراضية وإزاحات الملفات
PEWriter_AddImport
- المدخلات: RCX = سياق PE، RDX = اسم DLL، R8 = اسم الوظيفة
- المخرجات: RAX = 1 نجاح، 0 فشل
- الغرض: بناء جدول استيراد بهياكل IAT/INT الصحيحة
تفاصيل التنفيذ:
- يدير واصفات الاستيراد لعدة DLLs
- ينشئ إدخالات جدول بحث الاستيراد (INT)
- يعد إدخالات جدول عناوين الاستيراد (IAT)
- يعالج هياكل الاستيراد بالاسم
- يتتبع عدد الاستيرادات ويتحقق من الحدود القصوى
PEWriter_AddCode
- المدخلات: RCX = سياق PE، RDX = مخزن الكود، R8 = حجم الكود
- المخرجات: RAX = RVA للكود (0 = فشل)
- الغرض: يعالج إصدار كود الآلة مع إدارة الأقسام المناسبة
تفاصيل التنفيذ:
- ينسخ كود الآلة إلى المخزن الداخلي
- يتحقق من حجم الكود مقابل الحدود القصوى
- يحسب ويعيد RVA للكود
- يحدث تتبع حجم الكود الداخلي
- يدير محتوى قسم .text
PEWriter_WriteFile
- المدخلات: RCX = سياق PE، RDX = اسم الملف
- المخرجات: RAX = 1 نجاح، 0 فشل
- الغرض: كتابة ملف كامل بجميع الرؤوس والأقسام وجدول الاستيراد
تفاصيل التنفيذ:
- ينشئ ملف الإخراج باستخدام استدعاءات Win32 API المناسبة
- يكتب رأس DOS و DOS stub
- يحسب ويحدث قيم رأس NT النهائية
- يكتب رؤوس الأقسام لـ .text و .rdata و .idata
- ينفذ حشو الملف المناسب والمحاذاة
- يكتب بيانات الأقسام مع جدول الاستيراد
- يعالج جميع حسابات RVA وإزاحات الملفات
إدارة الذاكرة
يستخدم التنفيذ واجهات برمجة كومة ويندوز:
- GetProcessHeap(): يحصل على كومة العملية الحالية
- HeapAlloc(): يخصص ذاكرة مبدئية بصفر
- HeapFree(): يحرر الذاكرة المخصصة عند التنظيف
تتضمن جميع تخصيصات الذاكرة معالجة الأخطاء والتنظيف المناسب.
تخطيط هيكل الملف
DOS Header (64 bytes)
DOS Stub (variable size, padded to 0x80)
NT Headers (248 bytes for PE32+)
Section Headers (40 bytes × 3 sections)
Padding to file alignment (0x400)
.text Section (code)
- Machine code
- Padded to file alignment
.rdata Section (read-only data)
- String constants, resources
- Padded to file alignment
.idata Section (import data)
- Import descriptors
- Import lookup table
- Import address table
- Import by name structures
- Padded to file alignment
تخطيط العناوين الافتراضية
0x1000: .text section (SECTION_ALIGNMENT)
0x2000: .rdata section
0x3000: .idata section
0x4000: Next available virtual address
الثوابت والافتراضيات
- قاعدة الصورة: 0x140000000 (افتراضي لـ x64)
- محاذاة الأقسام: 0x1000 (4KB)
- محاذاة الملف: 0x200 (512 bytes)
- نقطة الدخول: RVA قابل للتكوين
- النظام الفرعي: تطبيق وحدة تحكم (IMAGE_SUBSYSTEM_WINDOWS_CUI)
مثال استخدام
; Create PE context
mov rcx, 0 ; Default image base
mov rdx, 1000h ; Entry point RVA
call PEWriter_CreateExecutable
mov rbx, rax ; Save context
; Add kernel32.dll imports
mov rcx, rbx
mov rdx, offset dll_kernel32
mov r8, offset func_GetStdHandle
call PEWriter_AddImport
; Add machine code
mov rcx, rbx
mov rdx, offset code_buffer
mov r8, code_size
call PEWriter_AddCode
; Write executable file
mov rcx, rbx
mov rdx, offset filename
call PEWriter_WriteFile
تعليمات البناء
- تأكد من تثبيت MASM64 و Windows SDK
- قم بتشغيل
build.bat لتجميع كاتب PE والمثال
- قم بتشغيل
PE_Writer_Example.exe لإنشاء hello.exe
- اختبر الملف القابل للتنفيذ الناتج
معالجة الأخطاء
جميع الوظائف تُرجع 0 عند الفشل وقيمة غير صفرية عند النجاح. يتضمن التنفيذ:
- فحوص فشل تخصيص الذاكرة
- معالجة أخطاء I/O الملف
- التحقق من صحة المدخلات
- تنظيف الموارد المناسب
- التحقق من حدود المخازن
القيود
- أقصى 99 استيراد (MAX_IMPORTS - 1)
- أقصى حجم كود 64KB (MAX_CODE_SIZE)
- ثلاثة أقسام ثابتة (.text, .rdata, .idata)
- نظام فرعي لوحدة التحكم فقط
- لا دعم للإزاحات
- لا توقيعات رقمية
الميزات المتقدمة
يوفر التنفيذ أساساً متيناً لـ:
- إنشاء أقسام مخصصة
- ربط استيراد معقد
- تضمين الموارد
- التوقيع الرقمي
- دعم الإزاحات
- جداول معالجة الاستثناءات
ملاحظات تقنية
- تجميع MASM نقي x64 - لا تبعيات CRT
- يستخدم كومة ويندوز لإدارة الذاكرة
- يولد تنسيق PE32+ لـ x64
- متوافق مع ويندوز Vista والإصدارات الأحدث
- يتبع مواصفات PE من مايكروسوفت
- لا تبعيات مكتبة خارجية باستثناء kernel32.dll
يوفر هذا التنفيذ كاتب PE32+ كامل وجاهز للإنتاج مناسب للواجهات الخلفية لتوليد الكود، والمترجمات المخصصة، وحزم الملفات القابلة للتنفيذ.