为了方便广大网友手动砸壳和鉴于目前 PP 助手已经下载不到脱壳的应用还有 itunes 新版本也不支持下载 ipa 了,所以个人跟朋友一起只做了,自动化免费砸壳平台 - www.dumpapp.com ,希望多多支持。
一、iOS 签名机制的目的
在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三方软件难以控制,盗版流行。
苹果希望解决这样的问题,在 iOS 平台对第三方 APP 有绝对的控制权,一定要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过签名机制。
二、iOS 签名机制的实现
1. iOS 上架 APP,签名证书的过程
(1)生成 CertificateSigningRequest.certSigningRequest
文件
(钥匙串 --- 从证书颁发机构请求证书 ---- 生成)
(2)获得 ios_development.cer / ios_distribution.cer
证书
(需要上传 CertificateSigningRequest.certSigningRequest
文件)
(3)注册设备,添加 Appid (生成描述文件的准备)
(4)获得 *.mobileprovision
文件
(需要选择 appid
,devices
,cer证书
等文件)
2. iOS APP 签名流程图
(1)iOS 签名 通过Mac 公钥
和 Apple 私钥
进行加密生成公钥证书
。
(2)然后加上 appid
,devices
,cer 证书
,entitlements
然后再次用 Apple 私钥
进行加密 生成 mobileprovision
文件
(3)然后 再加上 APP 二进制的 签名
和 APP 二进制
,最后就是最终ipa
安装包的组成。
三、iOS 签名 APP 的组成
1. cer 证书的生成与组成
(1)生成Mac设备的公私钥(通过证书助理)
生成 CertificateSigningRequest.certSigningRequest
文件
(钥匙串 --- 从证书颁发机构请求证书 ---- 生成)
(2)获得证书
从开发者平台 上传Mac电脑生成的 CSR 文件
,获得 ios_development.cer / ios_distribution.cer
证书
总结 - cer 证书的组成
- 证书 = 利用
Apple 后台的私钥
,对Mac 设备生成的公钥
进行签名
后的生成的cer 证书文件
- Mac公钥 =
CertificateSigningRequest.certSigningRequest
- Apple私钥 =
Apple后台生成
。
2. mobileprovision 描述文件的生成
(1)从开发者平台 选择 appid
+ devices
+ 证书
生成的 描述文件
(2)mobileprovision 证书的组成
Mobileprovision = 证书
+ devices
+ appid
+ entitlements
+ Apple私钥加密签名
总结 App 构成
APP = APP
+ Mac私钥加密签名
ipa安装包 = APP
+ mobileprivision
AppStore 的下载安装验证
如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision
文件的
它的验证流程会简单很多:直接用 Apple的公钥
去验证 签名
然后获取到 APP
。
四、如何手动重签名一个 APP
1. 为什么需要重签名
一旦改变了应用的二进制文件,或者增加修改了里面的资源,或者修改了包名 等,应用本身的签名就会被破坏。
如果还要想将修改后的 ipa 安装到手机上,就需要对应用做重签名,让 ipa 包和签名保持一致。
(其实就是手动完成 Xcode 签名)
当然如果是越狱手机在 cydia
中安装了 appsync
插件后也可以去掉苹果的签名验证,进行随意安装 ipa。不过大多数人的手机都是非越狱的,所以想要修改 ipa 就必须重签名操作。
2. ipa 包中 需要重签名的文件
.app 包内部的所有动态库(.framework、.dylib)、AppExtension(PlugIns文件夹,拓展名是appex)、WatchApp(Watch文件夹)都需要重新签名。
一般 PlugIns 和 Watch 文件夹 可以进行删除操作。
3. 重签名的步骤 - 概述版
- 下载 ipa,对
ipa 进行脱壳
,解压 ipa 得到Payload
文件夹(确保 ipa 是脱壳后的才能进行重签名) - 进入 Payload 中的
.app
文件夹中,删除PlugIns
和Watch
文件夹(如果有这两个文件夹的话无法进行签名,需要进行删除) - 删除
info.plist
中的UISupportedDevices
字段(如果有此字段会存在安装 ipa 失败的情况) - 如果有需要,修改
BundleId
或者包名字,或者针对app 进行逆向hook 注入动态库
修改。 - 使用
security
命令获取当前证书的序号
,然后获取对应证书的mobileprovision
文件。 - 获取
mobileprovision
文件中 的entitlements.plist
放到.app 同级目录
下。 - 使用
codesign
命令 对 APP 中资源framework
等进行签名
。 - 使用
codesign
命令,对整个.app 文件 用entitlements.plist
进行重签名。 - 使用 zip 命令 打包
Payload
为.ipa
文件。
使用
个人证书
重签名的时候,必须保持 重签名包 info.plist 里的 bundleid 和 描述文件生成中的 bundleid 一致。
4. 重签名步骤 - 简化版
(1)准备一个embedded.mobileprovision文件(appid、device一定要匹配),并放入.app包中
可以通过
Xcode自动生成
,然后在编译后的APP包中
找到。或者在开发者证书网站
生成下载。
(2)从embedded.mobileprovision文件中提取出entitlements.plist权限文件
security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
(3)查看可用的证书
security find-identity -v -p codesigning
(4)对.app内部的动态库、AppExtension等进行签名
codesign -fs 证书ID xxx.dylib
(5)对.app包进行签名
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
五、重签名的步骤 -- 详细演示操作
下面以 《LIANKS》 这个 app 演示重签名。
脱壳后的 ipa 可从 www.dumpapp.com 进行获取
1. 准备工作
(1)获取 ipa,解压 Payload 文件夹
下载 ipa,对 ipa
进行 脱壳
解压 ipa 得到 Payload
文件夹(需要确保 ipa 是脱壳后的才能进行重签名)
(2)删除无用文件夹
进入 Payload 中的.app 文件夹
中,删除 PlugIns
和 Watch
文件夹。
如果有这两个文件夹的话无法进行签名,需要进行删除。
rm -r PlugIns
rm -r Watch
(3)删除APP的 info.plist
中的 UISupportedDevices
字段
如果有此字段会存在安装 ipa 失败的情况
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" info.plist
(4)对 ipa 进行修改,破坏签名。
如果有需要,修改 BundleId
或者包名字,或者针对app 进行逆向
hook 修改注入动态库。
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.lianks.client3" Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName 重签名 APP" Info.plist
/usr/libexec/PlistBuddy -c "Set :CFBundleName 重签名 APP2" Info.plist
记住,使用个人证书重签名的时候,必须保持 重签名包 info.plist 得到 bundleid 和 描述文件mobileprovision 生成中的 bundleid 一致。
(5)使用个人证书,新建项目,编译获取证书对应 mobileprovision
新建一个新的项目工程,然后选择对应的 team 生成对应的个人证书
,然后 编译
后进入 Products
下,找到编译后的 .app
进入后,获取对应的 mobileprovision
文件。
获取对应的 mobileprovision
文件后,把 mobileprovision
放到 Payload 文件夹
下。
如果自己手里有 P12 证书 和 对应 mobileprovision 文件,那么可以直接使用对应的mobileprovision 文件,只要确保 证书 和 mobileprovision 文件对应。
获取 mobileprovision
文件中 的 entitlements.plist
放到 .app 同级目录
下。
当对整个 app 进行签名,所以需要用到 mobileprovision 中的 entitlements 描述。
下面演示是如何从 mobileprovision 提取 entitlements.plist
的方法
security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
(6)使用 security
命令 获取当前证书的 ID
。然后获取对应证书的 mobileprovision
文件。
例如证书 ID:D575192406813F8C403E9F419F6C7EB59FE5B6B7
"Apple Development: Dasen Zhang (YL8475CD7Q)"
security find-identity -v -p codesigning
2. 正式开始签名
这个时候我们已经拿到 D575192406813F8C403E9F419F6C7EB59FE5B6B7
证书 ID 和 entitlements.plist
描述文件,然后就可以 对 app 内 framework 等资源进行签名了。
(1)使用 codesign
命令 对 APP 中资源framework,dylib
等进行 签名
。
执行签名命令:
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 *.*
(2) 最后使用 codesign
命令,对整个.app 文件 用 entitlements.plist
进行重签名。
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 --entitlements entitlements.plist HiFi\ Pro.app
(3)对Payload 文件夹进行压缩成 ipa,进行安装测试
压缩完成后,就可以用爱思助手进行安装
zip -ry hifi.ipa Payload
(4) 使用爱思注入进行导入测试
(5)安装成功
这个时候发现能够安装成功,并且名字已经变了,说明我们已经重签名成功了。
六、其它签名方法
对 iOS ipa 进行签名目前已经有很多工具了,其实这些工具底层都是根据手动签名的原理进行了封装和自动化。
iOS App Signer
https://github.com/DanTheMan827/ios-app-signer
- 可以对.app重签名打包成ipa
- 需要再.app包中提供对应的embedded.mobileprovision文件
iReSign
https://github.com/maciekish/iReSign
- 可以对ipa进行重签名
- 需要提供entitlements.plist、embedded.mobileprovision文件的路径
LTResign
https://github.com/gltwy/LTResign
- 可以对ipa进行重签名,一款基于 Python 写的脚本
- 需要提供embedded.mobileprovision文件的路径·