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

原创 2016年09月23日 10:01:59

“民之失德,乾糇以愆;他山之石,可以攻玉。”- 《诗经》 


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

一、固件下载和解密

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

图1:theiphonewiki.com 维护的 iOS 9.x 版本的固件解密 key

       在图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
 

二、系统库符号提取

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

    步骤如图3所示:

    图 3:dyld_shared_cache_xxx 文件解密方法

       最后得到的目录中就包含了此固件的系统库文件,如 UIKit.framework 等。
 

三、需要说明的地方

       theiphonewiki 上提供的解密 key 并没有 arm64 架构的,如果要解密 iPhone 5s 及以后产品对应的固件,需要通过其它渠道或者自己手动获取解密 key 。关于如何手动获取解密 key,本文并没有涉及,这一话题笔者也还在研究,欢迎大家指正。
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

当程序发生崩溃并有机会获取到崩溃堆栈时,还原崩溃堆栈从而定位错误显得非常重要。用户符号的还原非常简单,因为在打包 APP 时,会生成对应的符号文件(以 .dSYM 结尾)。而对于系统符号,Apple ...
  • crash163
  • crash163
  • 2016年09月23日 10:01
  • 929

iOS越狱原理详解

iOS越狱原理详解 转载文章,链接地址: http://blog.sina.com.cn/s/blog_655dac9e01017wv3.html 如果你看完书中的所有例子,你很可能已经...
  • IDOshi201109
  • IDOshi201109
  • 2016年03月29日 18:43
  • 1967

解密iPhone的固件

前阵子一个朋友开了一个iPhone有关的Wiki,闲暇之余帮忙弄了不少资料上去,也把自己很久以前写的一篇文章重新整理后发上去了。刚开了CSDN博客,不能让它空着,就把那篇文章在这里发一下吧。这篇文章将...
  • XiNGRZ
  • XiNGRZ
  • 2010年02月27日 22:56
  • 5375

FLASH分区图及ROM固件提取、修改及打包

链接: http://www.iytc.net/wordpress/?p=1757 挂载信息: root@K2:~# mount rootfs on / type rootfs (r...
  • zjqlovell
  • zjqlovell
  • 2017年11月29日 08:41
  • 202

iOS开发 - iOS崩溃堆栈信息的符号化解析

我们知道,开发者在使用Xcode开发调试App时,一旦遇到崩溃问题,开发者可以直接使用Xcode的调试器定位分析崩溃堆栈。但如果App发布上线,用户的手机发生了崩溃,我们就只能通过分析系统记录的崩溃日...
  • skylin19840101
  • skylin19840101
  • 2016年08月18日 22:44
  • 545

iPhone开发版本号与固件带号匹配

iPhone固件带号与其手机型号匹配 if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; if (...
  • linfengwenyou
  • linfengwenyou
  • 2015年11月16日 11:24
  • 623

聊聊架构

这篇文章是转来的背景什么是架构师?业内一直没有定论,在前两天『聊聊架构』群的讨论中,来自各大互联网公司的架构师都对自己的工作内容做了总结,然我们还是没有抽象出架构师的定义。反而引来了跟多的问题,比如:...
  • duxingzhe0311
  • duxingzhe0311
  • 2016年04月06日 10:10
  • 2794

windows常用系统库

ws2_32.lib 如果没有链接,会报如下错: error LNK2019: 无法解析的外部符号 __imp__closesocket@4,该符号在函数 _wmain 中被引用 error LNK...
  • bytxl
  • bytxl
  • 2015年05月28日 09:36
  • 1141

iPhone开发者必读:苹果iOS 6固件重点

iOS 6 包含200多项新功能,包括更加智能的“Siri”语音助理、全新的“分享照片流”、惊艳的全景拍照、方便的票卡管理工具 Passbook、蜂窝网络下使用 FaceTime、改进的邮件客户端、采...
  • artwebs
  • artwebs
  • 2013年01月08日 09:38
  • 707

iOS 静态库,动态库与 Framework 浅析

静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我...
  • HX_lei
  • HX_lei
  • 2016年12月15日 17:40
  • 639
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:聊聊从iOS固件提取系统库符号
举报原因:
原因补充:

(最多只允许输入30个字)