在了解iOS的签名机制的基础上,尝试对iOS砸壳应用进行重签名.
准备
- 使用PP助手下载一个砸过壳的应用,这里用QQ做说明;
- 了解codesign, security等命令的使用.
开始
- 使用unzip命令将得到的ipa包进行解压(也可以将后缀名改为.zip直接解压)
#解压到当前的QQ路径中
unzip QQ-8.1.5\(越狱应用\).zip -d QQ
- 查看可执行文件是否加密
#首先进入QQ/Payload/QQ.app
otool -l QQ | grep "cryptid"
输出
#之所以会输出两个是因为该elf可执行文件包含了两个架构指令集(可以使用lipo -info查看)
cryptid 0
cryptid 0
只有cryptid为0,说明可执行文件没有加密才可以重签名.
- 删除文件中不能签名的自定义插件
#首先进入QQ/Payload/QQ.app目录
#1. 删除Plugins目录
rm -rf plugIns
#2. 删除Watch目录,包含有插件
rm -rf Watch
- 对应用中的frameworks进行重签名
#1.查找本机上的可使用开发证书
在Xcode中,查看应用签名所使用的证书teamID(圈圈中的部分)
security find-identity -v -p codesigning | grep "D2J66XK43R"
#在可用列表中选择一个,例如:
certificate="Apple Development: xxxx@yyyy.com.cn (D2J66XK43R)"
#2. 使用该证书对QQ/Payload/QQ.app/Frameworks中的.framework逐个进行签名
codesign -fs $certificate xxxxxxx.framework
- 添加.mobileprovision文件,并创建ent.plist文件.
#1. 创建一个新的项目,例如myQQDemo,工程的bundle identifier为com.recodesign.myQQDemo;
#2. 将新创建的项目进行编译,生成myQQDemo.app,通过"显示包内容"打开myQQDemo.app,找到embedded.mobileprovision文件,将该文件拷贝到在QQ.app中;
#3. 使用以下命令查看描述文件信息;
# 使用以下命令查看描述文件信息;
security cmd -Di embedded.mobileprovision
#4. 将embedded.mobileprovision文件中Entitlements对应的属性字典拷贝出来,并保存为一个新的ent.plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
ent.plist
myQQDemo
Created by Ericydong on 2019/10/17.
Copyright (c) 2019 Ericydong. All rights reserved.
-->
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>6JR32T9222.*</string>
<key>keychain-access-groups</key>
<array>
<string>6JR32T9222.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>6JR32T9222</string>
</dict>
</plist>
- 修改QQ.app/Info.plist中bundle identifier为新建项目的bundle identifier;
#在QQ.app/Info.plist中修改CFBundleIdentifier为新创建项目的bundleid:com.recodesign.myQQDemo.
- 使用权限属性字典给.app包签名
codesign -fs $certificate QQ.app --entitlements=ent.plist
- 将Payload文件夹压缩打包,生成QQ.ipa文件;
zip -ry QQ.ipa Payload
- 使用Xcode安装签名后的应用.
打开Xcode,选择Window-->Devices and Simulators,在 INSTALLED APPS 底部选择+,然后选择新生成的QQ.ipa.不出意外的话,就可以看到手机上新安装的QQ.
登陆报错
完成以上步骤,忍不住激动的心情想要想要登陆一下,然后就:
这是由于QQ开启了bundle id的校验,导致新生的bundle id不能通过验证.只要通过注入代码修改应用内获取bundle identifier的方法,让应用内部获取到QQ原始的应用bundle identifier就可以了.具体的实现下一篇文章 代码注入 里中再具体讨论,敬请关注.