在日常正向开发打包提交时,我们都会对应用进行签名,然后上传到App Store。其中签名的这个过程 XCode 已经帮我们做过了,我们只需要配置好证书和描述文件就可以。但是如果我们希望学习其他的应用,进行一些逆向开发,就需要调试其他的应用,而我们首先就需要对这些应用进行重签名。
首先,我们先了解下iOS签名中用到的加密方式,RSA & Hash。
RSA加密:一种非对称加密方式,也叫现代加密(区别与传统的对称加密)。这种方式的加密会生成一对公私钥,如果公钥加密,则用私钥解密,反之亦然。一般情况下,我们自己会保存私钥。
对称加密:通信的两端事先约定好一个密钥,使用密钥对明文进行加密,生成密文的加密方式。这种加密方式的特点是,加密效率高(相对于非对称加密),但一旦密钥泄漏,则安全隐患较大。
Hash:把任意长度的输入通过哈希算法变换成固定长度的输出,得到的结果是128位二进制,即32位16进制字符。Hash的特点是对于相同的数据会得到相同的结果,不同的数据一般会有不同结果(hash冲突除外)。因此,可以作为一种信息摘要,或者信息“指纹”,用来做数据识别。
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:834688868,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
如果你正在面试,或者正准备跳槽,不妨看看我精心总结的面试资料: BAT 大厂最新面试题+答案合集(持续更新中) 来获取一份详细的大厂面试资料 为你的跳槽加薪多一份保障
苹果为了保证安全性,除了对iOS系统做了很多安全的设计外,对于应用的验证及安装渠道的控制也做了很多事情。例如,一个应用如何从App Store下载到安装到手机上,会经历下面几个步骤:
1、苹果会生成一对公私钥,私钥苹果自己保存,公钥内置在iOS设备中
2、苹果对应用进行对称加密和签名,并用私钥对签名信息进行加密
上诉两个步骤在App上架完成前就会完成,以下步骤是下载到手机后发生的
3、应用下载到手机后,iOS系统使用公钥对签名信息验证,如果通过则安装到手机
4、在每次应用运行时,对应用进行解密操作
以上是从App Store下载应用的验证过程,但我们平时开发过程中的应用安装并非从App Store下载,也没有私钥进行加密,苹果会如何进行验证的呢?首先我们可以看下苹果的需求:
1、不需要从AppStore下载也可以安装
2、为了保证系统的安全性,App的安装不能脱离苹果的控制,需要经过苹果允许才可以安装,且不能导致非开发的App被安装
为了实现这一目的,苹果引入了一个双层签名的机制,大致流程如下图:
双层签名流程整理下来步骤如下
1、在 Mac 上生成一对公私钥,记为 公钥M 和 私钥M;将包含 公钥M 的CSR文件上传到苹果服务器
2、苹果对 公钥M 做一次Hash签名,使用 公钥A 对签名信息进行一次加密,生成一个包含 公钥M 和 签名信息的证书
3、为了实现控制安装设备数量等需求,苹果生成一个包含证书、App ID、设备信息的描述文件,并返回给Mac电脑
4、在使用XCode打包过程中,使用先对应用包进行一次签名,再使用 私钥M 对签名信息进行一次加密
5、将应用包、加密签名及描述文件打包成安装包,发送到iOS设备,进行图中的第4步操作
iOS应用重签名:是指对一个应用重新进行签名,使其运行在我们的工程中。
通过上一节关于应用签名原理的介绍,我们发现如果将待签名应用的描述文件替换成我们的描述文件,并使用我们的证书对其再进行一次签名,就可以使得iOS系统认为这是我们自己的工程安装的应用,从而可以对其他应用进行分析与调试。
我们以微信 7.0.8 的安装包为例进行重签。
进行应用重签时,需要注意必须使用已经脱壳的应用进行,否则会签名失败。我们可以使用otool命令查看应用是否加壳
otool -l 应用可执行文件名称
如图所示,cryptid 值为0,表示应用已经脱壳,如果值为1,则表示应用未脱壳。
壳:如2.2节所诉,苹果会对应用可执行文件及资源文件等进行加密,俗称加壳。如果想要重签调试应用,则先要解密,这个过程称为脱壳。
如果使用的WeChat 8.0.2版本,其Framework结构如下图,其中的库文件也均需要重签名
首先使用 security 命令查看电脑上的证书,找到我们自己的证书
security find-identity -v -p codesigning
使用codesign命令进行farmework的重签名(如果是微信8.0.2版本,会有很多dylib的swift库,这些也需要重签,命令与下文一致)
codesign -fs "证书名" 待签文件
5、找到微信的 info.plist 文件,修改bundleId 为我们新建的工程的bundleId
6、查看描述文件,找到授权信息
使用如下命令查看描述文件信息
security cms -Di embedded.mobileprovision (embedded.mobileprovision为描述文件名称)
拷贝 Entitlements 标签下的 dict标签对信息(保存了应用的授权信息),并保存到一个plist文件中
此处为了方便在工程中新建了一个plist文件,也可以在其它地方新建。坑点:注意图中红色标记处可能为 R45LY736NP.*,需要手动将 * 替换成自己的 bundleId(这里替换为 ResignDemo),否则会后续在替换包时会失败,导致无法安装
codesign -fs "证书" --no-strict --entitlement=plist文件名 xxx.app
出现上图的 replacing existing signature 表示重签成功。
如图点击 加号,选择刚刚重签的微信app包,将ResignDemo工程的app包替换成如图所示即可。
本次以微信为例进行了一次重签名实践,总结下主要步骤如下:
1.删除插件和带有插件的.app包(比如Watch)
2.对Frameworks里面的库进行重签名
3.给可执行文件 +x(可执行)权限(一般不需要,如果没有执行权限时,使用 chmod +x 文件名称 添加权限)
4.添加描述文件(新建工程,真机编译得到)
5.替换BundleID
6.通过授权文件(Entilements)重签.app包
以上就是总结的关于应用重签名的实践知识,如果有不正确的或者理解不到位的地方,欢迎大家指正