Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
ida_kernelcache — 一个用于分析 iOS kernelcache 的 IDA 工具包。 | Kitploit
工具/GitHubGitHub/cellebrite-labs/ida_kernelcache
静态分析iOS安全漏洞分析漏洞利用逆向工程调试器移动安全二进制分析
GitHubcellebrite-labs/ida_kernelcache

ida_kernelcache

一个用于分析 iOS kernelcache 的 IDA 工具包。

查看仓库
14929228天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

ida_kernelcache:用于分析 iOS 内核缓存的 IDA 工具包

Cellebrite 分支

此分支已更新,可在 IDA 9.x / Python 3 / iOS 27.0 beta 1 上使用。

原始 README

ida_kernelcache 是一个用于 IDA Pro 的 IDAPython 模块,旨在简化对 iOS 内核缓存的处理。 该模块提供以下功能:

  • 将 iOS 12 新增的静态标记指针转换为普通内核指针。
  • 将内核的 __PRELINK_INFO 段解析为 Python 字典。
  • 根据内核扩展名称、Mach-O 段和 Mach-O 节重命名 IDA 中的段。
  • 将某些段中可识别的指针转换为 IDA 偏移量。
  • 基于 OSMetaClass 信息重建 C++ 类层次结构。
  • 为 C++ 虚方法表(包括虚表本身及其方法)添加符号。
  • 为 __got 节中的偏移量和 __stubs 节中的桩函数添加符号。
  • 自动生成表示 C++ 虚方法表的 IDA 结构体。
  • 根据观察到的访问模式自动生成表示内核缓存中 C++ 类的 IDA 结构体。

主处理函数被设计为在任何手动分析或逆向工程之前运行。在默认设置下,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 的内核缓存进行了测试。目前仅支持 iOS 10 及更高版本的 Arm64 内核缓存。

快速开始

你需要先将一个已解压的内核缓存文件加载到 IDA 中。你可以上网查找从 Apple 下载特定 IPSW 的 URL,并且有许多公开工具(包括 memctl)能够解压内核缓存。

在 IDA 中,从菜单栏选择“文件”->“脚本文件...”,然后选择主目录中的 ida_kernelcache.py 脚本。这会将 ida_kernelcache 模块以名称 ida_kernelcache 和 kc 加载到 IDAPython 解释器中。在 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: 此模块提供用于生成表示 C++ 虚方法表和类的 IDA 结构体的函数。initialize_vtable_structs 扫描(已符号化的)虚方法表,并创建用于保存虚方法指针的 IDA 结构体。initialize_class_structs 对虚方法执行数据流分析,以识别对每个类字段的访问,然后构建表示这些类的 IDA 结构体。看起来引用某个字段的指令也会被转换为结构体偏移引用。有关更多详细信息,请参阅模块文档字符串。

其他脚本

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 无需 prelink 字典中的 _PrelinkLinkKASLROffsets 数据即可对内核进行滑动(slide)。在 IDA 中尝试分析使用这种格式的原始内核缓存很困难,因为缺少交叉引用。有关详细信息,请参阅文章 Analyzing the iOS 12 kernelcache's tagged pointers。

如果你只想取消内核缓存中指针的标记而不执行任何额外处理,请运行 kc.tagged_pointers.untag_pointers()。

关于通用性的说明

其中一些功能可能不仅仅适用于 Apple 内核缓存(例如,虚方法表分析和符号传播,或 ida_utilities.py 中的大部分函数)。尽管如此,我还是将导入范围限制为仅导入 ida_kernelcache 模块,因为我尚未在其他类型的二进制文件上测试过这些功能。

许可证

ida_kernelcache 根据 MIT 许可证发布。

ida_kernelcache 中的许多功能借鉴自 memctl,后者同样根据 MIT 许可证发布。其他来源在对应文件的注释中注明。


Brandon Azad

下载工具
  • classes: 此模块定义了 ClassInfo 类型,该类型保存有关内核缓存中 C++ 类的信息,并提供 collect_class_info 函数来扫描内核缓存中的类,并在全局 class_info 字典中填充从类名到 ClassInfo 对象的映射。ClassInfo 类型记录每个 C++ 类的类名、OSMetaClass 实例、虚方法表和父类名称。此外,每个 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 函数。前者扫描各段,查找可转换为偏移量的指针。后者为每个 kext 的 __got 节中的偏移量添加符号(如果偏移量的目标具有符号)。

  • 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 拆分 kext 的内核缓存格式)。

  • stub: 内核缓存中的许多 kext 在 __stubs 节中包含桩函数,这些函数会跳转到内核主体中的函数。遗憾的是,这些桩函数为交叉引用和类型信息的传播造成了障碍。该模块并不能解决这些问题,但通过自动重命名桩函数使目标函数名称可见,从而让查看桩函数变得更容易一些。桩函数及其目标在 IDA 中被强制转换为函数,这有助于使 IDA 中的函数与原始源代码中的函数对应起来。

  • tagged_pointers: 新的 iOS 12 合并式内核缓存格式会为每个指针的高 2 个字节标记一个偏移量,以便将这些指针在列表中链接起来。此模块包含用于处理和还原这些标记指针的函数。

  • 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 中定义的,带有相对完整的符号信息。子类虚方法表中每个覆盖的方法必须与父类中的方法保持相同的接口,这意味着我们可以通过将父类虚方法符号中的父类名称替换为子类名称,来为覆盖方法生成符号。例如,如果我们在 AppleKeyStore 类中的索引 7 处没有虚方法名称,但我们知道其父类 IOService 中索引 7 处的虚方法叫做 __ZNK9IOService12getMetaClassEv,那么我们可以推断子类中索引 7 处应该叫做 __ZNK13AppleKeyStore12getMetaClassEv。这种技术可用于为大多数类中的大多数虚方法添加符号。