الوسوم:
حالة الموضوع:
مغلق
  1. .:: RSS ::.

    .:: RSS ::. عضوية آلية

    الأنتساب:
    ‏9 سبتمبر 2011
    المشاركات:
    14,005
    الإعجابات المتلقاة:
    0
    نقاط الجائزة:
    36
    الإقامة:
    IQ-T34M
    السلام عليكم ورحمة الله وبركاته



    إن شاء الله تكونوا في تمام الصحة والعافية إخواني

    في هذا الشرح إخواني بإذن الله



    حنشوف مقدمة عن بنية محمول قابل للتنفيذ ومكوناته لأن معرفته تعتبر من أهم الأساسيات في الهندسة العكسية ... إلخ

    مامعنى ملف PE ؟

    محمول قابل للتنفيذ = PE = Portable executable


    هي البنية الأصلية لأي ملف قابل للتنفيذ في مختلف إصدارات الوندوس أو 64 بت 32 بت

    ويمكن أن تكون صيغ ملف PE :
    exe , DLL ,ocx , cpl ....إلخ


    لمذا نحتاج لمعرفته ؟

    نحتاج لمعرفة بنية ملف PE لغرضين أساسيان :

    - الأول
    لدينا مثلا ملف PE ونريد أن نحقن فيه شيل كود أو دمج أي كود فيه بغرض تغيير وظيفته أو مانسميه بالتلغيم .


    الثاني

    أيضا لنقوم بفك الظغط عن الملف PE يدويا فأغلب البرامج الآن تكون مضغوطة وذلك لتقليص حجم الكود ومن ناحية أخرى لحماية الكود من العبث .

    الملفات القابلة للتنفيذ والمضغوطة عادة مايقع إتلاف جداول الإستيراد فيها أي (import tables) وغالبا تكون البيانات مشفرة .

    فوظيفة Packerهو إدراج كود ليفك الظغط عن الملف في الذاكرة فور تنفيذه ثم يقوم بالقفز إلى نقطة بداية الملف (أين يوجد البرنامج الأصلي فور تنفيذه)

    فإن أردنا تفريغ هذه الأماكن من الذاكرة بعد قيام الباكر بفك الظغط عن الملف فنحن محتاجين إلى تعديل الأقسام (sections) وجداول الإستيراد قبل أن يشتغل البرنامج أو الملف PE (محمول القابل للتنفيذ ) تبعنا .

    فكيف يمكننا فعل ذلك إن كنا لانعرف ماهو ملف PE وماهي بنيته ؟

    [​IMG]
    (مصدر الصورة جوجل صور)


    يحتوي الملف PEعلى الأقل على قسمين : 2sections


    قسم للكود

    وقسم للبيانات



    قامت ميكروسوفت بتحديد 9 أقسام ممكنة يحتويها تطبيق في Windows NT وهم كالتالي :
    text, .bss, .rsrc, .data, .edata, .idata, .pdata, .rdata, .debug.

    بعض التطبيقات لاتحتاج لكل هذه الأقسام ومن ناحية أخرى توجد تطبيقات قد تحتاج لأكثر من هذه الأقسام وذلك حسب مايغطي إحتياجاتها الخاصة .

    أغلب الأقسام الموجودة في ملف PEهم كالتالي :

    قسم الكود القابل للتنفيذ : .text

    أقسام البيانات : .data, .rdata, .bss.

    أقسام الموارد : .rsrc

    قسم تصدير البيانات : .edata

    قسم توريد البيانات : .idata

    قسم معلومات التنقيح : .debug

    هذه الأسماء في الواقع ليست موجودة وليست معرفة في نظام التشغيل وإنما وجدت فقط لتسهيل الأمور على المبرمجين .

    أيضا نقطة أخرى مهمة وهو أن بنية الملف PE في القرص الصلب تبقى نفسها عندما يُحمل الملف في الذاكرة .
    يعني ذلك إذا تمكنا من إيجاد معلومة عن ملف معين موجود في القرص الصلب فسيكون بإستطاعتنا أيضا إيجاد تلك المعلومة عندما يتم تحميل الملف في الذاكرة .

    لكن من ناحية أخرى لايتم نسخ هذه المعلومة بالضبط في الذاكرة فمحمل الوندوس (windows loader) هو الذي يقرر أي الأقسام التي يتم رسمها في الذاكرة وقديتجاهل الأقسام الأخرى .

    والبيانات التي لايتم رسمها في الذاكرة يتم وضعها في آخر الملف ك (unmapped data) ويقع تمرير معلومات في قسم debug عن الأجزاء التي سيقع رسمها .

    أيضا مكان وجود عنصر تبع ملف حين يكون في القرص الصلب قد يختلف مكانه عندما يقع تحميله في الذاكرة وذلك يعود لكيفية إدارة الوندوس لصفحات الذاكرة الإفتراضية .



    عندما يتم تحميل أقسام ملف PE في الذاكرة يتم تصفيف هذه الأقسام لتملئ 4 كيلوبايتس من صفحات الذاكرة وكل قسم يبدأ من صفحة جديدة .

    وهذه الصورة مؤخوذة من ميكروسوفت توضح الذاكرة الإفتراضية .


    [​IMG]


    وجدت الذاكرة الإفتراضية لكي لايتم السماح للبرنامج بالوصول المباشر إلى الذاكرة الفيزيائية .

    يكمن دور المعالج ونظام التشغيل في إنشاء طبقة مخفية بين الذاكرة الإفتراضية و الذاكرة الفيزيائية وكل مرة تحاول بروسس معينة الوصول إلى الذاكرة الفيزيائية يقوم المعالج بالنظر في (page table)التي تكمن مهمتها في ترجمة العناوين الإفتراضية إلى عناوين فيزيائية )) ليحدد لالبروسس عنوان الذاكرة الفيزيائية الذي يمكن إستعماله .




    وليس من الممكن أن يوجد جدول بدء (table) لكل بايت من الذاكرة لأن حجم فضاء العناوين الإفتراضية أكبر بكثير من الذاكرة الفيزيائية ولذلك قام المعالج بتقسيم الذاكرة إلى صفحات وذلك لعدة فوائد :

    1) يسمح ذلك بإنشاء صفحات مختلفة لفضائات الذاكرة .
    فضاء العنونة هو عبارة عن (page table) معزول يخصص للبرنامج في الذاكرة و يمكن له إستعماله . وذلك لضمان فصل البرامج عن بعضها البعض ففي حالة حدوث خطأ يتسبب في كراش لبرنامج معين فلاينتج عن هذا الخطأ كراش لبرنامج آخر .


    2) يسمح للمعالج بتوزيع الأدوار عن كيفية الوصول للذاكرة .
    من الضروري تقسيم ملف PE إلى أقسام متعددة وذلك لأن هذه الأقسام يتم معالجتها بشكل مختلف من قبل إدارة الذاكرة عند تحميل Module في الذاكرة .
    أثناء وقت تحميل البرنامج في صفحات الذاكرة تقوم إدارة الذاكرة بتوزيع الصلاحيات لمختلف أقسام الملف PE ويتم هذا التوزيع حسب ماتجده من معلومات في قسم Header تبع الملف PE .
    تحدد هذه الصلاحيات إذا كان القسم تبع ملف PE للقرائة فقط ، أو للكتابة فقط ، أو للتنفيذ . وهذا إذا يعني أن كل قسم يجب أن يبدأ في صفحة فارغة .

    ومن ناحية أخرى حجم الصفحة في الوندوس هو 4094 بايت (1004 h) وسيكون من التبذير تصفيف الأقسام إلى صفحات حدها 4 كيلوبات في القرص .
    ولهذا السبب ينقسم HEADER تبع الملف PE إلى قسمين :

    قسم Section alignment :
    يصف كيفية تصفيف أقسام الملف في الذاكرة .

    و قسم file alignment
    يصف كيفية تصفيف الأقسام في الملف داخل القرص الصلب على مجموعة أقسام صغيرة تسمى frames .



    3) تسمح للتخزين المؤقت لالصفحات الغير مستعملة داخل القرص الصلب والآتية من الذاكرة الفيزيائية . فإذا تم تحميل تطبيق معين ثم أأصبح مختفي ففضاء عناوينه يمكن وضعه في القرص الصلب وذلك لإعطاء الفرصة لبرنامج آخر يحتاج لالتحميل في RAM .
    أيضا قد يحتاج البرنامج لإستعمال مساحة أكثر من المساحة المتاحة فيقوم نظام التشغيل باستعمال القرص الصلب كمكان تخزين إظافي لزيادة حجم التخزين الفيزيائي،

    عندما يتم تحميل ملف داخل الذاكرة من قبل محمل الوندوس (windows loader )
    يتحول إسمه إلى موديل (module)
    بداية عناوين رسم الملف في الذاكرة يسمى (Hmodule)
    الموديل في الذاكرة يمثل كل الكود والبيانات وموارد ملف قابل للتنفيذ التي يحتاجها للتنفيذ .
    ومن ناحية أخرى كلمة process تعود إلى عنوان فضاء معزول يمكن إستعماله لتشغيل الموديل .

    في أمان الله


     
حالة الموضوع:
مغلق

مشاركة هذه الصفحة