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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
ida_kernelcache — عدة أدوات IDA لتحليل kernelcaches الخاصة بنظام iOS. | Kitploit
أدوات/GitHubGitHub/bazad/ida_kernelcache
أمان الأنظمة المدمجةالتحليل الثابتأمان iOSتحليل الثغرات الأمنيةالهندسة العكسيةمصممي الأخطاءأمن الجوالتحليل الملفات الثنائيةتحليل البرامج الثابتة
GitHubbazad/ida_kernelcache

ida_kernelcache

عدة أدوات IDA لتحليل kernelcaches الخاصة بنظام iOS.

30585منذ 6 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

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

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

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

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

ida_kernelcache: مجموعة أدوات IDA لتحليل نوى iOS (kernelcaches)

ida_kernelcache هي وحدة IDAPython لـ IDA Pro بهدف تسهيل العمل مع نوى iOS (kernelcaches). توفر الوحدة دوال من أجل:

  • تحويل المؤشرات الثابتة الموسومة (static tagged pointers) الجديدة في iOS 12 إلى مؤشرات نواة عادية.
  • تحليل مقطع __PRELINK_INFO الخاص بالنواة إلى قاموس Python.
  • إعادة تسمية المقاطع في IDA وفقًا لاسم امتداد النواة، ومقطع Mach-O، وقسم Mach-O.
  • تحويل المؤشرات القابلة للتحديد في بعض المقاطع إلى إزاحات (offsets) في IDA.
  • إعادة بناء التسلسل الهرمي لفئات C++ بناءً على معلومات OSMetaClass.
  • ترميز جداول الدوال الافتراضية C++ (كل من الجدول نفسه ودواله).
  • ترميز الإزاحات في أقسام __got ودوال الوصلات (stubs) في أقسام __stubs.
  • توليد هياكل IDA تلقائيًا تمثل جداول الدوال الافتراضية C++.
  • توليد هياكل IDA تلقائيًا تمثل فئات C++ في النواة استنادًا إلى أنماط الوصول المرصودة.

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

بالإضافة إلى الوظائف الأساسية في الوحدة، يحتوي ida_kernelcache على عدة برامج نصية لتسهيل تحليل نوى iOS. على سبيل المثال، يمكنك استخدام البرامج النصية لتوليد هياكل C المستخدمة بواسطة دالة ما تلقائيًا.

العديد من التقنيات المستخدمة في ida_kernelcache طُوّرت من أجل memctl واقتُبست منه مباشرة.

الإصدارات

تم اختبار ida_kernelcache مع IDA Pro 6.95 على نوى (kernelcaches) لإصدارات iOS 10.1.1 و11.0 و11.2 و11.3.1 و12.0 beta. حاليًا، يتم دعم نوى Arm64 فقط من iOS 10 وما بعده.

البدء

يجب أن يكون لديك بالفعل ملف نواة (kernelcache) مفكوك الضغط محمّلًا في IDA. يمكنك العثور على رابط تنزيل ملف IPSW معيّن من Apple عبر الإنترنت، وهناك عدد من الأدوات العامة (بما في ذلك memctl) القادرة على فك ضغط النواة.

في IDA، اختر "File" -> "Script file..." من شريط القوائم، ثم اختر البرنامج النصي ida_kernelcache.py في الدليل الرئيسي. سيؤدي هذا إلى تحميل وحدة ida_kernelcache في مترجم IDAPython تحت الاسمين ida_kernelcache وkc. في موجه IDAPython، اكتب kc.kernelcache_process() واضغط Enter لبدء تحليل النواة. تنفذ هذه الدالة جميع التحليلات الرئيسية التي يدعمها ida_kernelcache. ستستغرق الدالة عدة دقائق أثناء قيام IDA بتحديد وتحليل الدوال الجديدة.

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

وحدة ida_kernelcache

من المفترض أن يتم تحميل ida_kernelcache عبر ida_kernelcache.py؛ الوحدات الفرعية في دليل ida_kernelcache ليست مخصصة للتحميل المباشر. ومع ذلك، يكشف ida_kernelcache عن وظائف العديد من هذه الوحدات الفرعية. إليك ما تفعله كل منها:

  • ida_utilities: تقوم هذه الوحدة بلف بعض دوال IDA لتوفير واجهة برمجية أسهل في الاستخدام. من المفيدة بشكل خاص is_mapped وread_word وread_struct وforce_function وReadWords. تتحقق is_mapped مما إذا كان العنوان مُخططًا (mapped)، وبشكل اختياري مما إذا كان يحتوي على قيمة معروفة. تقرأ read_word كلمة متغيرة الحجم من عنوان. تقرأ read_struct نوع بنية (struct) إلى قاموس Python أو كائن وصول Python، مما يجعل تحليل هياكل البيانات أسهل بكثير. تحاول force_function عدة حيل لتحويل عنوان إلى بداية دالة في IDA. ReadWords هو مولد (generator) للتكرار على كلمات البيانات وعناوينها في نطاق معين.

  • build_struct: تحتوي هذه الوحدة الداخلية على أدوات لملء بنية IDA تلقائيًا استنادًا إلى تسلسل من عمليات الوصول إلى البنية.

  • class_struct: توفر هذه الوحدة دوالًا لتوليد هياكل IDA تمثل جداول الدوال الافتراضية C++ والطبقات. تقوم initialize_vtable_structs بفحص جداول الدوال الافتراضية (المرمزة) وإنشاء هياكل IDA لحفظ مؤشرات الدوال الافتراضية. تقوم بإجراء تحليل تدفق بيانات (data flow analysis) على الدوال الافتراضية لتحديد عمليات الوصول إلى حقول كل فئة، ثم تنشئ هياكل IDA لتمثيل الفئات. يتم أيضًا تحويل التعليمات التي يبدو أنها تشير إلى حقل إلى مراجع إزاحة بنية (structure offset references). راجع docstring الخاص بالوحدة لمزيد من التفاصيل.

برامج نصية أخرى

البرنامج النصي ida_kernelcache_reload.py مطابق لـ ida_kernelcache.py، باستثناء أنه يفرض إعادة تحميل وحدة ida_kernelcache وجميع الوحدات الفرعية. وهو مفيد بشكل أساسي للتطوير.

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

  • find_virtual_method_overrides.py: برنامج نصي للعثور على الفئات المتحدرة من فئة التي تتجاوز دالة افتراضية تحتوي على سلسلة نصية محددة. تتم طباعة التجاوزات المطابقة على وحدة التحكم.

  • populate_struct.py: ملء الحقول لفئة C++ أو بنية C عن طريق إجراء تحليل تدفق بيانات بدءًا من العنوان الحالي.

  • process_external_methods.py: معالجة مصفوفة IOExternalMethod أو IOExternalMethodDispatch إلى نموذج قياسي لاستخدامه بواسطة أدوات التعتيم (fuzzing).

إعادة بناء الفئات

إذا كنت تستخدم مفكك Hex-Rays، فإن إحدى الميزات الأكثر إثارة للاهتمام في ida_kernelcache هي إعادة البناء التلقائي لفئات C++، والتي ستستخدم معلومات OSMetaClass وتحليل تدفق البيانات لإنشاء هياكل IDA لتمثيل الفئات الموجودة في النواة. يمكن لهذه التمثيلات تحسين قابلية قراءة تمثيل الشبه الكود (pseudocode) بشكل كبير. لمعرفة المزيد، راجع المنشور Reconstructing C++ classes in the iOS kernelcache using IDA Pro.

تنسيق نوى iOS 12 الجديد

مع iOS 12، قدمت Apple تنسيقًا جديدًا للنواة على بعض الأجهزة. من بين التغييرات، مؤشرات النواة في هذا التنسيق الجديد موسومة لربطها في قائمة، ويفترض أن ذلك للسماح لـ iBoot بتحريك (slide) النواة دون بيانات _PrelinkLinkKASLROffsets في قاموس prelink. محاولة تحليل نواة أصلية (stock kernelcache) باستخدام هذا التنسيق في IDA صعبة بسبب فقدان المراجع المتبادلة. راجع المقال Analyzing the iOS 12 kernelcache's tagged pointers للحصول على التفاصيل.

إذا كنت تريد فقط إزالة الوسوم (untag) عن المؤشرات في النواة دون إجراء أي معالجة إضافية، قم بتشغيل kc.tagged_pointers.untag_pointers().

ملاحظة حول التعميم

من المحتمل أن تنطبق بعض هذه الوظائف على نطاق أوسع من مجرد نوى Apple (على سبيل المثال، تحليل جداول الدوال الافتراضية ونشر الرموز، أو معظم الدوال في ida_utilities.py). ومع ذلك، قمت بتقييد نطاق الاستيراد على وحدة ida_kernelcache فقط لأنني لم أختبر أيًا من هذا على أنواع أخرى من الملفات الثنائية.

الترخيص

تم إصدار ida_kernelcache بموجب ترخيص MIT.

معظم الوظائف في ida_kernelcache مقتبسة من memctl، والذي تم إصداره أيضًا بموجب ترخيص MIT. مصادر أخرى مُشار إليها في التعليقات في الملفات المقابلة.


Brandon Azad

تنزيل الأداة
initialize_class_structs
  • classes: تعرف هذه الوحدة نوع ClassInfo الذي يحتفظ بمعلومات حول فئات C++ في النواة وتوفر الدالة collect_class_info لفحص النواة بحثًا عن الفئات وملء قاموس class_info العام بخريطة من أسماء الفئات إلى كائنات ClassInfo. يسجل نوع ClassInfo اسم الفئة، ومثيل OSMetaClass، وجدول الدوال الافتراضية، واسم الفئة الأب لكل فئة C++. بالإضافة إلى ذلك، يخزن كل كائن ClassInfo مراجع إلى ClassInfo الخاص بالفئة الأب وClassInfo لجميع الفئات الفرعية المباشرة، مما يسهل فحص التسلسل الهرمي للفئات واجتيازه. تخزن collect_class_info أيضًا مجموعة جميع جداول الدوال الافتراضية في المجموعة العامة vtables.

  • data_flow: تحتوي هذه الوحدة الداخلية على عمليات تدفق البيانات المستخدمة من قبل بقية أجزاء ida_kernelcache.

  • kernel: توفر هذه الوحدة المتغيرين العامين base وprelink_info. base هو العنوان الأساسي لصورة النواة (بداية رأس Mach-O الخاص بالنواة). prelink_info هو قاموس __PRELINK_INFO المُحلَّل.

  • kplist: توفر هذه الوحدة الدالة kplist_parse لتحليل قوائم plists بنمط النواة.

  • metaclass: توفر هذه الوحدة الدالة initialize_metaclass_symbols التي تضيف رمزًا (symbol) لكل مثيل OSMetaClass معروف.

  • offset: توفر هذه الوحدة الدالتين initialize_data_offsets وinitialize_offset_symbols. تقوم الأولى بفحص المقاطع بحثًا عن مؤشرات يمكن تحويلها إلى إزاحات. تقوم الأخيرة بترميز الإزاحات في قسم __got لكل kext إذا كان هدف الإزاحة يحتوي على رمز.

  • segment: توفر هذه الوحدة الدالة initialize_segments لإعادة تسمية مقاطع IDA بحيث تكون أكثر فائدة. افتراضيًا، يبدو أن IDA ينشئ أسماء المقاطع من خلال الجمع بين تخمين لمعرف الحزمة (bundle identifier) وقسم Mach-O الذي يصف المنطقة. تستخرج initialize_segments معرّف الحزمة الحقيقي من قاموس __PRELINK_INFO وتعيد تسمية كل مقطع ليشمل معرّف الحزمة ومقطع Mach-O وقسم Mach-O. هذا يجعل من الممكن، على سبيل المثال، التمييز بين __TEXT.__const و__DATA_CONST.__const. توفر هذه الوحدة أيضًا الدالة kernelcache_kext (المعاد تصديرها على المستوى الأعلى) لتحديد kext الذي يحتوي على العنوان المحدد (فقط على تنسيق نوى iOS 11 المقسمة القديمة).

  • stub: تحتوي العديد من kexts في النواة على دوال وصلات (stub functions) في قسم __stubs تقفز إلى دوال في النواة نفسها. لسوء الحظ، تشكل هذه الوصلات حاجزًا أمام نشر المراجع المتبادلة ومعلومات الأنواع. لا تحل هذه الوحدة هذه المشكلات، لكنها تجعل النظر إلى الوصلات أسهل قليلًا عن طريق إعادة تسمية دوال الوصلات تلقائيًا بحيث يكون اسم الدالة الهدف مرئيًا. يتم تحويل الوصلات وأهدافها قسريًا إلى دوال في IDA، مما يساعد على محاذاة الدوال في IDA مع الدوال في الكود المصدري الأصلي.

  • tagged_pointers: يحتوي تنسيق نوى iOS 12 المدمج الجديد على البايتين العلويين من كل مؤشر موسومين بإزاحة من أجل ربط المؤشرات معًا في قائمة. تحتوي هذه الوحدة على دوال لمعالجة واستعادة تلك المؤشرات الموسومة.

  • vtable: توفر هذه الوحدة العديد من الدوال المفيدة للعمل مع جداول الدوال الافتراضية، بما في ذلك vtable_length وconvert_vtable_to_offsets وvtable_overrides وinitialize_vtable_symbols وinitialize_vtable_method_symbols. تتحقق vtable_length مما إذا كان العنوان المحدد يمكن أن يكون جدول دوال افتراضية وتُرجع طول الجدول. يعدد المولد vtable_overrides الدوال الافتراضية في فئة والتي تتجاوز الدوال الافتراضية المستخدمة من قبل الفئة الأب. تضيف الدالة initialize_vtable_symbols رمزًا لبداية كل جدول دوال افتراضية تم تحديده. تمرر initialize_vtable_method_symbols عبر الدوال المتجاوزة في كل جدول دوال افتراضية وتنشر الرموز من الفئة الأب إلى الفئة الفرعية. هذا ممكن لأن معظم الفئات الأساسية في IOKit معرّفة في XNU بمعلومات رموز كاملة نسبيًا. يجب أن يتوافق كل تجاوز للدالة في جدول الدوال الافتراضية لفئة فرعية مع نفس الواجهة مثل الدالة في الفئة الأب، مما يعني أنه يمكننا توليد رمز للتجاوز عن طريق استبدال اسم الفئة الفرعية محل اسم الفئة الأب في رمز الدالة الافتراضية في الفئة الأب. على سبيل المثال، إذا لم يكن لدينا اسم للدالة الافتراضية في الفهرس 7 في فئة AppleKeyStore، لكننا نعرف أن الدالة الافتراضية في الفهرس 7 في فئتها الأب IOService تُسمى __ZNK9IOService12getMetaClassEv، فيمكننا إذن استنتاج أن الفهرس 7 يجب أن يُسمى __ZNK13AppleKeyStore12getMetaClassEv في الفئة الفرعية. يمكن استخدام هذه التقنية لترميز معظم الدوال الافتراضية في معظم الفئات.