偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试

Intro

虽然“只有偏执狂才能够生存”这句话已经被假药停给毁了,但是作为一只有逼格的高大上的iOS逆向分析研究员,难道如果有现成的macOS/iOS全版本镜像可以下载并且无限“漫游”,难道你就不想来一套么?

在本文中,你将能够获得的是:

1.macOS:10.1210.1110.1010.910.810.7:六个版本的虚拟机一键安装; 2 .使用苹果的KDK套件(Kernel Develop Kit)对虚拟机里的macOS Sierra 10.12进行内核调试; 3 .iPhone 4s iOS 9.3.5免shsh降级到iOS 6.1.3iOS 8.4.1 4 .iOS 6、7、8、9、10:全系统越狱;一部4和一部4s,实现iOS 6、7、8、9任意漫游;

六个版本的虚拟机一键安装

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化封装虚拟环境。我们可以通过 Vagrant 封装一个Linux/macOS/Windows的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。

封装好的虚拟机,可以在Vagrant的虚拟机市场上进行分发,供全世界的开发者进行下载。

我们首先来介绍一下Vagrant的虚拟机市场,然后以安装macOS Sierra 10.12为例,阐述虚拟机的一键安装流程。

Vagrant的虚拟机市场

不多说了!放图吧!

相信读者也知道是什么意思!点进去相应链接之后,就会有相应的虚拟机介绍,以及安装方法。

怎么样,很全面吧?笔者已经在这里找到了10.7~10.12的全系虚拟机。

Vagrant和Virtualbox在Win/Linux/macOS全桌面平台都有客户端的,读者自行在其主页下载即可。

“一键安装”macOS Sierra 10.12

首先声明,我说谎了,不是“一键”,而是“两键”。

对的,只要这两句话,就好了。

第一句话运行之后,会在当前目录下自动生成Vagrant的配置文件vagrantfile和文件夹.vagrant。第二句话运行后vagrant就会自动下载安装AndrewDryga/vagrant-box-osx这个虚拟机了,并且在安装完成后在后台打开。使用Virtualbox的控制台就可以看到了。

使用KDK对macOS Sierra 10.12进行内核调试

就拿上文刚刚安装的这个虚拟机来进行内核调试吧!

关机后在“设置”→“网络”里,将“连接方式”改成“桥接网卡”,后续追踪IP时比较容易定位。重启使其生效。

在苹果的开发者下载中心,下载内核调试套件Kernel Debug Kit,这时候首先要确定自己的系统版本,笔者本机是10.12.6,被调试机器的版本比较重要,因为是它来安装KDK,调试机只需要有Xcode顺带的lldb即可。虚拟机系统版本为10.12.2,点击“屏幕左上角黑苹果”→“关于本机”→“系统报告”→左侧下拉选择“软件”,右侧即会出现当前系统的版本号及编译号,笔者为16C67,请见下图。

所以在苹果的开发者中心,也选择下载16C67这个版本,也就是Kernel_Debug_Kit_10.12.2_build_16C67.dmg,请见下图。

在KDK包中包含了大量的调试符号和一些内核驱动模块,可以提供Release、Debug、Development三种模式的连接方式,其中后两种可以提供完整的调试和开发功能,包含了断点和错误检查等调试所必须的功能模块。只有被调试的机器需要安装KDK包,本节中也就是虚拟机需要安装,调试机不需要安装KDK包,调试机中只要有上一章安装好的Xcode自带的lldb即可。

我们把下载好的Kernel_Debug_Kit_10.12.2_build_16C67.dmgscp传输到虚拟机上,在虚拟机上安装。

到桌面上双击dmg文件,里面是一个pkg安装包,双击进行安装即可。

安装完成之后,我们来将虚拟机内的macOS以调试模式来启动,方法就是设置nvramboot-args参数,来达到切换启动模式的目标。在这里稍微介绍一下nvram

一般情况下我们设置nvramboot-args参数只要$ sudo nvram boot-args="-v debug=0x144"这么一行代码就好了,哪怕在VMWare虚拟机中,也是同样的情况。这行代码是将boot-args及其参数写到EFI启动分区去的,VirtualBox的启动分区是不允许内部主机接触的,因此即使执行了这个命令,也不会生效。必须由VirtualBox自己来进行设定。

虚拟机关机之后,我们回到主机上,在主机上运行以下命令:

我们来解释一下这个命令,VBoxManage setextradata很明显是增加虚拟机配置,"macOS_Sierra_10.12.6"是虚拟机的名字,在VirtualBox主界面就能够看到的名字,"VBoxInternal2/EfiBootArgs"就是增加EFI的BootArgs配置,debug=0x141 kext-dev-mode=1 kcsuffix=development pmuflags=1 -v就是我们需要加入的启动参数了,使虚拟机进入调试模式。

顺便介绍另外一个命令:VBoxManage setextradata "macOS_Sierra_10.12.6" VBoxInternal2/EfiGopMode 4可以将虚拟机的显示大小设置为1440x900的分辨率。这里0,1,2,3,4 分别代表了 640x480, 800x600, 1024x768, 1280x1024, 1440x900的分辨率。

接下来就是把系统原来的内核,更换成我们给它下载的这个内核。类似于把汽车的发动机给完整换一套新的,车还能跑,只不过内核已经换了。要换内核,就要把SIP关闭。因为内核是受SIP保护的。在VirtualBox里关闭SIP有一点麻烦,我们快速过一遍。

虚拟机开机后立刻迅速点按F12,进入VirtualBox的BIOS,选择Boot Manager,再选择EFI Internal Shell,进入Shell之后输入FS2:,然后回车,再输入cd com.apple.recovery.boot,回车,再输入boot.efi,然后回车,请见下图。

这样就进入macOS恢复系统了,进入恢复系统之后,在实用工具打开终端,输入csrutil disable,禁用SIP,来禁用SIP。趁着在恢复系统这样的特权模式下,我们把剩下的该做的了也做了吧。

替换内核:

然后清除一下原先的系统缓存。

最后重启,运行reboot命令,可能会等一会儿(大概三五分钟),因为磁盘还没有准备完成。重启之后,系统则开始获得IP,进入等待连接状态,如下图所示。。

VirtualBox有个不好的地方,就是EFI启动引导中允许自定义的参数只有bootargs这一项,而使用csrutil工具来关闭SIP的时候,需要设置csr-active-config参数,也就是说,每次关机后,SIP就又回来了。不过并不影响调试,每次开机按F12,进恢复模式,然后重复以下三个步骤就可以了。

重启后就又进去“崭新”的调试模式了。

我们在调试机器上,使用lldb连上去:

连接成功。被调试机器上显示Connected to remote server

现在就可以开始调试内核了。

iPhone 4s免shsh降级三系统漫游

iPhone 4s的最新版系统是iOS 9.3.5,也就是说不管怎么折腾,都不用担心侧漏了。但是!(敲黑板!)(重点在这里!)苹果为iPhone 4s还保留着iOS 8.4.1iOS 6.1.3的签名,这是官方为版本太旧的机型升到新版本时准备的阶梯版本,比如现在还在iOS 5的用户,他会收到升级到iOS 6.1.3的通知,然后下一步就是升到iOS 8.4.1,最后才是升级到iOS 9.3.5。所以,现在我们就可以利用这个机制,完成iOS 9、6、8三个版本的漫游!。首先使用下面的tsschecker命令来保存这两个版本的shsh2,万一某一天失效了呢?

tsschecker从其官方Github网站上进行下载,4s连接到主机之后,就可以运行上述命令了。

还有就是,想要从9.3.5直接降到旧的版本是不可能的,如果尝试在iTunes里直接恢复iOS 6.1.3的固件,会出现以下提示:

“无法为这个镜像授权”。另外再提一句,在iTunes里进行镜像恢复的方法,win系统在iTunes里按住shift点恢复,选择你下好的ipws文件;Mac系统在itunes里按住option点恢复,选择你下好的ipws文件;当然还是那句话,需要苹果验证服务器的支持。

所以现在我们就来做一点苹果服务器不支持的事情,比如任意版本恢复到iOS 6.1.3

首先在手机上进行iBBS的破解。

将iPhone 4s越狱之后,在Cydia里添加tihmstar的源,地址是:repo.tihmstar.net,在源里安装kDFUApp,点击该App打开。然后从上至下依次勾选上屏幕上的四个选项,注意勾选完第二个选项之后,要等一会儿,等它下载完iBBS之后,才可以继续勾选第三和第四个选项。等ready to enter kDFU mode出现之后,将手机连接到电脑,点击enter kDFU就可以进入DFU模式啦。

DFU模式是比恢复模式处于更加纯净和早期阶段的模式,这时候屏幕是黑色的,iTune会显示检测到处于恢复模式的iPhone。

准备好shsh2和ipsw镜像,安装futurerestore

shsh2可以用上文的命令来获取,ipsw镜像我们还是从ipse.me来获取,futurerestore可以从官方下载链接下载最新的版本。

进行恢复

下载后解压,为futurerestore_macos二进制包增加可执行权限之后,直接运行即可查看其选项。

选择我们需要的--latest baseband--use-pwndfu之后,输入-t来指定上文保存好的shsh2,然后就是输入下载好的ipsw镜像的路径即可。

回车之后即会出现一大堆命令行,注意会出现WARNING和ERRNO等,但是并不影响刷机的过程。

这时候futurerestore会实施shsh2文件的重放(replay attack),模拟本地与服务器的交互流程,让本地“以为”得到了苹果服务器的官方验证,这就是通过重放shsh2来实施的。然后剩下的恢复ipsw镜像的流程,就是普通的恢复流程了。

大概二十分钟左右,手机就恢复好了,进入iOS 6.1.3系统,经测试,可以正常激活使用,与原生没有任何区别。使用p0sixspwn进行越狱后,又可以重复上面的流程,刷入任何保存了shsh2的系统了。

另外,在iOS 6.1.3上进行系统更新时,收到的OTA更新包是iOS 8.4.1,这也验证了上文的说法。请见下图。

当然,iOS 6.1.3iOS 8.4.1都是可以完美越狱的,所以,读者有了iPhone 4s,就等于拥有了三个可以越狱的系统,用来学习是完全足够了。

futurerestore并不是对于所有机型的所有情况都适用,比如说上文针对的就是32位的可越狱机型、并且保存了shsh2的情况才适用。适用降级的型号和情况还是比较复杂的,读者可以阅读项目官网获得详细的介绍。

但是目前,也就是在我们目前的情况下,实现iOS 9、6、8三系统漫游,是毫无压力的。

iOS全版本越狱;一部4和一部4s,实现iOS 6、7、8、9任意漫游

iOS 6、7的越狱就不说了,网上资料多如牛毛;

iPhone 4的最新系统是iOS 7.1.2,可以用盘古越狱进行完美越狱。

另外,iPhone 4的Bootroom是可以破解的,可以进行内核调试,具体可以参考这篇文章1、这篇文章2和这篇文章3。

iOS 10、9、8越狱都是最近放出的(一年之内),现在介绍其流程

iOS 10yalu越狱iOS 9PhoenixiOS 8EtasonJB,这三款越狱的共同点,就是都没能找到代码签名(code sign)的漏洞,只能使用Cydia Impactor手动签名后信任证书进行安装。另外就是yalu越狱只针对64位设备,另外两款则只针对32位设备。

现在以典型的Phoenix越狱为例,介绍其流程:

为什么一遍又一遍地说iPhone 4s呢,因为首先4s的最新版本iOS 9.3.5越狱是最新的,17年8月份才刚刚放出来;其次,iOS 9.3.5是4s支持的最后一个版本,4s与iOS 10无缘;也就是说,不管手上的4s怎么折腾,系统如何损坏,它总能升级到iOS 9.3.5这个可以越狱的版本,免去读者的后顾之忧。

而且32位系统更加适合入门,比64位系统对新手友好很多。

有关iPhone 4s的iOS 9.3.5版本越狱,江湖上还有一段轶事,树人哥(twitter@i0n1c)也一直要出这一版越狱,还搞了一出kickstarter众筹这个版本的越狱,目标金额高达111,111欧元,折合人民币接近百万了。然而不到半个月,越狱就被Siguza和tihmstar免费放出来了,被啪啪啪打脸。

网站上已经写明了完整的越狱流程,请见下图。

同时声明,可能会失败多次,多试几次就好。这版越狱也并不是完美越狱(Semi-untethered),完全关机重启后,需要重新越狱才能回到越狱状态。跟盘古的越狱一样的。这种方式其实有利有弊,对笔者来说其实利大于弊,可以在越狱与正版之间随意切换,非常方便做研究。

按照官网指示,先下载用来越狱的IPA文件,再下载Impactor,选择Mac OS X平台,然后安装。首先验证下载的IPA是不是原封正版:

结果正确,与官网提供的摘要相同。

Impactor的安装过程不再详述,与一般APP无异。接下来将iPhone 4s连接到Mac,如果是虚拟机还需要将USB映射到虚拟机的USB里面,黑苹果则不用。USB连接成功后打开Impactor,该款应用会直接显示连接到的iPhone的ID,如下图所示。

接下来调整好Finder窗口,将刚刚下载的IPA文件,鼠标单击后拖拽到Impactor的界面上去,松开。然后会被要求输入你的Apple ID和密码,ID则是普通的邮箱地址ID;密码不是普通密码,而是专门用来为App进行签名的APP-SPECIFIC PASSWORDS,在AppleID页面的Security栏目下生成和获取,一般为zkxt-svre-beay-edzm形式一串字符串。输入无误之后Impactor开始工作,如果不出意外,Impactor总会有各种问题。比如下图3.1.2c的这个lockdown问题,笔者就是通过重新拔插手机,在手机上重新点击“信任电脑”,在电脑上重新点击“允许访问手机信息”来解决的。

下图3.1.2d则是另外一个问题,显示是权限问题,我的AppleID没有Network Extensions的权限,因此无法签名。其实根本不是这样,在我重启和拔插了数遍之后,可以正常签名。

然后就安装成功了。

接下来在设置→通用→设备管理→开发商应用,选择信任刚刚用来签名的证书。

然后就可以打开这款App了。点击Prepare For Jailbreak,然后Accept,然后Begin Installation,然后Use Provided Offsets,iPhone 4s的偏移已经包括在里面了,所以直接用内置的就好。

事实证明该款越狱并不是很稳定,笔者重启了大概两次,才越狱成功,Cydia最终出现在桌面上。

另外提醒大家,一旦关机或者重启之后,要重新越狱噢。

另外,大家可以查看本书的4.1章节,只要是4s都可以降级到iOS 6.1.3iOS 8.4.1这两个系统,然而这两个系统都是可以完美越狱的,所以只要拥有了4s,就拥有了三个系统,对于学习和研究是足够了。

iPhone 5s iOS 10.2的越狱流程

本次用来实验的机型是A1530 iPhone 5s,系统版本为iOS 10.2(14C92)。

首先下载已经编译好的IPA,因为这种方法是最简单的。

iPhone连接到Mac上,打开Yalu-Jailbreak-iOS-10.2/IPA Build文件夹,将其中ipa文件跟上一章拖到Cydia Impactor上,放开之后输入账号,和App密码,流程与上文一样。

在手机上信任开发者之后,即可打开App了。

这款App在Luca的原装Yalu基础上做了增强,增加了开启Mobile Substrate按钮,并且重新设计了界面UI,寓意苹果专治的统治。

点击Jailbreak Now即可开始越狱!一般情况下,一两次之内可以越狱成功,重启之后Cydia就会出现在桌面上。

总结

要说总结,其实也没啥好总结的,内容都在上面了…那就提前祝大家新年快乐吧!

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2017-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

Mac版Java开发环境配置

1233
来自专栏古时的风筝

webscraper 最简单的数据抓取教程,人人都用得上

这么简单的工具当然对环境的要求也很简单了,只需要一台能联网的电脑,一个版本不是很低的 Chrome 浏览器,具体的版本要求是大于 31 ,当然是越新越好了。目前...

3550
来自专栏前端架构与工程

前后端分离和模块化-58到家微信首页重构之路

微信钱包内的58到家全新首页已经上线,感兴趣的同学们可以在微信中打开“我的->钱包->58到家”查看。 58到家全新首页提出重构主要是为了解决以下问题: 每个城...

2328
来自专栏Jerry的SAP技术分享

给谷歌输入法增添自定义词组,提高输入效率

我在写微信公众号文章时,经常需要重复输入一些名词,比如CRM,C4C,S/4HANA等等。为了减少输入,我在查找一款输入法,能够让我通过少量的输入,就能够快速打...

1061
来自专栏美团技术团队

美团外卖前端可视化界面组装平台 —— 乐高

1 简介 乐高,是美团点评一个快速搭建后台系统页面的平台。名称来源于大家熟悉的丹麦知名玩具品牌,他们的玩具都是通过组合易拆卸、装配的零件,形成最终的作品。经过长...

8584
来自专栏文智的专栏

【 文智背后的奥秘 】系列篇 : 分布式爬虫之 WebKit

WebKit 是由 Apple 公司开发的开源浏览器内核,WebKit 主要分为三个模块:WebCore、JavaScriptCore、平台应用相关Port。相...

2.8K1
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

快速创建React Native App

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 告诉大家一个好消息,为大家精心准备的React N...

4324
来自专栏大数据钻研

大福利!献给网页开发者的20款Firefox插件

毫无疑问,比起其他浏览器,谷歌浏览器虽有着明显的优势,但是它的劲敌火狐却是很多前端攻城师和研发人员的挚爱,为了尽可能地提高用户体验,火狐浏览器的社区在插件开发和...

43611
来自专栏WindCoder

WordPress中通过Ajax评论分页实现方法

一直看着评论一线到底,感觉有点不舒服,看到主题君欲思大大那的评论也分页了,就向大大求援了一下,大大酷酷的回了一句paginate_comments_links函...

2111
来自专栏程序猿DD

如何将Markdown文章轻松地搬运到微信公众号并完美地呈现代码内容

相信有很多童鞋跟我一样,热衷于用Markdown来编写文章。由于其简单的语法和清晰的渲染效果,受到广大码农朋友们的推崇。但是,当我们想维护起自己的公众号时,公众...

4297

扫码关注云+社区