代码重签名首先还是要了解iOS应用的签名机制。原理就是使用iOS免费的开发证书欺骗手机通过签名验证(告诉手机是我们自己的开发调试应用)。被重签名的应用是越狱 ipa 包或砸壳后的安装包。

1、手动重签名
1.1 查看xxx.app签名信息
解压安装包,Payload 文件夹下找到 xxx.app 文件,查看签名信息。

终端执行命令:
$ codesign -vv -d #.app路径#

%title插图%num
砸壳后的app是没有签名信息的,这样的app我们才能给其重签名,否则的话需要使用工具砸壳。

1.2 查看xxx.app 是否加密
查看安装包是否加密,进入 xxx.app 文件下

%title插图%num

终端执行命令:
$ otool -l WeChat | grep crypt

%title插图%num
1.3 查看本机所有证书文件
查找本机上进行真机调试的证书文件,并记录下与 Xcode 上进行真机调试时相同的证书。

终端执行命令:
$ security find-identity -v -p codesigning

1.4 删除xxx.app 包内影响签名的文件
删除插件PlugIns文件夹里面的内容!
删除Watch文件

%title插图%num

%title插图%num

1.5 重签名动态库
进入到 xxx.app/Frameworks 下,分别对其中包含的动态库进行重签名。所有证书是1.3中查找到的真机调试证书(必须与Xcode中使用的一致)。

执行重签名命令
$ codesign -fs #“证书”# #需要签名的文件#

%title插图%num
此处是四个动态库,不同应用安装包可能包含不同的framework动态库或不存在该文件。

1.6 给可执行文件执行权限
可执行文件就是 xxx.app 包内的 Mach-O 文件。一般与项目的 ipa 包同名。

添加可执行权限命令
$ chmod +x #文件路径#

%title插图%num
1.7 添加描述文件
新建一个iOS工程,真机编译后再Finder中打开 ipa 包,找到embedded.mobileprovision 文件,将其拷贝到重签名应用的 xxx.app 文件内。
将下图中的描述文件拷贝到重签名应用的 app 包内:

%title插图%num

1.8 修改 Bundle identifier
修改重签名应用 Info.plist 文件中 Bundle identifier 的值与新建工程的Bundle identifier 的值一致。

1.9 生成 plist 权限文件
新建一个 plist 文件(此处在Xcode中新建,命名为 tmp.plist)。
查看描述文件,将权限信息拷贝到新建的 tmp.plist 文件中。

%title插图%num

将 tmp.plist 文件拷贝到 xxx.app 的同级目录下(如下):

%title插图%num

1.10 签名整个APP
进入 xxx.app 所在目录,执行签名命令。

%title插图%num

执行命令:
$ codesign -fs #“证书”# –no-strict –entitlements=#plist文件# #xxx.app#

1.11 打包成 .ipa 包
可以使用终端命令打包,也可以压缩成 zip 包修改后缀名为 .ipa

%title插图%num

终端打包命令:
$ zip -ry WeChat.ipa Payload

%title插图%num

1.12 安装重签名应用
使用 Xcode 安装打包好的安装包。
菜单栏:Window ——> Devices and Simulators

%title插图%num

真机验证⬇️⬇️

%title插图%num

2、利用Xcode重签名

利用Xcode对安装包重签名的原理与手动签名一样,但有些步骤 Xcode 替我们完成,简化了手动签名的步骤。具体操作如下:
同样以微信为例,安装包文件名 WeChat.app

新建工程 new.project,真机编译;
Finder 打开app文件,WeChat.app替换原来的 new.app 文件;
修改WeChat.app 文件中 Info.plist —> Bundle identifier 的值;
重签名 WeChat.app 文件中 Frameworks 中的静态文件(参考 1.5);
设置 Mach-O 文件(WeChat)的可执行权限(参考 1.6);
*后编译运行至真机。

3、脚本自动重签名
脚本自动重签名,原理同上。将各步骤使用脚本文件代替执行。
shell 重签名脚本

3.1 直接添加脚本
shell 重签名脚本

新建工程 KYCodeSignature.project;
KYCodeSignature.project根目录下新建文件夹“APP”,将重签名的安装包 xxx.ipa 放到该文件夹夹下;

%title插图%num

在 TARGETS —> Build Phases —> Run Script 中添加脚本命令(如下图);

%title插图%num

编译运行到手机。
3.1 添加脚本文件路径
新建工程 new.project;
给脚本文件添加可执行权限 chmod +x XcodeApp.sh;
在 TARGETS —> Build Phases —> Run Script 中添加脚本文件路径;

%title插图%num

编译运行到手机。