四、iOS签名机制 和 证书
- 4.1、iOS签名机制 的简单介绍
- iOS签名机制的作用
答:保证安装到用户手机上的APP都是经过Apple官方允许的 - 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件(自己Mac 电脑的公钥,一般我们从钥匙串获取的)
- 获得ios_development.cer\ios_distribution.cer证书文件(自己电脑的公钥被苹果server端的私钥加密后的证书)
- 注册device、添加App ID(配置的一些信息)
- 获得*.mobileprovision文件(配置文件)
- 4.2、
certSigningRequest
、.cer
、.mobileprovision文件
究竟里面包含了什么?有何用处?
4.3、iOS签名机制 – 生成Mac设备的公私钥
CertificateSigningRequest.certSigningRequest文件:就是Mac设备的公钥
4.4、iOS签名机制 – 获得证书
ios_development.cer
、ios_distribution.cer
文件:利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
4.5、iOS签名机制 – 生成mobileprovision(配置文件)
4.6、iOS签名机制 - AppStore
- 如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
- 它的验证流程会简单很多,大概如下所示
五、重签名
- 5.1、重签名的简单介绍
- 如果希望将破坏了签名的安装包,安装到非越狱的手机上,需要对安装包进行重签名的操作
- 注意:
- 安装包中的可执行文件必须是经过脱壳的,重签名才会有效;
- .app 包内部的所有动态库( .framework、.dulib)、AppExtension(PlugIns文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名
- 重签名打包后,安装到设备的过程中,可能需要经常查看设备的日志信息
- 程序运行过程中:
Window
->Devices and Simulators
->View Device Logs
- 程序安装过程中:
Window
->Devices and Simulators
->Open Console
- 5.2、重签名步骤
- 准备一个
embedded.mobileprovision
文件(配置文件
)(必须是付费证书产生的,appid、device一定要匹配),并放入 .app 包中
- 可以通过 Xcode 编译来自动生成,然后在编译后的 APP 包中找到
- 可以去开发者证书网站生成下载
- 从 embedded.mobileprovision 文件中提取 entitlements.plist 权限文件
// 第一步 security cms -D -I embedded.mobileprovision > temp.plist // 第二步 /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
- 查看可用证书
security find-identity -v -p codesigning
- 对.app内部的动态库、AppExtension 等进行签名
codesign -fs 证书ID xxx.dylib
- 对 .app 包进行签名
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
- 5.3、重签名 GUI 工具
- 第一种:iOS App Signer(推荐)
可以对.app
重签名打包成ipa
,需要在.app
包 中提取对应的embedded.mobileprovision
文件 - 第二种:iReSign
可以对 ipa 进行重签名,需要提供entitlements.plist
、embedded.mobileprovision
文件的路径
- 5.4、通过 Theos 开发的动态库插件(dylib)
我们在 Theos 开发的 动态库卡插件
重签名的app要是破壳的
5.5、动态库注入(或者是动态库的插入)
- 可以使用 insert_dylib 库将动态库注入到 Mach-O 文件中
- 下载好,打开,编译后把文件放在
/usr/local/bin
目录下
用法
insert_dylb 动态库加载路径/动态库 Mach-O文件
,例如
insert_dylib @executable_path/动态库插件 Mach-O文件
- 有 2 个经常用参数选项
--weak
即使动态库找不不到也不会报错--all-yes
后面所有的选择都为 yes
insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak
insert_dylib
的本质是往 Mach-O 文件的 Load Commands 中添加了一个LC_LOAD_DYLIB
或LC_LOAD_WEAK_DYLIB
- 在最后加上可执行文件的名称,把之前的可执行文件给替换掉,生成新的可执行文件
insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak Mach-O文件
可以通过 otool 查看 Mach-O 的动态库依赖信息:otool -L Mach-O文件
或者 otool -L 动态库文件
5.6、更改动态库加载地址
- 可以使用 install_name_tool 修改 Mach-O文件中动态库的加载地址
install_name_tool -change 旧地址 新地址 Mach-O文件或者动态库文件
,如下
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
- 通过 Theos开发的动态库插件(dylib)
- 默认都依赖于
Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
- 如果将要动态库插件打包到 ipa 中,也需要将
CydiaSubstrate
打包到 ipa 中,并且修改下 CydiaSubstrate 的加载地址 @Loader_path
- 2 个常用环境变量
@executable_path
代表可执行文件所在的目录@loader_path
代表动态库所在的目录
- 5.7、动态库插件安装未越狱手机上总结,以为
爱奇艺
安装插件为例,步骤如下
- 第 1 步:使用越狱手机下载
爱奇艺
, 获取砸壳爱奇艺 app,我们这里使用 Clutch 工具
第 2 步:使用 Theos 开发的动态库插件(dylib) , 并开发插件
- 使用 Reveal 找到要 hook 的控制器,比如 爱奇艺的首页
QYRecomChannelViewControllerV3
编写 Hook代码,在爱奇艺的首页 弹个提示框即可
把动态库运行在 越狱手机上,并获取动态库
cd 进入 Tweak.x 所在的文件夹下 make clean make make package make install
上面的步骤执行完,获取动态库
第 3 步:拿到动态库依赖的 CydiaSubstrate
默认都依赖于 Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
- 第 4 步:获取一个包含 未越狱手机的 embedded.mobileprovision 文件(配置文件)
- 可以通过 Xcode 编译来自动生成,然后在编译后的 APP 包中找到
- 可以去开发者证书网站生成下载
- 第 5 步:把 动态库插件、embedded.mobileprovision 文件、CydiaSubstrate 文件 放到 爱奇艺破壳后的包里
第 6 步:动态库插件的插入,使用工具 insert_dylib
insert_dylib @executable_path/动态库插件 Mach-O文件 --all-yes --weak Mach-O文件
- 提示:我们这里指的
Mach-O文件
指的是爱奇艺的可执行文件iQiYiPhoneVideo
- 如:
insert_dylib @executable_path/tweak_iqy.dylib iQiYiPhoneVideo --all-yes --weak iQiYiPhoneVideo
第 7 步:修改 动态库插件中 CydiaSubstrate 的路径
- install_name_tool -change 旧地址 新地址 Mach-O文件或者动态库文件
- 如:
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/CydiaSubstrate tweak_iqy.dylib
第 8 步:证书对 动态库插件和CydiaSubstrate 签名
- 查看可用的证书:security find-identity -v -p codesigning
对我们开发的插件动态库进行签名
codesign -fs 证书ID xxx.dylib
- 对 CydiaSubstrate 进行签名
codesign -fs 证书ID CydiaSubstrate
- 检查我们的 APP 包还有没有其他的动态库,如:.app 包内部的所有动态库( .framework、.dulib)、AppExtension(PlugIns文件夹,拓展名是 appex)、WatchApp(Watch文件夹)都需要重新签名,和我们自己开发的动态库一样需要重新签名
- 第 9 步: 对 .app 包进行签名,推荐我们使用 iOS App Signer 对
.app
包进行重签名
codesign -fs 证书ID --entitlements entitlements.plist xxx.app
- 第 10 步: 安装重签名后的 app 包