一个 IDAPython 模块,为逆向工程 iOS kernelcache 提供更加便捷的方式。
iOS kernelcache 的很大一部分由 C++ 编写,编译后形成复杂的二进制代码,使用大量虚表解引用而非显式的直接调用。ida_kcpp 利用了 ida_kernelcache 的类层次结构重建功能。它映射 IDB 并同步二进制函数与原始虚方法。它支持通过双击 C++ 虚方法调用来在 iOS kernelcache 中导航、查找其交叉引用,并在实时研究过程中保持所有内容同步。
ida_kcpp 受 ida_medigate 启发,但得益于 iOS kernelcache 的独特结构,提供了更强大、更便捷的研究环境。

两者都不在 PyPI 上,因此请按照各自仓库中的安装说明进行操作。
使用 ida-setup:
ida-setup plugin install -e /path/to/ida-kcpp
或手动操作:
ida_kernelcache 和 ida_kcpp 位于 IDA python 路径中。也可以通过将其添加到 ~/.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 中导航的某些方面,因此不会自动激活,但可以在任何时候激活或停用。
通过点击 edit >> Plugins >> Kernel Cache CPP >> Activate Plugin 来激活 ida_kcpp(这将安装 Hexrays 钩子,并运行 ida_kernelcache.collect_class_info())
点击 Edit >> Plugins >> Kernel Cache CPP >> Deactivate Plugin
重命名虚函数时,可以编辑其经过名称修饰(mangled)的名称(例如 __ZNK10AppleA7IOP9method_86Ev_99),或将其改为人类可读的名称(AppleA7IOP::method_86),后者会被自动进行名称修饰。相关的 ANCESTOR::vmethods 成员也会被重命名,同时所有实现同一虚方法的虚函数也会被重命名。
更改虚函数原型也是如此。在这种情况下,相关的 ANCESTOR::vmethods 成员的原型将被更改为指向刚刚设置的类型的函数指针,并将 this 设置为 ANCESTOR *。此外,ANCESTOR 的所有后代(DESCENDANTS)中所有相关虚方法实现的原型也会被更改,并将其 this 设置为 DESCENTANT *。
::vmethods 成员的交叉引用。ida_referee,我们可以在反编译器中跟踪每个字段的使用情况,尤其是 ::vmethods 成员(虚调用)。
CTRL+SHIFT+Y 热键,可直接打开指向其相关 ::vmethod 成员的交叉引用窗口。IDA 存在一个 bug,此功能仅在反汇编窗口中有效,在反编译器中无效。反编译器:双击虚函数调用会弹出一个窗口,允许用户选择该虚方法的实现。

本地类型视图(Shift+F1):
Cmd+Enter 也会导航到其实现(比双击更简洁的替代方式):: 的结构体名称时不会跳转。由 Cellebrite Labs 的 Uriel Malin、Ievgen Solodovnykov 和 Omer Porzecanski 编写。 针对 macOS 上的 IDA 9.2 与 Python 3.13 开发和测试