一、iOS应用签名原理及过程
iOS应用签名原理.png
签名的过程如上图,接下来我们来简单看下描述文件,打开目录:
/Users/xxx/Library/MobileDevice/Provisioning Profiles
随便选择一个证书,用命令查看:
security cms -Di fe1db9ae-746b-49f1-8ff5-0fa8b3ab8483.mobileprovision
找到 entitlements :
Entitlements
keychain-access-groups
55TKKGAAJQ.*
get-task-allow
application-identifier
55TKKGAAJQ.*
com.apple.developer.team-identifier
55TKKGAAJQ
这个 entitlements 就是权限配置,App重签名会用到。
二、应用重签名
2.1 准备工作
先下载砸壳的应用(业内普遍用WeChat),用 codesign 看下我们准备的应用包:
codesign -vv -d WeChat.app
其中有一项:Authority 就是应用签名,
查看machO文件
machO即Unix可执行文件,我们用otool工具先看一下:
//以下命令可以都可以,我们用第三个
otool -l WeChat //终端直接输出
otool -l WeChat | grep cry //管道输出,grep筛选
otool -l WeChat | grep cry > 文件地址 //输入到文件
cryptid字段: 0 , 代表你下载的是砸过壳的 ;1,也就是加密过的,其实就是 AppStore 使用的非对称性加密 (代码签名)。
注意:App的解密,即签名验证发生在启动App时,并非安装时就解密(可参考企业包的安装验证过程)。
cryptid.png
查看电脑上的证书
命令:security find-identity -v -p codesigning
2.2 删除插件
插件普通账号无法重签,先删除:
1、WeChat 显示包内容,找到 PlugIns 文件夹,直接删除。
2、找到Watch文件夹,这里也有插件,我们暂时不用,删除。
2.3 重签FrameWork
进入FrameWork文件夹
利用codesign,使用自己的证书进行重签名。
命令:codesign -fs "刚刚复制的你自己的证书名字" 要重签的FrameWork名称
例如:codesign -fs "Apple Development: chen_xxxx@xxxx.com (632F4MG322)" OpenSSL.framework
重复操作,把FrameWork文件夹下的所有库全部重签。
codesign.png
2.4 确保machO的执行权限。
简单判断可执行权限:预览框中,黑色,表示可执行;灰色,表示不可执行(10.15的系统可能看不了)。
也可以通过命令:ls -l Wechat,查看文件权限。结果可能为:-rw-rw-r--@ 或者其他权限。
如果没有可执行权限,也就是 x 权限,可以通过 chmod +x WeChat 添加权限。
2.4.1 Linux 文件权限
Unix 和 Linux 都是多用户、多任务的系统,所以这样的系统里面就拥有了用户、组的概念。那么同样文件的权限也就有相应的所属用户和所属组了。
Mac文件属性.png
文件类型及权限.png
文件类型以及权限:
第1段表示文件类型:d,目录;-,文件。
后面三段表示文件权限,对应 [user] [group] [other]
2.1 第2段:文件所有者权限
2.2 第3段:这一组其他用户权限
2.3 第4段:非本组用户权限
文件三个权限为:[read] [write] [execute]
简写及对应数字:r : 4 w : 2 x : 1
二进制表示: 0100 0010 0001
如果一个文件权限为:[–rwxr-xr-x]
User:rwx 4+2+1 = 7
Group:r-x 4+0+1 = 5
Other:r-x 4+0+1 = 5
chmod 755 文件名:该命令设置权限同上。
符号类型:chmod [u、g、o、a] [+(加入)、-(除去)、=(设置)] [r、w、x] 文件名称。(chmod 7 文件名,默认为所有)
2.5 添加描述文件
这个可以借助xcode自动生成一个,当然有的话可以直接用。
1、新建一个空工程跑到手机上,Bundle identifier为com.study.WeChatTest,然后进入app包内找到描述文件,复制到WeChat包内。
embedded.png
2、WeChat包内找到 Info.plist 文件,修改Bundle identifier为com.study.WeChatTest。
2.6 准备授权文件(Entilements)
利用文章开始我们说的查看描述文件方法,看我们刚刚拷贝到微信包里的描述文件。也就是我们自己空工程生成的描述文件,找到权力文件部分。
Entilements.jpg
打开我们刚刚新建的工程,新建一个reInfo.plist文件。Open As -> Source Code,将权利文件内容粘贴进去。
截屏2020-08-18 22.29.14.png
然后将 Info.plist 文件放到 WeChat.app同路径下。
WeChat.png
2.6 重签app包
codesign -fs"Apple Development: chen_xxxx@xxxx.com (632F4MG322)" --no-strict --entitlements=reInfo.plist WeChat.app
2.7 安装到手机
1597761592347.jpg
点击 +,添加重签过得app包,安装到手机。
注意在这一步时,一定要将app包中Info.plist 文件的Bundle identifier 修改。
三、通过Xcode直接安装
3.1 新建同名工程
重复上面的前三步,新建同名工程,即WeChat工程。选择真机,安装到手机上。
不使用同名工程时,每次 build 会重新创建一个 Mach-O,也就是说此时你就算更换了包,但是这个包里有两个 Mach-O,而运行的还会是你自己的空工程,所以在我们已经下载到 ipa 看得到包里的 Mach-O 的情况下,我们就起和它一样的名字就好。
3.2 替换App包
找到上一步重签名的App包,替换我们新建项目的App包。
这个时候,App包里面的Bundle ID还是微信的,不管,直接运行。
直接运行,App正常安装到手机上,大功告成。
总结
前面之所以要自己手动重签名,主要是让我们了解重签名的过程及原理。当然通过Xcode重签,我们可以看到部分打印,方便我们添加代码运行。