
أداة تحميل PE انعكاسية مكتوبة بلغة Zig. تقوم بتحميل وتنفيذ ملفات PE الأصلية و.NET مباشرة من الذاكرة.
مُحمّل PE انعكاسي مكتوب بلغة Zig. يقوم بتحميل وتنفيذ ملفات PE الأصلية وملفات .NET مباشرة من الذاكرة.
__security_cookie لأمان المخزن المؤقت /GS)SetProcessValidCallTargetsوظائف مساعدة لحل الصادرات من صورة PE محمّلة:
getExportByName(base, ntheaders, name) — الحل بالاسمgetExportByOrdinal(base, ntheaders, ordinal) — الحل بالترتيبيتعامل مع الصادرات المُعاد توجيهها تلقائيًا عن طريق تحميل DLL الهدف (مثلًا، "NTDLL.RtlAllocateHeap" يُحل إلى الدالة الفعلية في ntdll.dll).
يقوم تلقائيًا بحل مجموعات واجهة برمجة تطبيقات Windows (api-ms-win-*، ext-ms-win-*) إلى ملفات DLL المضيفة الفعلية باستخدام خريطة مجموعة ApiSet في PEB. يتيح ذلك تحميل ملفات PE التي تستورد من ملفات DLL لواجهة برمجة التطبيقات الافتراضية.
utils.detect_platform(buffer) — كشف ما إذا كان PE 32 بت أم 64 بتutils.is_dotnet_assembly(ntheaders) — التحقق مما إذا كان PE هو تجميع .NETutils.getDotNetVersion(buffer) — استخراج سلسلة إصدار بيئة تشغيل .NET من البيانات الوصفيةutils.rvaToFileOffset(buffer, rva) — تحويل RVA إلى إزاحة ملف خام| البنية | رمز المعالج | البتات |
|---|---|---|
| i386 | 0x014c | 32 بت |
| AMD64 | 0x8664 | 64 بت |
| IA64 | 0x0200 | 64 بت |
| ARM (ARMNT) | 0x01C4 | 32 بت |
| ARM64 | 0xAA64 | 64 بت |
استنساخ المستودع:
git clone https://github.com/Thoxy67/zig-pe.git
cd zig-pe
بناء المشروع:
zig build
zig build -Ddotnet=false # تعطيل دعم .NET (مفعل افتراضيًا)
zig build # بناء جميع الأهداف
zig build run-putty64 # تشغيل مثال PE أصلي 64 بت
zig build run-putty32 # تشغيل مثال PE أصلي 32 بت
zig build run-dotnet # تشغيل مثال تجميع .NET
zig build test # تشغيل اختبارات الوحدة
const pe = @import("pe");
pub fn main() !void {
// تحميل وتنفيذ ملف PE مدمج
try pe.RunPE.init(@embedFile("bin/app.exe")).run();
}
const pe = @import("pe");
pub fn main() !void {
var loader = pe.RunPE.init(@embedFile("bin/app.exe"));
try loader.runWithArgs(&.{ "arg1", "arg2", "arg3" });
}
const std = @import("std");
const pe = @import("pe");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit();
const allocator = gpa.allocator();
const file_content = try std.fs.cwd().readFileAlloc(
allocator,
"path/to/executable.exe",
std.math.maxInt(usize),
);
defer allocator.free(file_content);
try pe.RunPE.init(file_content).run();
}
const pe = @import("pe");
// بعد تحميل DLL في الذاكرة...
const base: [*]const u8 = @ptrCast(loaded_base);
const ntheaders = // ... الحصول على رؤوس NT
// الحل بالاسم
if (pe.getExportByName(base, ntheaders, "ExportedFunction")) |func_ptr| {
const func: *const fn () void = @ptrCast(@alignCast(func_ptr));
func();
}
// الحل بالترتيب
if (pe.getExportByOrdinal(base, ntheaders, 42)) |func_ptr| {
// استخدام مؤشر الدالة
}
GetCommandLineW() الوسيطات المقدمةMain(string[] args) عبر استدعاء CLRيتضمن هذا المشروع تحميل وتنفيذ كود عشوائي، مما قد يكون خطيرًا. استخدم هذا المُحمّل فقط مع ملفات PE موثوقة وفي بيئات مُتحكَّم بها. المؤلفون غير مسؤولين عن أي سوء استخدام أو ضرر يسببه هذا البرنامج.
المساهمات في zig-pe مرحب بها! لا تتردد في تقديم طلبات السحب، أو إنشاء مشكلات، أو نشر الكلمة.
git checkout -b feature/AmazingFeature)git commit -m 'إضافة ميزة رائعة')git push origin feature/AmazingFeature)هذا المشروع مرخص بموجب ترخيص MIT - راجع ملف LICENSE للحصول على التفاصيل.
هذا المشروع للأغراض التعليمية فقط. تأكد من أن لديك الحقوق والأذونات اللازمة قبل تحميل وتنفيذ أي ملف PE.