Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
packer-tutorial — درس تعليمي حول كيفية كتابة أداة packer لـ Windows! | Kitploit
أدوات/GitHubGitHub/frank2/packer-tutorial
الهندسة العكسيةتحليل البرمجيات الخبيثةتحليل الملفات الثنائيةالتعلم والتعليم
GitHubfrank2/packer-tutorial

packer-tutorial

درس تعليمي حول كيفية كتابة أداة packer لـ Windows!

عرض المستودع
3193215منذ 2 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

PACKERS

جدول المحتويات

  1. ما هو المُعبئ؟: مقدمة إلى الغرض من المُعبئات ودليل عبر ما هي ضروريات تطوير المُعبئ.
  2. المتطلبات الأساسية: الأدوات اللازمة للعمل مع هذا البرنامج التعليمي.
  3. تجربة سريعة: عرض توضيحي لما ستبنيه باستخدام هذا البرنامج التعليمي.
  4. رسم مشروع CMake الخاص بنا: درس مصغّر عن CMake حول إنشاء نظام بناء يلبي الاحتياجات المعقدة نوعًا ما للمُعبئ.
  5. تعبئة الملفات الثنائية داخل الستب الخاص بك: درس حول كيفية كتابة جزء المُعبئ من مزيج المُعبئ/الستب، بالإضافة إلى مقدمة إلى تنسيق ملفات ويندوز القابلة للتنفيذ.
    1. إدارة الموارد
    2. تحليل ملف PE
    3. التلاعب بملف PE
  6. محاكاة المُحمّل: درس حول كيفية بناء برنامج ستب تنفيذي بسيط لفك ضغط وتحميل برنامج تنفيذي مستهدف، بالإضافة إلى مقدمة إلى معالجة أكثر تقدمًا لملفات ويندوز القابلة للتنفيذ.
    1. قراءة ملف PE الخاص بنا من الذاكرة
    2. تحميل ملف PE الخاص بنا للتنفيذ
    3. حل استيرادات API
    4. حل العناوين
    5. نقل التنفيذ
  7. تمارين إضافية: بعض التمارين لتوسيع معرفتك بتطوير المُعبئات.

هل يبدو الأمر قراءة شاقة؟ جرّب نسخة العرض التقديمي، الذي يلخّص هذا المستند. فيديو يوتيوب قريبًا!

ما هو المُعبئ؟

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

  • الضغط: تُستخدم المُعبئات عادةً لضغط كود برنامج معين. هذا أحد استخداماتها المشروعة القليلة. انظر UPX كمثال على مُعبئ ضاغط.
  • التعتيم: تُستخدم المُعبئات أيضًا عند محاولة تعتيم برنامج أو حمايته من الهندسة العكسية. انظر مُعبئ packman من Riot Games كمثال على مُعبئ مضاد للهندسة العكسية.
  • المراوغة: تستخدم البرمجيات الخبيثة غالبًا مجموعة متنوعة من المُعبئات من أجل مراوغة برامج مكافحة الفيروسات وحتى EDR. انظر هذا التحليل لمُعبئ SmokeLoader كمثال على مُعبئ مراوغ.

أساسيًا، يمر المُعبئ بعدد قليل من الخطوات الأساسية:

  1. مرحلة الضغط: هنا يتم ضغط البرنامج التنفيذي الأصلي أو تعتيمه أو كلاهما، في ملف ثنائي جديد.
  2. مرحلة فك الضغط: هنا يقوم الملف التنفيذي المُعبأ بفك ضغط أو إزالة التعتيم عن ملفه التنفيذي الأصلي لتحميله.
  3. مرحلة التحميل: هنا يحاكي المُعبئ مجموعة من الخطوات المشابهة لمُحمّل الملفات التنفيذية في النظام المضيف. بسبب تعقيد الملفات التنفيذية، تعد هذه الخطوة الأكثر تعقيدًا، اعتمادًا على مستوى العمق الذي ترغب في محاكاته.
  4. مرحلة التنفيذ: هنا ينتقل الكود من ملف الستب التنفيذي المضيف إلى الكود المحمّل حديثًا (أي غير المُعبأ).

وبالمثل، يتكوّن المُعبئ من بضعة أجزاء فقط:

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

قد يكون بناء مُعبئ أمرًا معقدًا، لأن الستب يحتاج إلى البناء واستيراده بطريقة ما داخل الملف التنفيذي للمُعبئ. بالنسبة لويندوز، فإن تعلم نظام البناء الخاص بـ Visual Studio بما يتجاوز الترجمة البسيطة قد يكون مهمة مرهقة. لحسن الحظ، يوفر CMake نظام بناء بسيطًا ومتعدد المنصات يدعم Visual Studio، وهو قابل للتخصيص بدرجة كبيرة!

يهدف هذا البرنامج التعليمي إلى تعليم ما يلي:

  • كيفية تقسيم ودمج الجزأين الرئيسيين للمُعبئ في بيئة بناء متماسكة وقابلة للاختبار.
  • كيفية التعامل مع ملف ويندوز تنفيذي لإضافة بيانات إضافية قابلة للتحميل.
  • كيفية التنقل داخل ملف ويندوز تنفيذي لاسترجاع وتحميل بيانات عشوائية.
  • كيفية محاكاة أجزاء من مُحمّل ويندوز لتحميل وتنفيذ ملف ويندوز تنفيذي.

إذا كنت معتادًا بالفعل على C++ و CMake، فلا تتردد في الانتقال مباشرة إلى قسم التعبئة. وإلا، تابع القراءة!

المتطلبات الأساسية

  • معرفة بـ C++: هذا البرنامج التعليمي غير مفيد نوعًا ما إذا كنت لا تعرف C++، لأننا سنقوم بالكثير من الحسابات على المؤشرات.
  • Visual Studio: يحتوي Visual Studio على مترجم C++ لويندوز كامل الميزات. تم اختبار هذا المشروع مع Visual Studio 2019، ولكن الإصدارات الأحدث يجب أن تكون جيدة.
  • CMake: CMake هو نظام البناء الذي نستخدمه للمساعدة في تهيئة عمليات البناء الخاصة بنا لمترجم Visual Studio.

تجربة سريعة

أولًا، دعنا نثبت بطريقة ما أن نظام البناء هذا يعمل وينشئ ملفًا تنفيذيًا مُعبأ بشكل صحيح. بمجرد تثبيت CMake و Visual Studio، انتقل إلى الدليل الجذر لهذا المستودع باستخدام الطرفية التي تفضلها ونفّذ ما يلي:``` $ mkdir build $ cd build $ cmake ../

سيؤدي هذا إلى إنشاء ملفات المشروع اللازمة لبناء كود البرنامج التعليمي الخاص بـ Packer. ثم قم بتشغيل:```
$ cmake --build ./ --config Release

سيؤدي هذا إلى بناء مشروع packer في وضع Release. ثم يمكنك تشغيل الاختبار التالي:``` $ ctest -C Release ./

إذا سار كل شيء على ما يرام، يجب أن ينجح test\_pack و test_unpack. إذا أردت رؤية نتائج التعبئة بنفسك، يجب أن ترى هذا:```
$ ./packed.exe
I'm just a little guy!

لنتحدث عن جميع الأجزاء المتحركة التي جعلت هذا الأمر يتحقق.

رسم الخطوط العريضة لمشروع CMake الخاص بنا

إذًا نحن نعرف ما هي المكوّنات الرئيسية لأداة التغليف (packer)، لكن كيف يمكننا اختبار هذه الأداة فورًا كجزء من دورة التطوير؟ سنحتاج إلى إضافة ملف تنفيذي ثالث إلى مشروعنا العام لاختبار عملية التغليف وفك التغليف لملفنا التنفيذي بشكل صحيح. لذا نحتاج بشكل عام إلى ثلاثة مشاريع:

  • أداة التغليف (packer)
  • الوصلة (stub)
  • الملف التنفيذي التجريبي المراد تغليفه (dummy executable)

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

يجب أن يبدو هيكل مشروعنا، في البداية، على النحو التالي:``` packer/ +---+ CMakeLists.txt + dummy/ | | | +---+ CMakeLists.txt | + src/ | | | +---+ main.cpp | + stub/ | | | +---+ CMakeLists.txt | + src/ | | | +---+ main.cpp | + src/ | | | +---+ main.cpp | + zlib-1.2.13/ | +---+ CMakeLists.txt + ...

يمكن أن يبدو ملف main.cpp لدينا في كل مجلد ببساطة على هذا النحو في الوقت الحالي:```cpp
#include <iostream>

int main(int argc, char *argv[]) {
    std::cout << "I'm just a little guy!" << std::endl;
    
    return 0;
}

بالفعل، يجب أن نثبت أن لدينا سلسلة تبعيات بسيطة للتعامل معها، والتي سيقوم CMake بحلّها بشكل جيد لنا مع بعض الإعدادات:

  • packer و stub يعتمدان على zlib
  • packer يعتمد على stub
  • dummy يعتمد على packer (لأنه يحتاج إلى أن يتم تعبئته بواسطة packer)

لنبدأ بالمشروع الجذري root project، أي packer، من أجل تجهيز CMake الخاص بنا.

عادةً ما يتطلب CMake حدًا أدنى من الإصدار للتعامل معه، لأنه موجود منذ فترة طويلة ويدعم الاستخدام طويل الأمد للإصدارات السابقة. بعد ذلك، يمكننا تعريف مشروع packer كمشروع C++.```cmake

target a cmake version, you can target a lower version if you like

cmake_minimum_required(VERSION 3.24)

تنزيل الأداة