导读

0x00.交个朋友

0x01.iOS砸壳历史回顾

0x02.frida-ios-dump简介

0x03.TB插件改造思路

0x04.改造Python代码

0x05.添加GUI交互代码

0x06.复用JavaScript代码

0x07.新鲜出炉TBMachoDumper

0x08.下篇再见

0x09.定制服务

0x0A.关于刘柏江

0x00.交个朋友

Android

PantaWin/PantaMac/PantaLinux;

移动调试器重度用

我们的产品推荐使用git下载和更新,在码云搜索geekneo即可。

0x01.iOS砸壳历史回顾

iOS的第三方App如果是从官方渠道AppStore下载的,那么每一个App包含的MachO可执行文件和动态库均为加密状态,反映到头部数据结构如下:

crackulous一键破解应用(crackup 和crack up使用方法)

cryptid为1代表是加密状态,这样的文件我们是没办法通过IDA静态分析代码的。所以逆向分析目标App的关键一步就是解密这些加密状态的MachO文件。

我研究iOS越狱开发是从iOS 7开始的,到现在iOS 13,一共将近6年时间了。我的感受是,iOS的基础软件架构是几乎没变的,但是基础硬件架构和系统实现策略变化挺大。反映到我们今天聊的砸壳这个话题,那就是一个工具变迁史了。所有的砸壳原理都是一样的,那就是等待dyld加载完目标MachO并且内核已经解密完之后时间拿到代码执行权限,将内存中的原始数据根据上述cryptoff/cryptsize的值覆盖加密数据从而得到解密后的MachO。所有的砸壳方案变化的只是实现策略。

最开始我使用dumpdecrypted.dylib这个github上非常有名的开源砸壳工具,配合DYLD_INSERT_LIBRARIES这个动态库预加载机制,简直好用得不要不要的。但是随着iOS的性和复杂性不断增加,这个库越来越不好用了,比如没办法解密Bundle和Appex文件、沙盒限制、签名限制等等。

dumpdecrypted.dylib不好使了之后,我就通过lldb调试器解密MachO,这个方案用了挺长一段时间。原理就是通过debugserver -x backboard的方式冷启动目标App,然后lldb挂接,通过mem read读取解密后的数据写入临时文件,再通过辅助工具将这些临时数据覆盖至加密文件得到新的解密后文件,将cryptid标志改为0。这样也可以达到砸壳的目的,但是操作步骤实在太繁琐,比如有多个模块需要解密时,那是敲命令敲到手软并且也容易出错。而且这个方案就算封装出一些基于lldb的砸壳脚本,使用门槛也太高,不太方便分享给大多数人用。

再后来偶然发现了AloneMonkey兄弟写的frida-ios-dump,试用了一下,好评如潮,简单、易用、强大、完善。他借助Frida的JavaScript运行时,更完整的实现了解密逻辑,这是迄今为止最完整好用的砸壳方案。期间也看到有朋友在用其他砸壳工具比如AppCrackr、Clutch、Crackulous之类的,我没有用过就不予置评了。

0x02.frida-ios-dump简介

本质上,frida-ios-dump就是借助Frida用JavaScript把上述lldb解密的手动过程自动化了。它的流程如下:

crackulous一键破解应用(crackup 和crack up使用方法)

dump.py获取用户选择的目标App信息,然后加载dump.js并调用Frida拉起目标App远程注入解密脚本。

dump.js做的核心工作就是加载App内的每一个MachO文件,然后逐一dump,而 dump依赖的C函数均通过Frida反射获得,解密利用的原理前文已经表述过了。

0x03.TB插件改造思路

Textobot核心运行时已经包含了完整的Frida、Python,所以我们要改造frida-ios-dump为一个TB插件是非常容易的,90%的代码都可以复用。我们改造的目标如下:

MachO砸壳不依赖电脑;可以可视化操作;

基于上述目标,我们需要将原始的命令行输入改成GUI界面操作,原始的SCP文件传输改成保存在手机本地文件系统。GUI界面操作可以通过Textobot导出的API TB_gui函数来实现。通过这样重构之后,我们就只需要通过Textobot插件管理器就可以在iPhone手机上解密目标App的所有MachO文件了。

0x04.改造Python代码

这里主要是删除frida-ios-dump依赖的SSH/SCP相关的操作,如下图所示代码:

crackulous一键破解应用(crackup 和crack up使用方法)

改成直接存在本地文件系统,如下图所示代码:

crackulous一键破解应用(crackup 和crack up使用方法)

还有一个必须改造的点是删除原始代码的threading.Event同步等待操作,因为Textobot插件是事件驱动的,如果当前运行的Python代码一直不返回,那么将收不到新的事件。

0x05.添加GUI交互代码

本篇文章我们只是简单罗列新添加的GUI交互处理代码,下一篇文章我们详细介绍Textobot插件体系的GUI事件模型。下述代码完成了目标App的选择和调用原始的frida-ios-dump解密入口。

crackulous一键破解应用(crackup 和crack up使用方法)

0x06.复用JavaScript代码

最核心的砸壳工作已经由frida-ios-dump/dump.js帮助我们实现了,我们直接原封不动的使用就好:

crackulous一键破解应用(crackup 和crack up使用方法)

0x07.新鲜出炉TBMachoDumper

TBMachoDumper的插件源码请前往码云,搜索geekneo就可以找到了。有些平台不允许放网址,你懂的。

执行Textobot Editor – Pack命令,我们就得到TBMachoDumper.tb插件,通过Install命令安装至手机,打开Textobot管理器Plugin/Manager选中tbmachodumper,点击Die切换插件状态为Run,我们就可以美滋滋的砸壳了。

crackulous一键破解应用(crackup 和crack up使用方法)

0x08.下篇再见

到此,我们分析了砸壳的原理和历史、frida-ios-dump的流程,罗列了改造的TBMachoDumper核心源码。下一篇我们详细介绍Textobot的GUI事件模型,我敢打赌,这是你迄今为止没看到过的“奇葩设计”,这样的模式估计也只有资深逆向/专家的脑洞能开到这里。届时,朋友们就可以用Python写可交互的iOS越狱插件了,也能看懂TBMachoDumper这样Magic的GUI操作代码了。我们下篇再见。

0x09.定制服务

我们团队虽小,但个个都是一顶三的技术精英,因此技术能力是严重过剩的。所以如果您有关于iOS/Android底层的疑难杂症、云游模拟器挂机/二次开发、晓文/飞度插件定制等方面的个性化需求,欢迎通过私信联系我们。

0x0A.关于刘柏江

8年移动互联网从业经验、精通iOS/Android底层开发/攻防对抗、GikDbg/KiwiVM原作者、几维联合创始人/股东。

我的自媒体账号将围绕PantaEmu、Textobot、Fridobot、LidaDbg为用