
مكوّن إضافي لـ Ghidra لتحديد حدود ملفات الكائنات.
مكوّن Ghidra الإضافي لواجهة DeepCut / CodeCut الرسومية
تتيح CodeCut للمستخدم تعيين الدوال إلى ملفات كائن داخل Ghidra، ثم التعامل مع الملف الثنائي على مستوى ملف الكائن. تُعيَّن الدوال إلى ملفات الكائن عبر تعيين الحقل Namespace في قاعدة بيانات Ghidra. تحاول DeepCut تحديد الحدود الأولية لملفات الكائن، ويمكن للمستخدم بعد ذلك تعديلها باستخدام نافذة جدول CodeCut.
تنشأ معظم الملفات الثنائية من ملفات مصدرية متعددة. عند القيام بالهندسة العكسية، غالبًا ما يطوّر محللو RE إحساسًا بالدوال المترابطة، والتي يُرجَّح أنها تنتمي إلى نفس الملف المصدر. تتيح CodeCut للمحلل تطوير فرضية مثل «أعتقد أن هذه المجموعة من الدوال هي دوال نظام تشغيل». الآن إذا وُجدت دوال غير مستكشفة في تلك المنطقة، فستظهر في التفكيك وفك الترجمة كـ OS::FUN_XXXXXXXX بدلاً من FUN_XXXXXXXX فقط. وهذا يؤدي إلى فهم أسرع لما قد تُستخدم من أجله الدوال عند عرضها في السياق.
اتبع إجراءات تثبيت إضافات Ghidra المعتادة. انسخ ملفات zip الخاصة بإضافتي CodeCut وDeepCut إلى $GHIDRA_INSTALL_DIR/Extensions ثم في النافذة الرئيسية لـ Ghidra اختر File -> Install Extensions وحدد مربعي CodeCut وDeepCut. سيخبرك Ghidra أنه يحتاج إلى إعادة التشغيل. وبما أن Ghidra يتطلب الآن أن تتوافق المكونات الإضافية مع الإصدار الرئيسي/الفرعي الأساسي فقط وليس إصدارات التصحيح، فإننا نتوقع إصدار إصدارات رئيسية/فرعية زوجية فقط.
ملاحظة: بعد إعادة التشغيل وتحميل نافذة CodeBrowser، سيخبرك Ghidra أنه عثر على مكونات إضافية جديدة ويسألك عما إذا كنت تريد تهيئتها. تظهر CodeCut فقط في هذه النافذة. وذلك لأن DeepCut محلل «أحادي التشغيل» (one-shot) (وهو ما يزال مثبتًا).
تعتمد كلٌّ من CodeCut وDeepCut على إضافة PyGhidra الأصلية، وهي غير متوافقة مع Jython. تستخدم CodeCut Python الأصلية لتخمين أسماء الوحدات، بينما يعمل استنتاج النموذج في DeepCut عبر Python الأصلية.
CodeCut:
DeepCut:
لتثبيت التبعيات، شغّل:
pip install nltk
pip install torch torch-geometric networkx scipy
باستخدام تثبيت Python المرتبط بـ PyGhidra لديك.
من الأفضل تشغيل DeepCut كمحلل أحادي التشغيل (one-shot) بعد التحليل التلقائي الأولي. اختر Analysis -> One Shot -> Deepcut. بعد تشغيل DeepCut، يمكنك عرض النتائج بالنظر إلى حقل Namespace في عرض Symbol Table.

بعد تشغيل DeepCut، يمكنك التفاعل على مستوى ملف الكائن من خلال عرض CodeCut Table. اختر Window -> CodeCut Table لعرض الجدول. جدول CodeCut هو في الأساس مجموعة مدمجة من جداول الرموز، جدول لكل وحدة.
يمكنك جعل CodeCut تخمّن أسماء الوحدات (استنادًا إلى مراجع السلاسل النصية) باختيار Analysis -> Guess Module Names في نافذة جدول CodeCut. يكون هذا مفيدًا إذا كان الملف التنفيذي الهدف يحتوي على الكثير من سلاسل التصحيح. يحاول سكربت تخمين الأسماء العثور على أسماء الملفات المصدرية أولاً، ثم يلجأ إلى السلاسل النصية (بما في ذلك الثنائيات والثلاثيات) المكررة عدة مرات.
يمكنك تقسيم/دمج ملفات الكائن بالنقر بزر الماوس الأيمن على كائن واختيار Split Namespace Here / Combine Namespaces. يمكنك نقل الدوال بين ملفات الكائن (بتغيير حدود ملفات الكائن) عن طريق السحب والإفلات.
تحتوي CodeCut على خيارين لتصدير وحدة كاملة أو نطاق فرعي من وحدة كرمز C قابل لإعادة الترجمة من خلال قائمة Export عند النقر بزر الماوس الأيمن على وحدة في جدول CodeCut. هذه الميزة مُعلَّمة بأنها تجريبية (EXPERIMENTAL) وغير مختبرة بشكل جيد.

تتضمن CodeCut الآن خيارًا رسوميًا لعرض التفاعلات / التسلسل الهرمي للوحدات داخل الملف الثنائي. أضف مساحات الأسماء إلى عرض المخطط بالنقر بزر الماوس الأيمن على دالة في جدول CodeCut واختيار Add Namespace to Graph. يمكنك إزالة الوحدات من المخطط بالنقر بزر الماوس الأيمن واختيار Show Namespaces in Graph Filter.
في حين يبدو أنه يمكنك النقر بزر الماوس الأيمن على أسماء الوحدات في الجانب الأيمن، فإن CodeCut في الواقع تراقب الدالة المحددة في الجدول. لذا، على سبيل المثال، إذا كانت لديك دالة في object3 محددة وقمت بالنقر بزر الماوس الأيمن على المربع الرمادي object2 على اليسار ثم نقرت على Combine/Split أو Rename Namespaces، فستنفذ CodeCut العملية انطلاقًا من الدالة المحددة في object3.
تحاول CodeCut ترتيب مساحات الأسماء حسب عنوان بدايتها. قد يبدو أن CodeCut تسرد الوحدات خارج الترتيب، لكن هذا يعود عادةً إلى عدم انتظام التفكيك في Ghidra. على سبيل المثال، لنفترض أن لدينا خريطة ذاكرة تبدو كالتالي:
object2: 0x00010000 - 0x00018000
object3: 0x00018004 - 0x00020000
...
object50: 0x00480000 - 0x00480a00
لنفترض أن الدالة عند العنوان 0x00480000 تقوم بفرع أو قفزة إلى عنوان 0x00016008. من المفترض أن تكون هذه نقطة دخول جديدة لدالة، لكن إذا كانت دالة واحدة فقط تستخدمها، فقد لا يصنفها Ghidra كنقطة دخول لدالة، ويعتبرها مجرد جزء من FUN_00480000. وهذا يعني أن النطاق الفعلي لـ object50 هو 0x00016008 - 0x00480a00. وبالتالي ستظهر object50 بين object2 وobject3 في الجدول. تُخرج CodeCut نطاقات الوحدات إلى سجل تطبيق Ghidra للمساعدة في تصحيح هذا الأمر. في هذه الحالة، سيؤدي تعريف 0x00016008 كدالة إلى جعل حدود object50 صحيحة وستظهر object50 في المكان الصحيح في الجدول.
تُضاف الدوال التي يتم تعريفها بعد تشغيل تحليل DeepCut افتراضيًا إلى مساحة الاسم Global. في المستقبل، نخطط لإضافة ميزة تضيفها تلقائيًا إلى أقرب مساحة اسم، أو توفير آلية لتسهيل إسناد الدوال المفردة مباشرةً إلى مساحة اسم محددة.
توجد تعليمات بناء محددة في المجلدات الفرعية DeepCut وCodeCut.