聊聊从iOS固件提取系统库符号

当程序发生崩溃并有机会获取到崩溃堆栈时,还原崩溃堆栈从而定位错误显得很是重要。用户符号的还原很是简单,由于在打包 APP 时,会生成对应的符号文件(以 .dSYM 结尾)。而对于系统符号,Apple 并无提供对应的符号文件下载,因此须要本身解析。本文就简单聊聊从 iOS 固件获取系统库符号的方法。python

1、固件下载和解密架构

有不少提供固件下载服务的站点,比较出名的是: theiphonewiki.com 。这个站点同时也维护了用于固件解密的 key
如图1所示:app

图片描述
图1:theiphonewiki.com 维护的 iOS 9.x 版本的固件解密 keyiphone

在图1中,蓝色字体部分表示对应的固件 key 存在,红色字体表示对应的固件 key 暂时不可得,因此 theiphonewiki 上只有极少数的 arm64 版本的固件是能够解密的。工具

固件(以 .ipsw 结尾)文件实际上是一个压缩包,解压后获得的 3 个 dmg 文件中,占用空间最大的那个就包含须要的系统库。而这个文件是 AES 加密的,解密这个须要 Root Filesystem Key。例如,iPhone5,4(即 iPhone 5c )固件的解密 key字体

如图2所示:
图片描述
图2:iPhone5,4 固件的 Root Filesystem 解密 Key加密

获取到 key 后,就可使用 VFDecrypt 工具完成最终的解密,固然也有不少更方便的 UI 集成工具或者 python 脚本,好比:iDecrpyptIt 。spa

2、系统库符号提取图片

从 iPhone OS 3.1 开始,全部的系统库都打包成一个文件:dyld_shared_cache_xxx ,其中 xxx 表示具体的架构,此文件位于:/System/Library/Caches/com.apple.dyld 目录。dyld_shared_cache_xxx 文件的解压可使用 dyld 中的代码,ip

步骤如图3所示:
图片描述
图 3:dyld_shared_cache_xxx 文件解密方法最后获得的目录中就包含了此固件的系统库文件,如 UIKit.framework 等。

3、须要说明的地方

theiphonewiki 上提供的解密 key 并无 arm64 架构的,若是要解密 iPhone 5s 及之后产品对应的固件,须要经过其它渠道或者本身手动获取解密 key 。关于如何手动获取解密 key,本文并无涉及,这一话题笔者也还在研究,欢迎你们指正。

相关文章
相关标签/搜索