الفريق العربي للهندسة العكسية

نسخة كاملة : مقدمة بسيطة لفك التغليف
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
إليك بعض النصائح المفيدة حول عملية التعبئة. آمل أن تجدها مفيدة.

مكونات برامج التعبئة:
تأخذ جميع برامج التعبئة ملفًا تنفيذيًا وتنتج ملفًا تنفيذيًا آخر.

مع ذلك، لا يحتوي الملف الناتج على أي معلومات حول وظائف الملف الأصلي.

إنه جزء صغير من التعليمات البرمجية يقوم بفك ضغط أو فك تشفير الملف الأصلي والملف المضغوط أو المشفر.

يمكن لبرامج التعبئة أيضًا تعبئة ملف EXE بالكامل أو قسمي التعليمات البرمجية والبيانات فقط.

يأخذ برنامج التعبئة الملف المستهدف كمدخل. باستخدام الجزء الصغير من التعليمات البرمجية، ينتج الملف المعبأ، الذي يحتوي على الملف المضغوط.

الجزء الصغير من التعليمات البرمجية هو جزء صغير من التعليمات البرمجية يحتوي على عامل فك التشفير أو فك الضغط المستخدم لفك تشفير الملف المعبأ.

من الجوانب المهمة في عملية التعبئة أن برنامج التعبئة ينقل نقطة الدخول الأصلية ويخفيها داخل القسم المعبأ.

هذا يجعل تحديد جدول عناوين الاستيراد (IAT) ونقطة الدخول الأصلية أمرًا صعبًا.

لذا، يتكون الملف المضغوط من:

- رأس PE جديد
- قسم (أقسام) مضغوط (تحتوي على الكود الأصلي)
- وحدة فك الضغط - تُستخدم لفك ضغط الكود

تنفذ وحدة فك الضغط ثلاث خطوات:

1) فك ضغط الملف التنفيذي الأصلي إلى الذاكرة.

2) حل جميع عمليات استيراد الملف التنفيذي الأصلي.

3) نقل التنفيذ إلى نقطة الدخول الأصلية (OEP).

كيف يُنفذ الملف المضغوط الملف الهدف؟

كما يُطلق عليه "وحدة فك الضغط"، تقوم هذه الوحدة بفك ضغط الملف الهدف.

هناك طريقتان لتنفيذ الكود الأصلي:

تنفيذ الكود في نفس مساحة العملية عن طريق تخصيص ذاكرة كافية لتحميل الملف التنفيذي فيها.

تُستخدم هذه الطريقة في معظم المنتجات القانونية، مثل UPX.

2) إنشاء عملية فرعية وحقن ملف PE فيها باستخدام تقنيات حقن العمليات لتشغيله.

كيف يعرف البرنامج المساعد مكان المحتوى المضغوط/المشفر؟

هناك العديد من الطرق التي يمكن تطبيقها في هذه الحالة.

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

أما أسهل طريقة، في رأيي، فهي وضع المحتوى المضغوط في مكان معروف داخل ملف PE، مثل النهاية أو القسم الأخير، للسماح بفك ضغطه بأمان دون التأثير على الأقسام الأخرى.

قسم موارد PE هو قسم أراه غالبًا يحتوي على ملفات PE، لذا يمكننا وضع المحتوى المضغوط فيه.

خيار آخر هو استخدام سلسلة Base64 ضخمة تحتوي على البيانات المشفرة؛ حالة مشابهة موجودة في مثال PuTTY.

الرأس
الواردات
الصادرات
قسم .text <------------- نقطة الدخول
قسم .data
قسم .rsrc

أعلاه، يمكننا رؤية بنية ملف تنفيذي PE عادي.

يحتوي على واردات وصادرات وأقسام عادية. نقطة الدخول موجودة في موقعها المعتاد وتشير إلى بداية قسم .text.

الرأس
فك الضغط <------------- نقطة الدخول
الكود الأصلي المضغوط

يبدو الملف التنفيذي المضغوط على القرص كما يلي: كل ما نراه هو الرأس، وفك الضغط، والكود الأصلي المضغوط.

الرأس
الصادرات
قسم .txt
قسم .data
قسم .rsrc
فك الضغط <---------------- نقطة الدخول

يبدو الملف التنفيذي غير المضغوط في الذاكرة كما يلي: قام فك الضغط بفك ضغط قسم الملف التنفيذي الأصلي، ولكن لم يتم حل عمليات الاستيراد، ولا تزال نقطة البداية تشير إلى نقطة الدخول في فك الضغط.

رأس الملف
الصادرات
قسم .txt <---------------- نقطة الدخول
قسم .data
قسم .rsrc
برنامج فك الضغط
الواردات

في الأعلى، لدينا ملف مفكوك بالكامل.

أعاد برنامج فك الضغط بناء جدول الواردات، وتشير نقطة البداية الآن إلى ملف OEP الأصلي.

لاحظ أنه في هذه التقنية، يتم فك ضغط الملف التنفيذي الأصلي داخل الملف المفكوك؛ لذلك، سيختلف الملف النهائي عن الملف التنفيذي الأصلي.

كيف يحل برنامج فك الضغط مشكلة استيراد الملف التنفيذي الأصلي؟

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

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

هناك طريقة أخرى تتمثل في الحفاظ على جدول الاستيراد كما هو.

بعد أن يقوم برنامج فك الضغط بفك ضغط الملف التنفيذي الأصلي، يستخدم مُحمِّل Windows جدول الاستيراد لتحميل جميع عمليات الاستيراد التي يحتاجها الملف التنفيذي.

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

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

بهذه الطريقة، يمكن للمحللين تحديد جميع المكتبات التي يستخدمها الملف التنفيذي.

في الطريقة الأكثر تعقيدًا، لن يحتفظ برنامج الضغط بأي عمليات استيراد، بما في ذلك LoadLibrary وGetProcAddress. في هذه الحالة، يجب أن يجد ملف فك التغليف كل شيء