双向验证
首先开发者电脑上有公钥M、私钥M,苹果服务器上有私钥A(Apple),iphone手机上有公钥A,app上会附有app签名和苹果颁发的证书,他的认证过程是这样的:
Mac电脑(开发者)拿着公钥M通过CSR文件向苹果服务器申请证书,会把公钥M发给苹果服务器,然后苹果服务器就会给其返回一个证书,里面附了公钥M和公钥M的hash值,开发的app中附有苹果颁发的证书和通过私钥M的签名文件,当app安装到手机上时,iphone手机通过自身设备的公钥A(和苹果私钥A对应)去验证app中的证书是否合法(是否是苹果认证的),接着通过证书中的公钥M(和私钥M对应)去验证app签名是否有效(合法)双向验证是:iPhone对证书的验证(解密证书)、对app签名的验证(解密app签名)
如果只有双向验证,那么还要APPStore干嘛?用Xcode拿一个证书不就可以安装app了吗?所以苹果还加了两个限制:
第一个限制苹果后台要注册过的设备才能安装、第二个就是签名只能针对某一个具体的app
Xcode在创建项目的时候就会有一个Provisioning.Profile(描述文件)嵌入在app 中里面,有设备立列表、APPID、entitlements(权限文件)
app签名文件在app包内容下面的_Codesignature下面的CodeResources文件和MachO可执行文件内部的Code Signature字段 ,分两大块签名,一个是app包的资源文件的签名、一个是可执行文件的签名。
代码注入
工具:yololib 下载:https://github.com/KJCracks/yololib 编译之后得到yololib可执行文件,可根据自己喜好加入系统路径。
将微信用shell脚本重新签名后在Xcode运行,通过注入动态连接库,注入我们想要的代码(由于硬件原因 未实践)
注入思想:
MachO文件加载动态链接库,LOAD_COMMANDS里面会加载各种链接库,共享库,所以修改MachO文件添加一个framework库,让DYLD自动去加载,达到注入的目的。
1.在工程里面新建一个framework库,命名为hook(名字随便取),在其文件夹下新建OC-class文件命名为hookWeChat ,添加load方法:
build一下,进入app包里面的Frameworks文件夹下有一个hook,说明有这个库了,但是这时候MachO文件里没有,需要将hook这个framework库导入到MachO文件中,用了yololib工具:yololib WeChat Frameworks/hook.framework/hook
执行成功后用MachOview工具看看文件中是否有这个字段
2.替换原来WeChat的可执行文件
替换APP下面的可执行文件,重打包
3.运行
接下来就可以干你想干的事了
限制微信注册功能:将原来的load方法改为:
当点击注册的时候:
后面有机会,自己实现一下!!