
Модуль IDAPython для улучшения поддержки C++ поверх ida_kernelcache
Модуль IDAPython, предоставляющий гораздо более удобный способ реверс-инжиниринга кэшей ядра iOS.
Большая часть кэша ядра iOS написана на C++, который компилируется в сложный бинарный код, использующий множество разыменований виртуальных таблиц вместо явных прямых вызовов. ida_kcpp использует преимущество реконструкции иерархии классов из ida_kernelcache. Он сопоставляет IDB и синхронизирует бинарные функции с оригинальными виртуальными методами. Это позволяет навигировать по кэшу ядра iOS двойным щелчком по вызову виртуального метода C++, находить их перекрёстные ссылки и сохранять всё это синхронизированным во время живого исследования.
ida_kcpp вдохновлён ida_medigate, но выигрывает от уникальной структуры кэша ядра iOS и предоставляет более мощную и удобную среду для исследования.

Ни один из них не опубликован на PyPI, поэтому следуйте инструкциям по установке в их репозиториях.
С помощью ida-setup:
ida-setup plugin install -e /path/to/ida-kcpp
Или вручную:
ida_kernelcache и ida_kcpp находятся в пути Python IDA.Также можно добавить, вписав в ~/.idapro/idapythonrc.py:
import sys
sys.path.append(IDA_KCPP_PATH)
sys.path.append(IDA_KERNELCACHE_PATH)
~/.idapro/plugins/ida_kcpp_plugin.py на ida_kcpp_plugin.pyida_kernelcache ещё не запускался, запустите его через edit >> Plugins >> Kernel Cache CPP >> ida_kernelcache process kernelEdit >> Plugins >> Kernel Cache CPP >> Perform Initial sync... (Могут появиться некоторые предупреждающие окна — пока их можно игнорировать). На этом шаге имена виртуальных функций переименовываются путём установки их префикса в соответствии с классом, которому они принадлежат. Этот шаг также декомпилирует все виртуальные функции, устанавливает их аргумент this и изменяет соответствующий член ::vmethods так, чтобы он был указателем на функцию декомпилированного типа. Этот шаг может занять некоторое время...ida_kcpp автоматически распространяет имена и прототипы, а также изменяет некоторые аспекты навигации в IDA, поэтому он не активируется автоматически, но в любой момент может быть активирован или деактивирован.
Активируйте ida_kcpp, нажав edit >> Plugins >> Kernel Cache CPP >> Activate Plugin (это установит хуки Hexrays, а также запустит ida_kernelcache.collect_class_info())
нажмите Edit >> Plugins >> Kernel Cache CPP >> Deactivate Plugin
При переименовании виртуальной функции можно изменить манглированное имя (например, __ZNK10AppleA7IOP9method_86Ev_99) или заменить его на человекочитаемое имя (AppleA7IOP::method_86), которое будет манглировано автоматически. Соответствующий член ANCESTOR::vmethods также будет переименован, а вместе с ним будут переименованы все виртуальные функции, реализующие тот же виртуальный метод.
То же самое относится и к изменению прототипа виртуальной функции. В этом случае прототип соответствующего члена ANCESTOR::vmethods будет изменён на указатель на функцию типа, который только что был задан, с установкой this как ANCESTOR *. Кроме того, прототипы всех соответствующих реализаций виртуального метода у ПОТОМКОВ ANCESTOR будут изменены с установкой их this как DESCENTANT *.
::vmethods.ida_referee, мы можем отслеживать использования каждого поля и особенно члена ::vmethods (виртуальные вызовы) в декомпиляторе.
CTRL+SHIFT+Y для виртуальной функции, чтобы напрямую открывать окно xrefs для соответствующего члена ::vmethod. В IDA есть баг, и это работает только из окна дизассемблера, но не из декомпилятора.Декомпилятор: двойной щелчок по вызову виртуальной функции открывает окно, позволяющее пользователю выбрать реализацию виртуального метода.

Представление Local Types (Shift+F1):
Cmd+Enter на виртуальном методе также переходит к реализации (более чистый вариант по сравнению с двойным щелчком)::, не выполнял переход.Авторы: Uriel Malin, Ievgen Solodovnykov и Omer Porzecanski из Cellebrite Labs. Разработано и протестировано для IDA 9.2 на macOS с Python 3.13