ملف تنفيذي محمول

ملف تنفيذي محمول ( PE ) هو تنسيق ملفات للبرامج التنفيذية الأصلية على أنظمة تشغيل ويندوز 32 بت و64 بت ، وكذلك في بيئات UEFI . [ 2 ] يُستخدم هذا التنسيق للملفات التنفيذية الأصلية ( .exe ، .com )، ومكتبات الارتباط الديناميكي ( .dll ، .ocx )، وبرامج تشغيل النظام ( .sys ، .drv )، وأنواع أخرى كثيرة من الملفات. يدعم تنسيق PE تخزين البيانات اللازمة لتحميل وبدء عملية نظام التشغيل ، بما في ذلك مراجع مكتبات الارتباط الديناميكي ، وجداول استيراد وتصدير وظائف واجهة برمجة التطبيقات (API)، وبيانات إدارة الموارد، ومعلومات التخزين المحلي للخيوط (TLS).

وفقًا لمواصفات واجهة البرامج الثابتة الموحدة القابلة للتوسيع (UEFI) ، يُعد تنسيق PE المعيار المقبول للملفات التنفيذية في بيئات EFI. [ 3 ] يدعم هذا التنسيق حاليًا في أنظمة Windows NT مجموعةً من مجموعات التعليمات ، بما في ذلك IA-32 و x86-64 (AMD64/Intel 64) و IA-64 و ARM و ARM64 . قبل ظهور Windows 2000 ، كان Windows NT (وبالتالي تنسيق PE) يدعم أيضًا معمارية MIPS و Alpha و PowerPC . علاوةً على ذلك، وبفضل استخدامه في Windows CE ، حافظ تنسيق PE على توافقه مع العديد من متغيرات MIPS و ARM (بما في ذلك Thumb ) و SuperH . [ 4 ]

من الناحية الوظيفية، فإن تنسيق PE مشابه لتنسيقات الملفات التنفيذية الأخرى الخاصة بالمنصة، مثل تنسيق ELF المستخدم في Linux ومعظم الأنظمة الشبيهة بـ Unix ، وتنسيق Mach-O الموجود في macOS و iOS .

تاريخ

قدمت مايكروسوفت تنسيق PE لأول مرة مع نظام التشغيل ويندوز NT 3.1 ، ليحل محل تنسيق New Executable (NE) الأقدم ذي 16 بت . بعد ذلك بوقت قصير، اعتمدت أنظمة التشغيل ويندوز 95 و98 وME، بالإضافة إلى امتداد Win32s لنظام التشغيل ويندوز 3.1x ، بنية PE. يتضمن كل ملف PE رأسًا تنفيذيًا لنظام DOS، والذي يعرض عادةً الرسالة "لا يمكن تشغيل هذا البرنامج في وضع DOS". مع ذلك، يمكن استبدال قسم DOS هذا ببرنامج DOS كامل الوظائف، كما هو موضح في مُثبِّت ويندوز 98 SE. يستطيع المطورون إضافة مثل هذا البرنامج باستخدام مفتاح /STUBالتبديل في رابط مايكروسوفت، مما يُنشئ فعليًا ملفًا تنفيذيًا مُدمجًا . [ 5 ]

بمرور الوقت، تطور تنسيق PE مع منصة ويندوز. ومن أبرز الإضافات تنسيق .NET PE للتعليمات البرمجية المُدارة ، وPE32+ لدعم مساحة العناوين 64 بت، وإصدار متخصص لنظام ويندوز CE .

لتحديد ما إذا كان ملف PE مُصممًا لبنية 32 بت أو 64 بت، يُمكن فحص حقل Machine في IMAGE_FILE_HEADER. [ 6 ] القيم الشائعة لـ Machine هي 0x014c32 بت لمعالجات Intel و 0x866464 بت لمعالجات x64. بالإضافة إلى ذلك، IMAGE_OPTIONAL_HEADERيكشف حقل Magic في IMAGE_FILE_HEADER ما إذا كانت العناوين 32 بت أو 64 بت. تشير القيمة 0x10B32 بت إلى ملف 32 بت (PE32)، بينما 0x20Bتشير القيمة 64 بت إلى ملف 64 بت (PE32+). [ 7 ]

التفاصيل الفنية

تَخطِيط

بنية ملف تنفيذي محمول 32 بت

يتكون ملف PE من عدة رؤوس وأقسام تُوجه الرابط الديناميكي لكيفية ربط الملف بالذاكرة. تتكون الصورة التنفيذية من عدة مناطق مختلفة، تتطلب كل منها سمات حماية ذاكرة مختلفة . لضمان المحاذاة الصحيحة، يجب أن تبدأ كل منطقة عند حدود الصفحة. [ 8 ] على سبيل المثال، عادةً ما يتم ربط قسم .text ، الذي يحتوي على كود البرنامج، كقسم للقراءة فقط/للتنفيذ. في المقابل، يتم ربط قسم .data ، الذي يحتوي على المتغيرات العامة، كقسم للقراءة والكتابة فقط/للعدم. مع ذلك، ولتوفير المساحة، لا تتم محاذاة الأقسام على القرص بهذه الطريقة. يقوم الرابط الديناميكي بربط كل قسم بالذاكرة بشكل فردي ويُعيّن الأذونات الصحيحة بناءً على المعلومات الموجودة في الرؤوس. [ 9 ]

جدول الاستيراد

يُستخدم جدول عناوين الاستيراد ( IAT) كجدول بحث عندما يستدعي التطبيق دالةً في وحدة نمطية مختلفة. يمكن تحديد الاستيرادات بالترتيب أو بالاسم. ولأن البرنامج المُترجم لا يستطيع معرفة مواقع الذاكرة للمكتبات التابعة له مسبقًا، فإن الانتقال غير المباشر ضروري لاستدعاءات واجهة برمجة التطبيقات (API). وبما أن الرابط الديناميكي يحتفظ بالوحدات النمطية ويحل التبعيات، فإنه يملأ خانات IAT بالعناوين الفعلية لدوال المكتبة المقابلة. على الرغم من أن هذا يُضيف انتقالًا إضافيًا، مما يُؤدي إلى انخفاض الأداء مقارنةً بالاستدعاءات بين الوحدات النمطية، إلا أنه يُقلل من عدد صفحات الذاكرة التي تتطلب تغييرات النسخ عند الكتابة ، وبالتالي يُحافظ على الذاكرة وعمليات الإدخال/الإخراج للقرص. إذا كان معروفًا مسبقًا أن الاستدعاء بين الوحدات النمطية (إذا تم الإشارة إليه بواسطة سمة dllimport )، فيمكن للمُترجم إنشاء رمز مُحسَّن باستخدام رمز عملية استدعاء غير مباشر بسيط . [ 9 ]

عشوائية تخطيط مساحة العناوين (ASLR)

تستخدم أنظمة التشغيل الحديثة تقنية عشوائية تخطيط مساحة العناوين (ASLR)، وهي عملية تجعل تخطيط ملفات PE في الذاكرة غير قابل للتنبؤ، وبالتالي يصعب استغلاله. خلال عملية ASLR، يقوم المحمل بتوزيع عناوين الذاكرة الافتراضية التي تتواجد فيها المكونات الرئيسية بشكل عشوائي. يشمل ذلك قاعدة الملف التنفيذي، والمكتبات المشتركة ، والكومة ، والمكدس . لا تتمتع معظم ملفات PE باستقلالية الموقع لأن المترجمات الشائعة تُصدر بعض المراجع المطلقة نسبةً إلى قاعدة مفترضة. ولمعالجة إعادة التوزيع العشوائي للمواقع، يخزن الرابط جدول .reloc الذي يسمح للمحمل بتعديل هذه المراجع أثناء التحميل.

.NET، والبيانات الوصفية، وتنسيق PE

في ملف تنفيذي مكتوب بلغة .NET، يحتوي قسم كود PE على جزء برمجي يستدعي مدخل بدء تشغيل الآلة الافتراضية CLR_CorExeMain ، أو _CorDllMainفي ملف mscoree.dll، كما هو الحال في الملفات التنفيذية المكتوبة بلغة Visual Basic . تستخدم الآلة الافتراضية بعد ذلك بيانات تعريف .NET الموجودة، والتي يُشار إلى جذرها IMAGE_COR20_HEADER(المسمى أيضًا "رأس CLR") بواسطة IMAGE_DIRECTORY_ENTRY_COMHEADER(كان هذا المدخل يُستخدم سابقًا لبيانات تعريف COM+ في تطبيقات COM+، ومن هنا جاءت التسمية ) في دليل بيانات رأس PE. يشبه هذا المدخل إلى حد كبير رأس PE الاختياري، حيث يؤدي دوره بشكل أساسي في مُحمِّل CLR. [ 4 ]IMAGE_COR20_HEADER

تُخزَّن البيانات المتعلقة ببيئة CLR، بما في ذلك البنية الأساسية نفسها، عادةً في قسم التعليمات البرمجية المشتركة .text. ويتألف هذا القسم من عدة مجلدات: البيانات الوصفية، والموارد المضمنة، والأسماء القوية، بالإضافة إلى مجلدات أخرى خاصة بالتوافق مع التعليمات البرمجية الأصلية. يحتوي مجلد البيانات الوصفية على مجموعة من الجداول التي تسرد جميع كيانات .NET المميزة في التجميع، بما في ذلك الأنواع، والأساليب، والحقول، والثوابت، والأحداث، بالإضافة إلى المراجع بينها وإلى التجميعات الأخرى.

يمكن استخدامه على أنظمة تشغيل أخرى

يستخدم نظام التشغيل ReactOS ، وهو نظام تشغيل مفتوح المصدر مصمم ليكون متوافقًا ثنائيًا مع نظام التشغيل Windows، تنسيق PE أيضًا. تاريخيًا، استخدمته أنظمة تشغيل أخرى مثل SkyOS و BeOS R3. مع ذلك، انتقل كل من SkyOS وBeOS لاحقًا إلى تنسيق ELF .

تستخدم منصة تطوير Mono ، التي تهدف إلى التوافق الثنائي مع إطار عمل Microsoft .NET ، نفس تنسيق PE المستخدم في تطبيق Microsoft. وينطبق الأمر نفسه على .NET Core متعدد المنصات من Microsoft .

في أنظمة التشغيل الشبيهة بنظام يونكس x86 (-64) ، يمكن تشغيل ملفات ويندوز الثنائية (بصيغة PE) باستخدام برنامج Wine . كما يستخدم برنامج HX DOS Extender صيغة PE لتشغيل ملفات DOS الثنائية الأصلية ذات 32 بت، ويمكنه تشغيل بعض ملفات ويندوز الثنائية في نظام DOS، وبالتالي يعمل كبديل لبرنامج Wine في نظام DOS.

يتمتع نظام التشغيل Mac OS X 10.5 بالقدرة على تحميل وتحليل ملفات PE، على الرغم من أنه لا يحافظ على التوافق الثنائي مع نظام التشغيل Windows. [ 10 ]

يستخدم UEFI و UEFI firmware ملفات PE، بالإضافة إلى ABI ذي الصلة بالمنصة واتفاقية الاستدعاء (x64 ABI لأجهزة الكمبيوتر النموذجية) للتطبيقات .

انظر أيضاً

مراجع

  1. أندرسون، هنريك (23 أبريل 2015). "application/vnd.microsoft.portable-executable" . هيئة الأرقام المخصصة للإنترنت (IANA) . تم الاطلاع عليه بتاريخ 26 مارس 2017 .
  2. "الملفات التنفيذية المحمولة (PE) - التعريف - تريند مايكرو إن" . www.trendmicro.com . تم الاطلاع عليه بتاريخ 10 نوفمبر 2022 .
  3. "مواصفات UEFI، الإصدار 2.8B" (PDF) .، ملاحظة في الصفحة 15، تنص على أن "نوع الصورة هذا تم اختياره لتمكين صور UEFI من احتواء تعليمات Thumb و Thumb2 مع تعريف واجهات EFI نفسها لتكون في وضع ARM".
  4. 1 2 "تنسيق PE (ويندوز)" . تم الاسترجاع في 21-10-2017 .
  5. "/STUB (اسم ملف MS-DOS Stub)" . 3 أغسطس 2021.
  6. شرح خدعة التربية البدنية : التمييز بين 32 و 64 بت بالعين المجردة بقلم كارستن هان
  7. تنسيق PE على موقع Microsoft.com
  8. "ملف تنفيذي محمول من البداية إلى النهاية" . مؤرشف من الأصل بتاريخ 20-10-2017 . تم الاطلاع عليه بتاريخ 21-10-2017 .
  9. 1 2 "نظرة داخل ملف PE: جولة في ملف Win32 القابل للتنفيذ المحمول" . 30 يونيو 2010. تم الاسترجاع في 21 أكتوبر 2017 .
  10. شارتييه، ديفيد (30 نوفمبر 2007). "كشف النقاب: أدلة على إمكانية تشغيل تطبيقات ويندوز على نظام ماك أو إس إكس قريبًا" . آرس تكنيكا. تاريخ الاسترجاع: 3 ديسمبر 2007. ... يصف ستيفن إدواردز اكتشافًا مفاده أن نظام ليوبارد يحتوي على ما يبدو على مُحمِّل غير موثق للملفات التنفيذية المحمولة، وهو نوع من الملفات المستخدمة في إصدارات ويندوز 32 بت و64 بت. وكشف المزيد من البحث أن مُحمِّل ليوبارد نفسه يحاول العثور على ملفات DLL الخاصة بويندوز عند محاولة تحميل ملف تنفيذي لويندوز.