Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
ghidra_kernelcache — إطار عمل Ghidra لهندسة عكسية لنظام iOS kernelcache | Kitploit
أدوات/GitHubGitHub/0x36/ghidra_kernelcache
أمان iOSالهندسة العكسيةتحليل الملفات الثنائيةتحليل البرامج الثابتة
GitHub0x36/ghidra_kernelcache

ghidra_kernelcache

إطار عمل Ghidra لهندسة عكسية لنظام iOS kernelcache

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

الأكثر شعبية

عرض الكل →

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

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

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

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

ghidra_kernelcache: إطار عمل Ghidra لـ kernelcache لنظام iOS للهندسة العكسية

هذا الإطار هو نتاج خبرتي في الهندسة العكسية لـ Kernelcache، حيث أبحث عادةً عن الثغرات من خلال التدقيق اليدوي للنواة وامتداداتها، وقد قمت بأتمتة معظم الأشياء التي كنت أرغب حقًا في رؤيتها في Ghidra لتسريع عملية الهندسة العكسية، وقد أثبت ذلك فعاليته ويوفر الكثير من الوقت. يعمل الإطار على iOS 12/13/14/15 و macOS 11/12 (كل من kernelcache و KEXT منفرد) وقد تم إتاحته للجمهور بهدف مساعدة الأشخاص على بدء البحث في نواة iOS دون عناء إعداد بيئتهم الخاصة. كما أعتقد، فإن هذا الإطار (بما في ذلك مجموعة الأدوات التي يوفرها وبعض المعرفة الأساسية بـ IOKit) كافٍ لبدء الاختراق في Kernelcache.

الإطار مكتوب بالكامل بلغة Python، ويمكن توسيعه لبناء أدوات أخرى، ويوفر بعض واجهات برمجة التطبيقات الأساسية التي يمكنك استخدامها في أي مشروع تقريبًا وتوفير الوقت من قراءة الدليل المطول، نرحب بك لقراءة الوظائف الأساسية في دليل utils/ .

Ghidra جيد عندما يتعلق الأمر بتحليل Kernelcaches، ولكن مثل أدوات الهندسة العكسية الأخرى، يتطلب بعض العمل اليدوي، يوفر ghidra_kernelcache نقطة دخول جيدة لإصلاح الأمور في البداية وحتى أثناء القيام بالهندسة العكسية، مما يوفر مخرجات مفكك تبدو جيدة.

هناك مشروع مشابه من قبل @_bazad في IDAPro يسمى ida_kernelcache والذي يوفر نقطة دخول جيدة للباحثين الراغبين في العمل مع صورة النواة في IDA، إطاري يشبه إلى حد ما عمل Brandon، ويتجاوز ذلك من خلال توفير ميزات أكثر بكثير لجعل عملية العمل مع kernelcache أقل إيلامًا.

الميزات :

  • *رمزية kernelcache لنظام iOS.
  • إعادة بناء التسلسل الهرمي لفئات C++ والجداول الافتراضية.
  • مراجع استدعاءات الطرق الافتراضية.
  • الإصلاح التلقائي لجدول توزيع الطرق الخارجية لكل من ::externalMethod() و ::getTargetAndMethodForIndex().
  • تطبيق مساحات الأسماء على طرق الفئات.
  • نشر اسم الرمز ونوعه عبر وسيطات الدالة.
  • تطبيق تواقيع الدوال للدوال المعروفة للنواة.
  • استيراد الهياكل والفئات القديمة من مشروع قديم إلى مشروع جديد.

تم إنشاء هذه الميزات كأدوات منفصلة يمكن تنفيذها إما عن طريق اختصارات لوحة المفاتيح أو بالنقر على أيقوناتها في شريط الأدوات.

التثبيت

استنساخ المستودع :```sh git clone https://github.com/0x36/ghidra_kernelcache.git

root@kitploit:~
**ملاحظة مهمة**: تم اختبار المشروع على Ghidra 10.1_PUBLIC و 10.2_DEV وهو غير متوافق مع الإصدارات الأقدم.

انتقل إلى *`Windows → Script Manager`*، وانقر على *`script Directory`*، ثم أضف *`ghidra_kernelcache`* إلى قائمة مسارات الدليل.
انتقل إلى *`Windows → Script Manager`*، في قائمة *scripts*، انتقل إلى فئة *`iOS→kernel`* وتحقق من الإضافات الموجودة هناك، ستظهر في شريط أدوات GHIDRA.

في دليل [logos/](https://github.com/0x36/ghidra_kernelcache/tree/master/logos) يمكنك وضع شعاراتك الخاصة لكل أداة.

## ترميز نواة iOS kernelcache

يتطلب `ghidra_kernelcache` في المرحلة الأولى [iometa](https://github.com/Siguza/iometa/) (من صنع [@s1guza](https://twitter.com/s1guza))، وهي أداة قوية توفر معلومات فئة C++ في النواة الثنائية، الشيء الرائع أنها تعمل كملف ثنائي مستقل، لذا يمكن استيراد المخرجات إلى إطار عمل RE المفضل لديك بمجرد تحليلها. يأخذ إطاري مخرجات iometa ويحللها لترميز وإصلاح الجداول الافتراضية.

### الاستخدام
بعد فك ضغط النواة، قم بتشغيل الأوامر التالية:```sh
$ iometa -n -A /tmp/kernel A10-legacy.txt > /tmp/kernel.txt
# if you want also to symbolicate using jtool2
$ jtool2 --analyze /tmp/kernel

قم بتحميل kernelcache في Ghidra، لا تستخدم الاستيراد الدفعي، قم بتحميله كصورة Mach-O. بعد تحميل Kernelcache وتحليله تلقائيًا، انقر على الأيقونة الظاهرة في شريط الأدوات أو اضغط على Meta-Shift-K، ثم ضع المسار الكامل لمخرجات iometa وهو /tmp/kernel.txt في حالتنا.

إذا كنت ترغب في استخدام رموز jtool2، يمكنك استخدام jsymbol.py الموجود في فئة iOS→kernel أيضًا.

iOS kernelcache API

أمثلة كاملة لواجهة API موجودة في ghidra_kernelcache/kc.py

→ فيما يلي بعض الأمثلة على التعامل مع كائنات الفئة:```py from utils.helpers import * from utils.class import * from utils.iometa import ParseIOMeta

ff = "/Users/mg/ghidra_ios/kernel.txt" iom = ParseIOMeta(ff) Obj = iom.getObjects() kc = kernelCache(Obj)

symbolicate the kernel

kc.process_all_classes()

symbolicate the classes under com.apple.iokit.IOSurface bundle

kc.process_classes_for_bundle("com.apple.iokit.IOSurface")

symbolicate the classes under kernel bundle

kc.process_classes_for_bundle("kernel")

Process one class (including its parents)

kc.process_class("IOGraphicsAccelerator2")

Clears the content of the class structures (vtables are excluded)

kc.clear_class_structures()

Overwrite the old vtable structure definition and resymbolicate it again

kc.update_classes_vtable()

Reconstructing function call trees by enumerating all pac references and find their corresponding virtual method call

kc.explore_pac()

root@kitploit:~
كما ترى، يمكنك ترميز الكرنل كاش بالكامل أو جزئيًا، وإذا تم اختيار الترميز الجزئي، فسيقوم `ghidra_kernelcache` تلقائيًا ببناء جميع تبعيات الفئات قبل المتابعة.
إذا قمت بتشغيل السكريبت على الكرنل كاش بالكامل (الترميز الكامل)، فسيستغرق `ghidra_kernelcache` عدة دقائق لتحليل صورة النواة.

بمجرد الانتهاء، سيوفر Ghidra ما يلي:

→ تمت إضافة فئة جديدة في مرشح الإشارات المرجعية (Bookmark Filter) باسم "iOS":

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image1.png" alt="صورة1" width="200"/>

→ تتم إضافة الجداول الافتراضية لفئات IOKit إلى الإشارات المرجعية الخاصة بـ 'iOS' للحصول على بحث أسرع وأفضل في الجداول الافتراضية، يمكنك ببساطة البحث عن كيكست (kext) أو فئة بإدخال أحرف أو كلمات أو معرف حزمة الكيكست في شريط البحث.

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image2.png" alt="صورة2"/>

→ إصلاح الجدول الافتراضي: يقوم بفك تجميع/ترجمة الكود غير المعروف، ويصلح مساحات الأسماء، ويعيد ترميز طرق الفئة ويطبق تعريف دالة على كل طريقة:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image3.png" alt="صورة3"/>

→ إنشاء مساحات أسماء للفئات ووضع كل طريقة في مساحة الاسم المقابلة لها:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image4.png" alt="صورة4"/>

→ إنشاء هيكل الفئة مع مراعاة التسلسل الهرمي للفئات:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image5.png" alt="صورة5"/>

→ إنشاء الجداول الافتراضية للفئات، ولكل طريقة تعريفها الخاص للحصول على مخرجات فك تجميع أفضل:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image6.png" alt="صورة6"/>

يمكن العثور على التنفيذ الكامل في [`utils/class.py.`](https://github.com/0x36/ghidra_kernelcache/blob/master/utils/class.py)

فيما يلي بعض لقطات الشاشة قبل وبعد الترميز باستخدام `ghidra_kernelcache`:

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image7.png" alt="صورة7"/>

<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image8.png" alt="صورة8"/>

## ترميز كيكستات macOS
---
دعم `ghidra_kernelcache` لنظام macOS مخصص لكل من ترميز الكرنل كاش وكيكست واحد (KEXT) لمعماريتي ARM64e و x86_64.
**هام:** في وقت كتابة هذه السطور، لا يستطيع Ghidra تحليل كامل الكرنل كاش لنظام macOS، ولكن من الممكن تحميله في IDA للتحليل الأولي ثم استيراد قاعدة البيانات (idb إلى xml) إلى Ghidra لاحقًا، لكن هذا خارج النطاق. إذا تمكنت من القيام بذلك، فسيتولى `ghidra_kernelcache` الباقي.

هناك بعض الخطوات القليلة التي يجب اتباعها قبل ترميز أي إضافة نواة (Kernel Extension) لنظام macOS، حيث أن الهدف الرئيسي لـ `ghidra_kernelcache` هو إعادة بناء التسلسل الهرمي للفئات وإدارة جميع هياكل الفئات في قاعدة بيانات واحدة، ولا تستوفي إضافة النواة تلك المتطلبات، مما يعني أن ترميز كيكست واحد يتطلب ترميز النواة وربما إضافات نواة أخرى تعتمد عليها، وبالتالي يجب القيام ببعض العمل الإضافي هنا.
يوفر `ghidra_kernelcache` الآن طريقة قوية لترميز إضافات النواة بما في ذلك النواة نفسها عن طريق إدارة ومشاركة هياكل الفئات وتعريفات الطرق الافتراضية عبر أرشيف مشروع نوع البيانات (DataType Project Archive) القوي من Ghidra.

### خطوات ترميز إضافة نواة
- أنشئ مجلدًا جديدًا في مشروع Ghidra الخاص بك، ثم قم بتحميل `/System/Library/Kernels/kernel.release.XXXXX` إلى ذلك المجلد واترك Ghidra يحلله.
- أنشئ أرشيف مشروع جديد (Project Archive): اذهب إلى `DataType Provider` ← انقر على السهم في أعلى يمين النافذة ← `New Project Archive` ← ضعه داخل المجلد الذي تم إنشاؤه حديثًا ← سمِّه بشيء (مثال: macOS_12.1).
- الآن قم بترميز النواة باستخدام `ghidra_kernelcache`، العملية مشابهة تمامًا لترميز كرنل كاش iOS.```bash
$ iometa -n -A /System/Library/Kernels/kernel.release.t8101 > /tmp/kernel.txt
  • في وحدة تحكم بايثون، أو يمكنك العثور على تنفيذ البرنامج النصي الكامل في ملف KM.py :```py

from utils.helpers import * from utils.kext import * iom = ParseIOMeta("/tmp/kernel.txt") Obj = iom.getObjects() kc = Kext(Obj,shared_p="macOS_12.1") kc.process_kernel_kext()

root@kitploit:~
- بمجرد الانتهاء، تم إنشاء ارتباط قاعدة بيانات بين أرشيف النواة وأرشيف `macOS_12.1`. الآن، انقر بزر الماوس الأيمن على `kernel.release.t8001` ← `Commit DataTypes To` ← `macOS_12.1`.
- ثم `Right Click` ← `Select All` ← `Commit`.
- احفظ أرشيف المشروع: `Right click` ← `Save Archive`.
لقد أنشأنا للتو أرشيف مشروع يمكن مشاركته عبر جميع ملحقات النواة.
لنأخذ مثالاً لـ `IOSurface` Kext لأجهزة Apple Silicon:```bash
$ lipo /System/Library/Extensions/IOSurface.kext/Contents/MacOS/IOSurface -thin arm64e -output /tmp/iosurface.arm64e
$ iometa -n -A /tmp/iosurface.arm64e > /tmp/iosurface.txt
  • قم بتحميل Kext في نفس مسار المجلد حيث توجد قاعدة بيانات kernel وأرشيف المشروع، واترك Ghidra يكمل التحليل
  • قم بتحميل أرشيف المشروع الذي أنشأناه سابقًا macOS_12.1 : اذهب إلى Data Type Manager → Open Project Archive ، ثم حدد macOS_12.1
  • قم بتشغيل الطرق التالية، يمكن العثور على البرنامج النصي الكامل في KM.py:```python from utils.helpers import * from utils.kext import *

kc = Kext(Obj,shared_p="macOS_12.1")

This method fixes LC_DYLD_CHAINED_FIXUPS for M1 Kernel extension

kc.depac()

This method reconstructs class hierarchy and builds virtual table for each class

kc.process_kernel_kext()

root@kitploit:~
**ملاحظة هامة**: في بعض الأحيان يفشل `kc.process_kernel_kext()` لأن Ghidra لم يتمكن من فك تشابك بعض رموز C++. لإصلاح ذلك، انتقل إلى مدير النصوص البرمجية وقم بتشغيل السكريبت `DemangleAllScript.java` ثم أعد تشغيل `kc.process_kernel_kext()` مرة أخرى.

### الفئات المخصصة
هناك بعض الحالات التي لا تستطيع فيها `ghidra_kernelcache` و `iometa` ترجمة الرموز (symbolicate) لبعض فئات C++، لذلك تمت إضافة ميزة جديدة للتعامل مع هذا.
`Custom()` إعادة بناء الفئة تمر عبر جميع رموز `::vtable` وتتحقق مما إذا كانت الفئة محددة بالفعل أم لا، وإذا لم تكن كذلك، فإنها تنشئ تلقائيًا هيكل الفئة، وتعريفات الدوال لكل أسلوب فئة تم التعرف عليه، ونطاق أسماء (namespace)، وجدول افتراضي لكل فئة.

إنشاء الفئات المخصصة مدعوم فقط على macOS في الوقت الحالي.```bash
$ iometa -n -A /System/Library/Kernels/kernel.release.t8101 > /tmp/kernel.txt
$ iometa -n -A <kext_path> >> /tmp/kernel.txt

جمع النتائج

root@kitploit:~
# مسح 1000 منفذ TCP الأعلى لكل منفذ مفتوح
$ naabu -host 10.10.10.10 -p -

# مسح 1000 منفذ TCP الأعلى لمدى IP
$ naabu -host 10.10.10.0/24 -p -

# مسح 1000 منفذ TCP/UDP الأعلى لقائمة IP
$ naabu -list targets.txt -p - -p -

# تقديم خادم CDN ومسح المنافذ المتصلة
$ echo scanme.sh | naabu -p 80,443 -cdn -ec

# مسح باستخدام الوكلاء
$ naabu -host 10.10.10.10 -proxy socks5://user:pass@proxyIP:port

# مسح قائمة بالمنافذ
$ naabu -host 10.10.10.10 -p 80,443,8080,8443

# مسح بنطاق المنافذ
$ naabu -host 10.10.10.10 -p 80-85

# مسح TCP SYN فقط (لا فحص خدمة)
$ naabu -host 10.10.10.10 -p 1-100 -s s

# مسح جميع المنافذ TCP الكاملة (تجنباً للإهمال)
$ naabu -host 10.10.10.10 -p -

# إرسال النتائج بصيغة JSON إلى stdout
$ naabu -host 10.10.10.10 -json

# جمع النتائج وإخراجها فقط بالمنافذ المفتوحة (لا فحص خدمة)
$ naabu -host 10.10.10.10 -p - -s s -silent

# مسح IPv6 منفذ واحد لمدى معين
$ naabu -host IPv6Address/Mask -p 80

# إكمال مضيف IPv6 جزئي لمدى /64
$ naabu -host 2a01:111:f403:8015:: -p 1-100
``````py

from utils.helpers import *
from utils.custom_kc import *

if __name__ == "__main__":
    default = "/tmp/kernel.txt"
    ff = askString("iometa symbol file","Symbol file: ",default)
    iom = ParseIOMeta(ff)
    Obj = iom.getObjects()

    kc = Custom(Obj)

    kc.process_all_classes()
    kc.explore_pac()


نصوص برمجية متنوعة


استيراد Dwarf4 من KDK

تفشل Ghidra بطريقة ما في تحميل الدليل .dsym المقابل، لذا قمت بإنشاء نص برمجي صغير لإصلاح ذلك. يمكن العثور عليه هنا. الاستخدام : قم بتحميل النواة من مسار KDK الخاص بك، واترك Ghidra تنهي التحليل، ثم قم بتشغيل dwarf_fix.py، وسيقوم بتحميل الرموز وقد تستغرق العملية عدة دقائق. image12

حل مراجع استدعاءات الطرق الافتراضية

يوفر ghidra_kernelcache طريقتين لحل الاستدعاءات الافتراضية بواسطة kernelCache.explore_pac أو fix_extra_refs

kernelCache.explore_pac() إذا كنت تعمل على ثنائي arm64e، يمكن لـ ghidra_kernelcache التعرف على استدعاءات الطرق الافتراضية من خلال البحث عن قيمة Pointer Authentication Code. العملية واضحة ومباشرة، وعلى عكس fix_extra_refs()، لا تعتمد kernelCache.explore_pac على تحديد Pcode أو varnode، بل تقوم فقط بالتكرار عبر جميع التعليمات في البرنامج، وتبحث عن تعليمات MOVK، وتجلب المعامل الثاني وتبحث عن قيمته المقابلة في قاعدة البيانات. الاستخدام : قم بإنشاء مثيل KernelCache عبر kernelCache أو Kext أو Custom، ثم استدعِ طريقة explore_pac().```py from utils.helpers import * from utils.kext import *

if name == "main": default = "/tmp/kernel.txt" ff = askString("iometa symbol file","Symbol file: ",default) iom = ParseIOMeta(ff) Obj = iom.getObjects()

root@kitploit:~
kc = Kext(Obj)

 kc.explore_pac()
root@kitploit:~
**fix_extra_refs()** 
تعتمد هذه الدالة على تحليل تدفق البيانات الأساسي لإيجاد جميع طرق الاستدعاء الافتراضي (virtual call methods) وحل تنفيذاتها تلقائيًا. تعمل عبر جميع البنى ولديها القدرة على التعرف على نوع البيانات المصدر من مخرجات أداة فك التجميع (decompiler) وحل جميع مراجع الاستدعاء الافتراضي داخل الدالة، مما يسمح للمستخدم بالانتقال للأمام/للخلف مباشرةً إلى/من التنفيذ دون الحاجة إلى البحث يدويًا عنه.

الميزة الأكثر فائدة التي توفرها `fix_extra_refs` هي أنها تحافظ على تزامن المراجع في كل تنفيذ. على سبيل المثال، إذا قمت بتغيير نوع بيانات متغير إلى نوع بيانات فئة (class data type)، ستتعرف `fix_extra_refs` تلقائيًا على هذا التغيير، وستمر بشكل متكرر عبر جميع مواقع الاستدعاء لحل مراجعها، وستتوقف فقط عندما يصبح طابور مواقع الاستدعاء فارغًا.

هناك بعض الميزات الأخرى التي توفرها `fix_extra_refs` مثل:
- الكشف التلقائي عن استدعاءات `_ptmf2ptf()` وحل طريقة استدعائها لكل من الإزاحات وعناوين الدوال الكاملة.
- التعرف على مساحة الاسم (namespace) لاسم دالة غير محلولة (الدوال التي تبدأ بـ FUN_ )، وحلها عن طريق وضع الدالة الهدف في مساحة الاسم الخاصة بها (مثل إضافة مؤشر **this** للفئة المقابلة).

يمكنك العثور على التنفيذ في **utils/references.py**، حيث تقوم `fix_extra_refs` بتحليل عمليات [pcode](https://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/package-summary.html) والبحث عن أكواد `CALLIND` و `CALL`، ثم تحصل على جميع [varnodes](https://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/Varnode.html) المشاركة في العملية، وبمجرد تعريف أحد Varnode، تسترجع [HighVariable](https://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/HighVariable.html) الخاص به لتحديد نوع كائن الفئة، وإذا كان النوع غير معروف (أي لا يبدو أنه بنية فئة)، تقوم بتجاوزه، وإلا فإنها تأخذ اسم الفئة، وتستعرض جدول استدعائها الافتراضي، وباستخدام الإزاحة المقدمة من Varnode، يمكنها جلب استدعاء الطريقة الافتراضية الصحيح وتضع مرجعًا على تعليمة الاستدعاء.```py
fix_extra_refs(toAddr(address))

فيما يلي مثال على مخرجات استخدام fix_extra_refs :

image9

لاحظ أنه نجح في حل الاستدعاءات الافتراضية IOService::isOpen() و OSArray:getNextIndexOfObject() و IOStream::removeBuffer() دون أي تعديل يدوي.

بعد ذلك، سيقوم fix_extra_refs بفك تجميع IOStream::removeBuffer()، والحصول على جميع HighVariables لهذه الطريقة، ثم حل مراجعها مثل الطريقة السابقة... وهكذا. image10

الإصلاح التلقائي لجداول الطرق الخارجية

أعتقد أن كل باحث لديه بعض النصوص البرمجية للتعامل مع هذا الجزء، لأنه السطح الهجومي الرئيسي لـ IOKit، والقيام بذلك يدويًا هو عبء، ويجب أن تتم أتمتته بطريقة تمكن الباحث من التعمق في جداول الطرق الخارجية المتعددة. هناك نصان برمجيان يوفرهما ghidra_kernelcache: fix_methodForIndex.py و fix_extMethod.py. يمكنك تفعيلهما مثل النصوص الأخرى كما هو موضح أعلاه.

الاستخدام: ضع المؤشر في بداية جدول الإرسال الخارجي، قم بتشغيل النص البرمجي: قدم الهدف وعدد المحددات. مثال لـ IOStreamUserClient::getTargetAndMethodForIndex() :

image11

namespace.py : إصلاح مساحات أسماء الطرق …

هذا نص برمجي مفيد لملء نوع الفئة لجميع الطرق التي تمت مواجهتها، وهو تابع لنص extra_refs.py البرمجي من أجل استكشاف الدوال المستدعاة بشكل متكرر وحل مراجعها.

الاستخدام: ضع المؤشر في مخرجات مفكك التجميع للدالة المطلوبة، قم بتشغيل النص البرمجي من شريط الأدوات أو اضغط Meta-Shift-N .

نشر اسم الرمز ونوعه

ghidra_kernelcache يوفر دعم نشر النوع لعمليات Pcode الأساسية، لكنه قد يفشل لبعض المتغيرات التي تستخدم تحويلات معقدة . إذا أراد شخص ما المساعدة، أو أراد البدء في العمل مع الأمور منخفضة المستوى في Ghidra، فهذه هي الفرصة للقيام بذلك. يمكن العثور على التنفيذ في ghidra_kernelcache/propagate.py

تحميل توقيعات الدوال

تحليل ملفات رأس C++ في Ghidra غير ممكن، ووجود توقيعات دوال النواة في kernelcache يمكن أن يحسن أشياء كثيرة في مخرجات مفكك التجميع. على سبيل المثال، لنفترض أننا أضفنا virtual IOMemoryMap * map(IOOptionBits options = 0 );، سيقوم Ghidra تلقائيًا بإعادة كتابة القيمة المعادة إلى مؤشر IOMemoryMap تلقائيًا لكل من تعريف الدالة وتوقيعات الدوال. يمكنك إضافة أي رمز C++ إلى دليل signatures/ مع احترام القواعد النحوية، ويمكنك العثور على توقيعات الدوال المعرفة في هذا الدليل.```c++ // Defining an instance class method IOMemoryDescriptor * withPersistentMemoryDescriptor(IOMemoryDescriptor *originalMD);

// Defining a virtual method, it must start with "virtual" keyword virtual IOMemoryMap * createMappingInTask(task_t intoTask, mach_vm_address_t atAddress, IOOptionBits options, mach_vm_size_t offset = 0, mach_vm_size_t length = 0);

// Defining a structure struct task_t;

// typedef'ing a type typedef typedef uint IOOptionBits;

// Lines begining with '//' are ignored

root@kitploit:~
***الاستخدام***: بعد ترميز النواة، يُوصى بشدة بتشغيل السكربت `load_sigatnures.py` لتحميل جميع توقيعات الدوال المتاحة. كما هو الحال مع معظم الأدوات السابقة، قم بتشغيل هذا السكربت عن طريق إضافته في شريط الأدوات أو من مدير الإضافات أو فقط اضغط **Meta-Shift-S** .

### تحميل الهياكل القديمة:

هذا السكربت مباشر، حيث يستورد جميع الهياكل والفئات وتعريفات الأنواع وتعريفات الدوال وكل شيء يحتوي على `SourceType.USER_DEFINED` من مشروع قديم إلى مشروع جديد.

***الاستخدام***: افتح مشاريع Ghidra القديمة والجديدة على نفس الأداة، وانتقل إلى سكربت [`load_structs.py`](https://github.com/0x36/ghidra_kernelcache/blob/master/load_structs.py)، وضع اسم البرنامج القديم في المتغير **src_prog_string**، والبرنامج الجديد في المتغير **dst_prog_string**، ثم قم بتشغيل السكربت.

## المساهمة
إذا وجدت المشروع ممتعًا وترغب في المساهمة، فقط قم بعمل طلب سحب (PR) وسأقوم بمراجعته، وفي الوقت نفسه، أود رؤية بعض المساهمات في المجالات التالية:
* [ghidra_kernelcache/signatures/kernel.txt](https://github.com/0x36/ghidra_kernelcache/tree/master/signatures): استمر في استيراد دوال نواة XNU، الأمر بسيط جدًا فقط قم بنسخ/لصق تعريف الدالة.
* [ghidra_kernelcache/propagate.py](https://github.com/0x36/ghidra_kernelcache/blob/master/propagate.py): دعم رموز التشغيل غير المعالجة لنشر الرموز بشكل أفضل.

## الإشادة
أود أن أشكر [@s1guza](https://twitter.com/s1guza) على [iometa](https://github.com/Siguza/iometa.git) الرائع الذي يعتمد عليه ghidra_kernelcache.
تنزيل الأداة