Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ida_kernelcache — Инструментарий IDA для анализа кэшей ядра iOS. | Kitploit
Инструменты/GitHubGitHub/cellebrite-labs/ida_kernelcache
Статический анализБезопасность iOSАнализ уязвимостейЭксплуатацияОбратная инженерияОтладчикиМобильная безопасностьАнализ Бинарных Файлов
GitHubcellebrite-labs/ida_kernelcache

ida_kernelcache

Инструментарий IDA для анализа кэшей ядра iOS.

Репозиторий
149299 дней назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

ida_kernelcache: инструментарий IDA для анализа ядерных кешей iOS

Форк Cellebrite

Этот форк обновлён для работы с IDA 9.x / Python 3 / iOS 27.0 beta 1

Исходный README

ida_kernelcache — это модуль IDAPython для IDA Pro, упрощающий работу с ядерными кешами iOS. Модуль предоставляет функции для:

  • Преобразования новых статических tagged-указателей iOS 12 в обычные указатели ядра.
  • Разбора сегмента ядра __PRELINK_INFO в словарь Python.
  • Переименования сегментов в IDA в соответствии с именем расширения ядра, Mach-O сегментом и Mach-O секцией.
  • Преобразования идентифицируемых указателей в некоторых сегментах в смещения IDA.
  • Реконструкции иерархии классов C++ на основе информации OSMetaClass.
  • Символизации таблиц виртуальных методов C++ (как самой vtable, так и её методов).
  • Символизации смещений в секциях __got и функций-заглушек в секциях __stubs.
  • Автоматической генерации структур IDA, представляющих таблицы виртуальных методов C++.
  • Автоматической генерации структур IDA, представляющих классы C++ в ядерном кеше, на основе наблюдаемых паттернов доступа.

Основная функция обработки предназначена для запуска до любого ручного анализа или реверс-инжиниринга. При настройках по умолчанию IDA, как правило, упускает много полезной информации в ядерном кеше. Эти скрипты помогают IDA, используя известную структуру ядерного кеша для автоматического распространения полезной информации.

Помимо стандартной функциональности модуля, ida_kernelcache содержит несколько скриптов, упрощающих анализ ядерного кеша iOS. Например, с помощью скриптов можно автоматически генерировать структуры C, используемые функцией.

Многие методы, используемые в ida_kernelcache, были разработаны для memctl и заимствованы непосредственно из него.

Версии

ida_kernelcache тестировался с IDA Pro 6.95 на ядерных кешах для версий iOS 10.1.1, 11.0, 11.2, 11.3.1 и 12.0 beta. В настоящее время поддерживаются только ядерные кеши Arm64 начиная с iOS 10.

Начало работы

У вас уже должен быть загружен в IDA распакованный файл ядерного кеша. URL для загрузки конкретного 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, предоставляя более удобный API. Особенно полезны is_mapped, read_word, read_struct, force_function и ReadWords. is_mapped проверяет, отображён ли адрес и, опционально, содержит ли он известное значение. read_word считывает слово переменного размера по адресу. read_struct считывает структурный тип в словарь Python или объект доступа Python, что значительно упрощает разбор структур данных. force_function использует несколько приёмов для преобразования адреса в начало функции в IDA. ReadWords — это генератор для итерации по словам данных и их адресам в диапазоне.

  • build_struct: Этот внутренний модуль содержит утилиты для автоматического заполнения структуры IDA на основе последовательности обращений к структуре.

  • class_struct: Этот модуль предоставляет функции для генерации структур IDA, представляющих таблицы виртуальных методов C++ и классы. initialize_vtable_structs сканирует (символизированные) таблицы виртуальных методов и создаёт структуры IDA для хранения указателей на виртуальные методы. выполняет анализ потока данных в виртуальных методах для выявления обращений к полям каждого класса, а затем строит структуры IDA для представления классов. Инструкции, которые, по-видимому, ссылаются на поле, также преобразуются в ссылки на смещения в структуре. Подробнее см. 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 в стандартную форму для использования инструментами фаззинга.

Реконструкция классов

Если вы используете декомпилятор Hex-Rays, одна из наиболее интересных возможностей ida_kernelcache — это автоматическая реконструкция классов C++, которая использует информацию OSMetaClass и анализ потока данных для создания структур IDA, представляющих классы, найденные в ядерном кеше. Эти представления могут значительно улучшить читаемость псевдокода. Чтобы узнать больше, см. статью Reconstructing C++ classes in the iOS kernelcache using IDA Pro.

Новый формат ядерного кеша iOS 12

Начиная с iOS 12, Apple представила новый формат ядерного кеша на некоторых устройствах. Среди прочих изменений указатели ядра в этом новом ядерном кеше помечены для связывания их в список, предположительно для того, чтобы позволить iBoot сдвигать ядро без данных _PrelinkLinkKASLROffsets в словаре prelink. Попытка проанализировать стандартный ядерный кеш, использующий этот формат, в IDA затруднена из-за отсутствующих перекрёстных ссылок. Подробности см. в статье Analyzing the iOS 12 kernelcache's tagged pointers.

Если вы просто хотите снять метки с указателей в ядерном кеше без выполнения какой-либо дополнительной обработки, запустите kc.tagged_pointers.untag_pointers().

Замечание об обобщении

Часть этой функциональности, вероятно, применима более широко, чем только к ядерным кешам Apple (например, анализ vtable и распространение символов, или большинство функций в 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 для разбора plist-файлов в стиле ядра.

  • metaclass: Этот модуль предоставляет функцию initialize_metaclass_symbols, которая добавляет символ для каждого известного экземпляра OSMetaClass.

  • offset: Этот модуль предоставляет функции initialize_data_offsets и initialize_offset_symbols. Первая сканирует сегменты в поисках указателей, которые можно преобразовать в смещения. Вторая символизирует смещения в секции __got каждого kext, если цель смещения имеет символ.

  • segment: Этот модуль предоставляет функцию initialize_segments для переименования сегментов IDA в более полезные. По умолчанию IDA, по-видимому, создаёт имена сегментов, комбинируя предположительный идентификатор пакета с секцией Mach-O, описывающей область. initialize_segments извлекает фактический идентификатор пакета из словаря __PRELINK_INFO и переименовывает каждый сегмент, включая идентификатор пакета, сегмент Mach-O и секцию Mach-O. Это позволяет, например, различать __TEXT.__const и __DATA_CONST.__const. Этот модуль также предоставляет функцию kernelcache_kext (повторно экспортируемую на верхнем уровне) для определения kext, содержащего указанный адрес (только в старом формате ядерного кеша iOS 11 с раздельными kext).

  • stub: Многие kext в ядерном кеше содержат функции-заглушки в секции __stubs, которые переходят к функциям в самом ядре. К сожалению, эти заглушки создают барьер для распространения перекрёстных ссылок и информации о типах. Этот модуль не решает эти проблемы, но он упрощает просмотр заглушек, автоматически переименовывая функции-заглушки так, чтобы было видно имя целевой функции. Заглушки и их цели принудительно преобразуются в функции в IDA, что помогает привести функции в IDA в соответствие с функциями в исходном коде.

  • tagged_pointers: Новый объединённый формат ядерного кеша iOS 12 помечает старшие 2 байта каждого указателя смещением, чтобы связать указатели в список. Этот модуль содержит функции для обработки и восстановления таких tagged-указателей.

  • vtable: Этот модуль предоставляет множество полезных функций для работы с таблицами виртуальных методов, включая vtable_length, convert_vtable_to_offsets, vtable_overrides, initialize_vtable_symbols и initialize_vtable_method_symbols. vtable_length проверяет, может ли указанный адрес быть vtable, и возвращает длину vtable. Генератор vtable_overrides перечисляет виртуальные методы в классе, которые переопределяют виртуальные методы, используемые суперклассом. Функция initialize_vtable_symbols добавляет символ для начала каждой идентифицированной vtable. initialize_vtable_method_symbols проходит по переопределённым методам в каждой vtable и распространяет символы от суперкласса к подклассу. Это возможно, потому что большинство базовых классов в IOKit определены в XNU с относительно полной символьной информацией. Каждое переопределение метода в vtable подкласса должно соответствовать тому же интерфейсу, что и метод в суперклассе, а это означает, что мы можем сгенерировать символ для переопределения, подставив имя подкласса вместо имени суперкласса в символе виртуального метода суперкласса. Например, если у нас нет имени для виртуального метода с индексом 7 в классе AppleKeyStore, но мы знаем, что виртуальный метод с индексом 7 в его суперклассе IOService называется __ZNK9IOService12getMetaClassEv, то мы можем предположить, что индекс 7 должен называться __ZNK13AppleKeyStore12getMetaClassEv в подклассе. Этот метод можно использовать для символизации большинства виртуальных методов в большинстве классов.