一、iOS应用签名原理及过程
iOS应用签名原理.png签名的过程如上图,接下来我们来简单看下描述文件,打开目录:
/Users/xxx/Library/MobileDevice/Provisioning Profiles
随便选择一个证书,用命令查看:
security cms -Di fe1db9ae-746b-49f1-8ff5-0fa8b3ab8483.mobileprovision
找到 entitlements
:
<key>Entitlements</key>
<dict>
<key>keychain-access-groups</key>
<array>
<string>55TKKGAAJQ.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>application-identifier</key>
<string>55TKKGAAJQ.*</string>
<key>com.apple.developer.team-identifier</key>
<string>55TKKGAAJQ</string>
</dict>
这个 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
时,并非安装时就解密(可参考企业包的安装验证过程)。
查看电脑上的证书
命令: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
文件夹下的所有库全部重签。
2.4 确保machO的执行权限。
简单判断可执行权限:预览框中,黑色
,表示可执行;灰色
,表示不可执行(10.15的系统可能看不了)。
也可以通过命令:ls -l Wechat
,查看文件权限。结果可能为:-rw-rw-r--@
或者其他权限。
如果没有可执行权限,也就是 x 权限,可以通过 chmod +x WeChat
添加权限。
2.4.1 Linux 文件权限
Unix
和 Linux
都是多用户、多任务的系统,所以这样的系统里面就拥有了用户
、组
的概念。那么同样文件的权限也就有相应的所属用户和所属组了。
文件类型以及权限:
- 第
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包内。
2、WeChat包内找到 Info.plist
文件,修改Bundle identifier
为com.study.WeChatTest
。
2.6 准备授权文件(Entilements)
利用文章开始我们说的查看描述文件方法,看我们刚刚拷贝到微信包里的描述文件。也就是我们自己空工程生成的描述文件,找到权力文件部分。
打开我们刚刚新建的工程,新建一个
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重签,我们可以看到部分打印,方便我们添加代码运行。
网友评论