本文测试平台:

  • iPhone5s: iOS 12.5.5(Jailbroken by unc0ver 8.0.2)
  • MacBook Pro (2021): macOS 12.5

本文将主要基于对易校园 App 进行的相关测试分析,文中简写为 yxy

砸壳/脱壳

本文中的砸壳指的是去除 App Store 对应用添加的加密。本文不细探究砸壳原理。

砸壳原理以及手动砸壳推荐参考文章: iOS逆向(11)-砸壳原理剖析,主动加载所有framework

工具

对于不同的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签名证书几种形式:

  1. 免费Apple ID的证书,限制很多。描述文件7天过期以及设备数量限制。
  2. Apple 企业或个人(通过购买或Apple的比赛或活动获取)开发者账号证书,描述文件有宽松一些的期限和数量限制。
  3. 企业证书,自由度最高,拿证书即可无限签名。企业证书可能会被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
2
3
4
/Applications/yxy.app
├── WrappedBundle -> Wrapper/yxy.app (软连接)
└── Wrapper
└── yxy.app (iOS app)

打包好的应用双击运行。如果弹出“yxy供Info用于个人测试目的”对话框,则在设置里隐私设置允许即可。

app中文件的时间/权限属性变动也可能导致无法运行。

因此在从.ipa中提取.app时则需要格外的小心。

笔者在尝试使用 IPA-to-APP-M1 脚本时,发现生成的app包无法运行(如下图)。

无法运行的弹窗

研究了一些时间后,比较稳妥的解决方案是使用 unzip 或解压软件来提取 .app。使用 python 的 zipfile 提取可能会丢失某些关键文件的权限和时间属性信息(尚不确定)。

附:笔者patch后的ios2m1工具,使用 unzip 替换原解压库。

如果测试能够运行,则可以移动至 Applications (应用程序)目录中方便日后使用。

后续注意事项

  • 免费Apple ID单次创建描述文件的过期时间是7天,过期后则不能继续使用,需要重新进行签名步骤。