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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
binprotect — أداة تعقيد bin2bin لملفات PE بمعمارية x64، لا تضيف قسمًا إلى الملف الثنائي. | Kitploit
أدوات/GitHubGitHub/noahware/binprotect
التحليل الثابتالتحليل الديناميكي (عزل)الهندسة العكسيةتحليل البرمجيات الخبيثةتحليل الملفات الثنائية
GitHubnoahware/binprotect

binprotect

أداة تعقيد bin2bin لملفات PE بمعمارية x64، لا تضيف قسمًا إلى الملف الثنائي.

عرض المستودع
3043623منذ 2 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

تعليمات البناء

انظر 4. البناء لتعليمات البناء.

المحتويات

  1. مقدمة
  2. إعادة كتابة الثنائيات
    • 2.1. تتبع العناوين النسبية
    • 2.2. التفكيك
      • 2.2.1. تقسيم الكتل الأساسية
      • 2.2.2. التدفق غير المباشر للتحكم
        • 2.2.2.1. جداول القفز
          • 2.2.2.1.1. جداول القفز المحدودة
          • 2.2.2.1.2. جداول القفز غير المحدودة
          • 2.2.2.1.3. أنواع مختلفة من جداول القفز
        • 2.2.2.2. الحالات الحدّية
      • 2.2.3. الدوال
      • 2.2.4. التعامل مع استدعاءات 'Noreturn'
    • 2.3. دعم الاستثناءات
      • 2.3.1. دعم التراجع
        • 2.3.1.1. التنفيذ
      • 2.3.2. تحليل معلومات الاستثناءات
        • 2.3.2.1. SEH/C_SCOPE_TABLE
        • 2.3.2.2. FuncInfo3 وFuncInfo4
      • 2.3.3. تحليل RTTI وThrowInfo
        • 2.3.3.1. RTTI
        • 2.3.3.2. ThrowInfo
  3. التعتيم
    • 3.1. الآلة الافتراضية
      • 3.1.1. دعم التراجع
    • 3.2. كتل المسندات المعتمة
    • 3.3. تسطيح تدفق التحكم
    • 3.4. الاستبدال الخطي
    • 3.5. الحساب المختلط للقيم المنطقية
  4. البناء
  5. الاستخدام
  6. الاختصارات
  7. الاعتمادات

1. مقدمة

أداة التعتيم هذه هي bin2bin، مما يعني أنها تأخذ ملفًا ثنائيًا قابلاً للتنفيذ تم تجميعه مسبقًا وتعيد إنتاجه مع تمريرات التعتيم المطبّقة. يمكن استخدام ذلك لحماية تطبيق دون الحاجة إلى الوصول إلى الكود المصدري الأصلي. يتم دعم ملفات x64 PE (الملفات القابلة للتنفيذ المحمولة) فقط حاليًا، لكن هناك خططًا لإضافة دعم لصيغ ثنائية أخرى (مثل ELF) في المستقبل.

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

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

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

ستصف هذه الوثيقة كلاً من إعادة كتابة الملف الثنائي القابل للتنفيذ وتقنيات التعتيم المطبقة. تم تنفيذ تقنيات التعتيم التالية:

  • آلة افتراضية.
  • مسندات معتمة.
  • تسطيح تدفق التحكم.
  • استبدال خطي.
  • حساب مختلط للقيم المنطقية.

علاوة على ذلك، يدعم هذا المشروع الاستثناءات (استثناءات C++ وSEH) ويمكنه تعتيم الدوال التي تحتوي على معالجة استثناءات.

للمساعدة في التفكيك واكتشاف الكود في الملف الثنائي، يتم قبول ملفات الرموز (سواء PDB أو MAP) بشكل اختياري. توفير ملفات الرموز ليس ضروريًا ولكنه يساعد في التفكيك في الملفات الثنائية المعقدة. تتطلب بعض الميزات مثل دعم الاستثناءات وتسطيح تدفق التحكم توفير ملف رموز.

2. إعادة كتابة الثنائيات

أداة إعادة كتابة الثنائيات تأخذ ملفًا ثنائيًا قابلاً للتنفيذ وتغيّر الكود أو البيانات بداخله لإنتاج ملف ثنائي ناتج مع تطبيق التغييرات.

2.1. تتبع العناوين النسبية

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

عندما يتم العثور على أي مرجع لعنوان نسبي (مثل تعليمة تحتوي على معاملات نسبية لـ rip أو أدلة بيانات PE)، يُضاف إلى قائمة تتبع ليتم تحديثه في نهاية إعادة الكتابة. يتم تتبع RVA حيث يقع المرجع (لمعرفة أين يتم تحديث المرجع) وكذلك RVA المُشار إليه (لمعرفة العنوان الذي سيتم تحديث المرجع به).

عندما يجد المفكك تعليمة نسبية لـ rip، سيضيفها إلى قائمة مراجع ليتم تحديثها في نهاية التعتيم. يضمن ذلك أن جميع هذه التعليمات لا تزال تشير إلى الموقع الذي كانت تشير إليه أصلاً. كما تُضاف حالات أخرى من التعليمات النسبية مثل جداول القفز كمراجع يجب تحديثها.

يجب تعديل جميع RVAs المتتبعة كلما تم إدراج أي بايتات أو إزالتها من الملف الثنائي. على سبيل المثال، هذا هو معالج إدراج البايتات:```cpp
void binwrite::binary_t::insert(const rva_t rva, const std::span data, const bool inclusive)
{
buffer_.insert_range(buffer_.begin() + rva.value(), data);

update_rvas(rva, static_cast<rva_t::size_type>(data.size()), inclusive);  

}

`update_rvas` هو المكان الذي يتم فيه تحديث كل RVA مُتتبَّع ليعكس التغيير الذي حدث في الملف الثنائي. فيما يلي مخطط لهذه العملية:

![](https://assets.kitploit.com/production/public/readmes/8091/12aaec3746c267c932ab3804b13df50c08a463c403417bf6ba4a52f39d12f48a.png)

الشكل 1. تتبّع العناوين النسبية (Relative address tracking).

البيانات المُدرَجة (بالأزرق) تُزيح البيانات الحالية (بالرمادي). يتم تحديث RVA المُشار إليه في التعليمات (بالبرتقالي) ليشير إلى نفس الموقع في الذاكرة، مع احتساب البيانات المُدرَجة (بالأزرق).

## 2.2. التفكيك (Disassembly)

تتم إضافة جميع نقاط الدخول المحتملة للكود (الصادرات، نقطة الدخول، عمليات إعادة التوطين التي تشير إلى قسم الكود، إلخ) إلى قائمة انتظار التفكيك. إذا كان ملف الرموز (symbol file) موجودًا، تتم أيضًا إضافة جميع الدوال الموصوفة بواسطة ملف الرموز إلى قائمة انتظار التفكيك. يتم التعامل مع كل إدخال في قائمة الانتظار ككتلة أساسية (basic block) مستقلة.

الكتلة الأساسية هي مجموعة من التعليمات بدون فروع؛ وهذا يعني أنها تُنهى عند تعليمات التحكم في تدفق التنفيذ (مثل jump، ret، int). لا تنتهي الكتل الأساسية عند استدعاءات الدوال (calls) لأنه من المتوقع أن تعود الدالة في معظم الحالات. بعض الدوال لا تعود (مثل `_CxxThrowException`) وستُشار إليها من الآن فصاعدًا باسم استدعاءات 'noreturn'.

عند معالجة كتلة أساسية من قائمة انتظار التفكيك، يتم تفكيك كل تعليمة بدءًا من الأعلى حتى يحدث أحد الأمور التالية:

- الوصول إلى كتلة أساسية أخرى تم تحليلها بالفعل، مما يؤدي إلى تداخل. انظر "تقسيم الكتل الأساسية".  
- العثور على تعليمة إنهاء (jump، return، int).  
- فشل تفكيك التعليمات.  
- العثور على حشوة كود (code padding).

فيما يلي مخطط لعملية التفكيك ودخول قائمة انتظار التفكيك (تم حذف فحص حشوة الكود في المخطط). تتكرر هذه العملية حتى تصبح قائمة انتظار التفكيك فارغة.

![](https://assets.kitploit.com/production/public/readmes/8091/7fe76b27e9f1f6ef620bc3aca182b85f9075c1dd31441e565099c05cfa396098.png)

الشكل 2. معالجة التفكيك.

### 2.2.1 تقسيم الكتل الأساسية

إذا تداخلت كتلتان أساسيتان، فيجب تقسيم إحداهما. وهذا يمنع كتلتين من وصف نفس التعليمات. على سبيل المثال:```asm  
wcslen proc  
    or      rax, 0FFFFFFFFFFFFFFFFh  
loc_140001078:  
    inc     rax  
    cmp     word ptr [rcx+rax*2], 0  
    jnz     short loc_140001078  
    retn  
wcslen endp  

هذا هو تنفيذ wcslen، الذي يحصل على طول سلسلة عريضة. عندما يتم تفكيك التعليمات الأولى 'or rax, FFFFFFFFFFFFFFFF' كبداية لكتلة أساسية، فإنها ستستمر في التفكيك حتى 'retn'.

تقفز التعليمات 'jnz loc_140001078' إلى الأعلى لتشكيل حلقة. ستتم إضافة هذا كمرجع، وسيتم إضافة هدف jnz إلى قائمة انتظار التفكيك بالإضافة إلى فرع التتابع (التعليمة التالية). تقفز التعليمات في منتصف الكتلة التي تم تحليلها بالفعل، لذا لا يمكنها ببساطة تشكيل كتلة جديدة والتفكيك مرة أخرى حتى 'retn' لأن ذلك سيمثل تكرارًا.

ستأخذ 'jnz' (القفزة الشرطية) أيضًا فرع التتابع لإنشاء كتلة أساسية جديدة أيضًا. الآن سيكون هناك 4 كتل أساسية تبدو كالتالي:

تنزيل الأداة