iOS砸壳与macOS侧载
本文测试平台:
- iPhone5s: iOS 12.5.5(Jailbroken by unc0ver 8.0.2)
- MacBook Pro (2021): macOS 12.5
本文将主要基于对易校园
App 进行的相关测试分析,文中简写为 yxy
砸壳/脱壳
本文中的砸壳指的是去除 App Store 对应用添加的加密。本文不细探究砸壳原理。
砸壳原理以及手动砸壳推荐参考文章: iOS逆向(11)-砸壳原理剖析,主动加载所有framework
工具
- flexdecrypt 静态 Mach-O 二进制解密工具
- appdecrypt 静态 Mach-O 二进制解密工具,工作原理同 flexdecrypt
CrackerXI+
iOS 端自动砸壳工具, 可以通过添加(如 http://cydia.iphonecake.com 源)安装。动态脱壳,生成 ipa。- 其他老牌的砸壳工具如 Clutch, dumpdecrypted, frida-ios-dump 也能够动态砸壳生成ipa。
对于不同的app应该根据情况来使用工具,并不能保证存在某个万能的砸壳工具。
解密
Clutch
在 iOS12+ 目前不能够良好运作,详见 #233。
由于 yxy 体积较小,使用最简便的砸壳工具 CrackerXI+
直接可以砸壳并打包为 ipa。
对于一些游戏,由于体积庞大,使用动态脱壳工具时可能会出现未响应和闪退,导致脱壳失败。故使用静态脱壳工具,解密应用的所有二进制文件(包含主程序和动态库)。flexdecrypt
运行在 iOS 上,对单一二进制文件进行解密(可以在单主程序和少量动态库的情况下使用)。而 appdecrypt
可以通过指定应用目录进行批处理(包含动态库)。
砸壳的主要目的在于去除二进制文件的加密,是否打包成 ipa 并不关键。如果了解ipa文件结构,自己手动将.app
打包成 ipa 也不是难事。
侧载
下文主要iOS应用在macOS上的侧载,而非 iOS 平台的侧载。iOS的侧载途径繁多而且也有大量的参考资料。
最简单的侧载方式就是使用 sideloadly(使用Apple账号自动重签名和安装),由于其并不开源,也不能清楚研究其运作机理,因此本文不对其探究。下文将介绍手动侧载 app(在启用SIP的情况下)。
重签名
当拿到砸壳后的 .app
, .ipa
后。由于砸壳后的 app 中的文件已经修改过了,原应用的签名也就失效了,应用也无法启动(除非关闭了SIP以及签名验证)。于是,必须在对app进行修改后重新签名。
Apple的签名机制比较复杂,两层签名其中还包含Apple提供的一层签名(这是无法被伪造的)。因此重签名的证书需要通过一些Apple认证的渠道获取。
App签名证书几种形式:
- 免费Apple ID的证书,限制很多。描述文件7天过期以及设备数量限制。
- Apple 企业或个人(通过购买或Apple的比赛或活动获取)开发者账号证书,描述文件有宽松一些的期限和数量限制。
- 企业证书,自由度最高,拿证书即可无限签名。企业证书可能会被Apple吊销,导致签名失效。
后面两种形式不太容易获取,而第一种对于少量使用需求的场景还是可以接受的。
重签名主要使用工具:ios-app-signer。这个软件可以对app的一些属性进行修改、添加描述文件后进行签名,并打包成 ipa。简化了重签名过程中一些繁琐的步骤。
ios-app-signer
工具的主页有对签名过程的说明。 不过,使用时需要注意的一点是,provisioning profile
(描述文件)选项需要设定为具体的描述文件,而不是Re-Sign Only
,否则之后很可能无法运行(运行报错)。如说明中的步骤,可以通过创建一个Xcode项目,配置Signing & Capabilities
选项卡中的Team
, Bundle Identifier
,即可自动创建描述文件(不允许使用与app store中应用相同的id),编译(iOS)后会在描述文件中添加设备绑定。在添加描述文件的同时,application id
会也随之改变。
ios-app-signer
的所实现的功能也可以通过一些Xcode
提供的工具手动实现,比如codesign
。
不过笔者目前还未研究出Sideloadly
全自动重签名实现的方式。根据一些搜寻,推测大概与Apple iCloud协议、”Apple anisette data” 有关。不过另一个较大关联的工具AltSign,用于支持AltStore(用于iOS侧载),可能可以提供一些相关的细节。
app签名后不可再做任何修改,如有修改必须重新签名。
安装与运行
现在我们有了签名后的 .ipa
或 .app
包。.ipa
解压可得.app
(iOS)。
首先,通过双击ipa文件来安装是不可能的。我们知道macOS可以运行.app
包。但是,iOS上的.app
和macOS上的文件结构并不相同,且iOS的app不可直接在macOS运行,二进制可执行文件也不允许直接运行。
不过,iOS的.app
软件包只需要一个Wrapper
(包装),即可在macOS上运行了。
文件结构为:
1 | /Applications/yxy.app |
打包好的应用双击运行。如果弹出“yxy供Info用于个人测试目的”对话框,则在设置里隐私设置允许即可。
app中文件的时间/权限属性变动也可能导致无法运行。
因此在从.ipa
中提取.app
时则需要格外的小心。
笔者在尝试使用 IPA-to-APP-M1 脚本时,发现生成的app包无法运行(如下图)。
研究了一些时间后,比较稳妥的解决方案是使用 unzip
或解压软件来提取 .app
。使用 python 的 zipfile
提取可能会丢失某些关键文件的权限和时间属性信息(尚不确定)。
附:笔者patch后的ios2m1工具,使用 unzip
替换原解压库。
如果测试能够运行,则可以移动至 Applications
(应用程序)目录中方便日后使用。
后续注意事项
- 免费Apple ID单次创建描述文件的过期时间是7天,过期后则不能继续使用,需要重新进行签名步骤。