通过两个IDAPython插件支持A12 PAC指令和iOS12 kernelcache 重定位
字数 1503 2025-08-20 18:18:17

IDAPython插件支持A12 PAC指令和iOS12 kernelcache重定位教学文档

1. 背景介绍

iOS 12引入了两项重要的安全特性:

  1. A12芯片的指针认证码(PAC)机制
  2. 新的kernelcache重定位机制

这些变化使得传统的逆向分析工具如IDA Pro 7.2之前的版本无法正确处理相关指令和数据结构。本文介绍如何通过两个IDAPython插件来解决这些问题。

2. PAC(指针认证码)支持

2.1 PAC概述

PAC是ARMv8.3引入的安全特性,用于保护指针完整性:

  • 通过加密签名防止指针篡改
  • 使某些漏洞利用变得更加困难
  • 苹果在A12芯片上率先实现

2.2 现有解决方案的问题

xerub提供的PAC插件存在以下不足:

  1. 操作数对齐显示不完美
  2. 使用C++编写,难以调整
  3. 与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 实现细节

  1. 为PAC指令添加隐藏的第三个操作数,使其等于第一个操作数
  2. 使用ev_emu_insn回调正确处理BRK指令
  3. 保持与Hex-Rays反编译器的兼容性

2.3.3 插件功能

  • 正确显示PAC指令
  • 保持操作数对齐
  • 不影响反编译结果
  • 高性能实现(即使使用Python)

3. iOS12 kernelcache重定位支持

3.1 新重定位机制

iOS12 kernelcache采用类似userland dyld_shared_cache的重定位机制:

  • 支持ASLR
  • 包含PAC认证信息
  • 信息存储在指针未使用的高比特中

3.2 现有解决方案的问题

Brandon Azad的清理工具存在以下问题:

  1. 不完整,许多指针未被正确清理
  2. 清理后会丢失重定位和PAC信息

3.3 改进方案实现

3.3.1 逆向策略

  1. 在kernelcache中搜索PACIA指令
  2. 定位重定位处理代码
  3. 逆向并重新实现重定位逻辑

3.3.2 插件功能

  1. 自动处理iOS12 kernelcache加载
  2. 为每个指针添加注释,说明:
    • 是否签名
    • 如何签名
    • 转换为偏移量
  3. 保留重定位和PAC信息

4. 实现代码

两个插件的代码可在GitHub获取:

  • PAC支持插件
  • kernelcache重定位插件

5. 使用示例

5.1 PAC指令显示

插件加载后,IDA将正确显示PAC指令如:

  • RETAA
  • PACIA
  • PACIBSP
  • AUTIZA

5.2 kernelcache分析

加载iOS12 kernelcache后:

  1. 自动处理重定位
  2. 虚函数表等指针结构会被正确注释
  3. 显示PAC保护信息

6. 扩展应用

同样的方法可应用于dyld_shared_cache分析,实现方式与kernelcache类似。

7. 结论

通过这两个IDAPython插件,我们实现了:

  1. 完整的PAC指令支持
  2. 正确的iOS12 kernelcache重定位处理
  3. 与Hex-Rays反编译器的兼容
  4. 保留所有安全相关信息

这种方法展示了IDA Pro的强大可扩展性,能够快速适应新的处理器特性和文件格式变化。

8. 参考资料

  1. ARM指针认证文档
  2. Mark Rutland关于PAC的演讲
  3. Hex-Rays SDK文档
  4. 相关GitHub仓库代码
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指令如: RETAA PACIA PACIBSP AUTIZA 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仓库代码