通过两个IDAPython插件支持A12 PAC指令和iOS12 kernelcache 重定位
字数 1503 2025-08-20 18:18:17
IDAPython插件支持A12 PAC指令和iOS12 kernelcache重定位教学文档
1. 背景介绍
iOS 12引入了两项重要的安全特性:
- A12芯片的指针认证码(PAC)机制
- 新的kernelcache重定位机制
这些变化使得传统的逆向分析工具如IDA Pro 7.2之前的版本无法正确处理相关指令和数据结构。本文介绍如何通过两个IDAPython插件来解决这些问题。
2. PAC(指针认证码)支持
2.1 PAC概述
PAC是ARMv8.3引入的安全特性,用于保护指针完整性:
- 通过加密签名防止指针篡改
- 使某些漏洞利用变得更加困难
- 苹果在A12芯片上率先实现
2.2 现有解决方案的问题
xerub提供的PAC插件存在以下不足:
- 操作数对齐显示不完美
- 使用C++编写,难以调整
- 与Hex-Rays Decompiler不兼容
特别是Hex-Rays反编译器会将PAC指令视为HINT指令,导致错误的反编译结果。
2.3 改进方案实现
2.3.1 指令选择策略
寻找满足以下条件的现有指令:
- 有两个操作数
- 两者都被使用(CF_USE1 | CF_USE2)
- 只改变第一个操作数(CF_CHG1)
- 不能被Hex-Rays反编译
发现HLT指令意外满足条件,可作为PAC指令的替代。
2.3.2 实现细节
- 为PAC指令添加隐藏的第三个操作数,使其等于第一个操作数
- 使用
ev_emu_insn回调正确处理BRK指令 - 保持与Hex-Rays反编译器的兼容性
2.3.3 插件功能
- 正确显示PAC指令
- 保持操作数对齐
- 不影响反编译结果
- 高性能实现(即使使用Python)
3. iOS12 kernelcache重定位支持
3.1 新重定位机制
iOS12 kernelcache采用类似userland dyld_shared_cache的重定位机制:
- 支持ASLR
- 包含PAC认证信息
- 信息存储在指针未使用的高比特中
3.2 现有解决方案的问题
Brandon Azad的清理工具存在以下问题:
- 不完整,许多指针未被正确清理
- 清理后会丢失重定位和PAC信息
3.3 改进方案实现
3.3.1 逆向策略
- 在kernelcache中搜索
PACIA指令 - 定位重定位处理代码
- 逆向并重新实现重定位逻辑
3.3.2 插件功能
- 自动处理iOS12 kernelcache加载
- 为每个指针添加注释,说明:
- 是否签名
- 如何签名
- 转换为偏移量
- 保留重定位和PAC信息
4. 实现代码
两个插件的代码可在GitHub获取:
- PAC支持插件
- kernelcache重定位插件
5. 使用示例
5.1 PAC指令显示
插件加载后,IDA将正确显示PAC指令如:
RETAAPACIAPACIBSPAUTIZA
5.2 kernelcache分析
加载iOS12 kernelcache后:
- 自动处理重定位
- 虚函数表等指针结构会被正确注释
- 显示PAC保护信息
6. 扩展应用
同样的方法可应用于dyld_shared_cache分析,实现方式与kernelcache类似。
7. 结论
通过这两个IDAPython插件,我们实现了:
- 完整的PAC指令支持
- 正确的iOS12 kernelcache重定位处理
- 与Hex-Rays反编译器的兼容
- 保留所有安全相关信息
这种方法展示了IDA Pro的强大可扩展性,能够快速适应新的处理器特性和文件格式变化。
8. 参考资料
- ARM指针认证文档
- Mark Rutland关于PAC的演讲
- Hex-Rays SDK文档
- 相关GitHub仓库代码