应用重签名(本文涉及)无风险,但某信有检测BundId机制,建议不要大号登陆算法
代码签名是对可执行文件或脚本进行数字签名,用来确认软件在签名后未被修改或损坏的措施。和数字签名原理同样,只不过签名的数据是代码而已xcode
2.开发者上传App到App Store时,苹果后台用私钥对App数据进行签名(即先进行Hash获得hash值,再用私钥加密hash值获得“RSAHash”);安全
3.iOS系统下载这个App后,用内置的公钥验证这个签名,若签名正确,那么这个App确定是由苹果后台认证的,而且没有被修改过,也就达到了苹果的需求:保证安装的每个APP都是通过苹果官方容许的。(公钥解密“RSAHash”获得hash1,再对应用包进行相同hash算法获得hash2,验证两次hash值是否相同)bash
可是还有不少需求是不能经过App Store下载这一途径知足的服务器
1.安装包不须要上传到App Store,能够直接安装到手机上微信
2.苹果为了保证系统的安全性,又必须对安装的APP有绝对的控制权app
为了实现这些需求,iOS签名的复杂度也就开始增长了,苹果这里给出的方案是双层签名ide
这里简单梳理了一下iOS的双层签名流程,固然这不是最终的流程,苹果爸爸在这个基础流程上还要加点东西。这个流程中有两个基础角色:Mac电脑、iPhone手机,由于iOS的APP开发环境在Mac系统下,因此这个依赖关系成为了苹果双层签名的基础网站
1.苹果本身有固定的一对公私钥,跟以前App Store原理同样,私钥存储在苹果后台,公钥放在每一个iOS系统中。这里称为公钥A
、私钥A
;在Mac系统中建立CSR
文件时生成非对称加密算法的一对公钥/私钥,这里称为公钥M
、私钥M
;A=Apple M = Macui
2.开发者经过CSR
文件向开发者中心申请证书
3.苹果服务器生成证书
,也就是咱们平时所说的开发者证书
,其原理就是用私钥A
对公钥M
非对称加密。请求到证书
以后,钥匙串访问
就会将证书
与本地私钥M
( 就是咱们所熟知的p12
) 进行相关联
4.当咱们Command+B
生成一个应用时,Xcode就会用本地的私钥M
对这个应用进行签名,同时将证书放到app里面打包成ipa包
5.iPhone手机安装ipa包
6.iOS系统里的公钥A
对证书进行验证
7.验证经过拿到证书
中的公钥M
8.公钥M
验证app的签名。这里就间接验证了这个APP的安装行为是否通过苹果官方容许(这里只验证安装行为,不验证APP是否被改动,由于开发阶段 APP 内容老是不断变化的,苹果不须要管)
3.第一次签名:私钥A->公钥M=>证书
4.第二次签名:私钥M->app=>app
7.第一次验证:公钥A->证书=>公钥M
8.第二次验证:公钥M->私钥M=>结果
当CSR文件建立的时候,会自动生成一对私钥和公钥,私钥存储在Mac上,私钥存储默认存储在登陆钥匙串中,能够在钥匙串的分类钥匙下查看,请求到的证书会包含公钥部分
图中还有一大坨东西是什么?接下来就来介绍它
苹果为了解决应用滥用的问题,因此苹果又加了两个限制
所以才有了Provisioning Profile(描述文件)
描述文件通常包括证书、AppID、设备。当咱们在真机运行或者打包一个项目的时候,证书用来证实咱们程序的安全性和合法性
描述文件是在AppleDevelop网站建立的(在Xcode中填上AppleID它会代办建立),Xcode运行时会打包进入App内。因此咱们使用CSR申请证书时,咱们还要申请一个东西!!就是描述文件!
在开发时,编译完一个App后,用本地的私钥M对这个App进行签名,同时把从苹果服务器获得的 Provisioning Profile文件打包进APP里,文件名为embedded.mobileprovision,把 APP 安装到手机上,最后系统进行验证
前往描述文件目录
$ /Users/**用户名**/Library/MobileDevice/Provisioning Profiles
复制代码
查看描述文件
$ security cms -Di xxx.mobileprovision
复制代码
1.PP助手下载微信(越狱版本)
3.终端进入如图目录查看应用签名信息
$ codesign -vv -d WeChat.app
复制代码
//注意这里要选择iPhone Developer证书
$ security find-identity -v -p codesigning
复制代码
5.查看MachO文件是否加密(步骤3显示包内容后进入当前目录)
//读取MachO信息
$ otool -l WeChat
//读取MachO信息并
$ otool -l WeChat > ~/Desktop/123.txt
//读取MachO中"cry"开头的信息
$ otool -l WeChat | grep cry
复制代码
由于普通帐号不能对插件进行签名,因此须要删除
在包内容
路径中找到Watch
和PlugIns
文件夹直接删除
// 进入FrameWork目录
$ cd Frameworks
// 列举当前FrameWork
$ ls
// 覆盖签名
// codesign -fs "(证书名称)" (FrameWork名称)
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" mars.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" marsbridgenetwork.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" matrixreport.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" OpenSSL.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" ProtobufLite.framework
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" andromeda.framework
复制代码
在包内容
路径下执行$ Chmod +x WeChat
新建工程,真机运行便可获得描述文件
将ipa包中的描述文件
放到微信的包内容
中去
修改微信包内容
中的info.plist->BundleId,改成与描述文件
的BundleId一致
查看原先的描述文件
embedded.mobileprovision并复制相应内容
$ security cms -Di embedded.mobileprovision
利用Xcode新建一个plist文件
以代码形式打开plist文件(open As->Source code)并粘贴相应内容
复制一份与目标.app放于同一目录下
最后一步命令行签名app包
$ codesign -fs "iPhone Developer: 840385400@qq.com (NZJQGFWAYE)" --no-strict --entitlements=ent.plist WeChat.app
复制代码
Xcode界面下shift+cmd+2
调出手机设备
app运行后利用Xcode附加进程
点击“登陆”按钮就能够打印对应信息了
接下来再介绍个骚操做——利用Xcode来使以上繁琐的步骤略微减小
必须是与MachO文件同名工程(工程名相同,BundId无所谓),不然进程不是微信进程
新建WeChat
工程,同上Command+Run
,将描述文件生成一下
复制一个新的越狱包,覆盖掉到原来的ipa包
同本文2-1
同本文2-2
因为是Xcode直接运行,能够经过Debug View查看界面
原本想写的简洁点,但为了让看这篇文章的人有所收获,我仍是一步步操做尽量讲解的详细点。我以为写博客的目的一半是为了积累,另外一半是送人玫瑰,手留余香,但愿对重签名原理这块没怎么接触过的同窗能有个初步认识乃至可以上手操做
下一篇将介绍更骚的重签名操做