本文只是为了学习理解整个过程和原理,砸壳和重签都有很多种简单快速的方式,本文不探讨
iPhone配置
越狱,本人使用的是iphone6s plus 12.4(非完美越狱),最好是能完美越狱,因为有些工具可能不支持非完美越狱手机,截止2020年底12.2以下均可完美越狱,可在pp助手、爱思助手查看。
- 下载爱思助手,安装并打开后找到
刷机越狱
,选择一键越狱
,在右侧找到CheckRa1n越狱
,按照提示操作,完成之后手机中会多出一个黑色图标的软件CheckRa1n
- 打开
CheckRa1n
,点击安装cydia
,本人在安装过程中一直卡在了Downloading Base system界面不动,最后使用科学上网才安装成功。 - 下载
frida
,打开越狱手机中应用cydia
添加源:https://build.frida.re,然后搜索frida
并安装,根据手机选择frida
版本,6s
选择Frida for pre-A12 devices
Mac配置
- 安装工具
brew install python #安装python
brew install wget #安装wget
#安装pip
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
pip3 install frida #安装frida
pip3 install firda-tools #安装frida命令行工具
- 安装脚本依赖环境下载python3脚本,cd到frida-ios-dump目录,并执行,过程中需要输入电脑密码
sudo pip3 install -r requirements.txt --upgrade
- 安装usbmuxd与手机通信
brew install usbmuxd #安装usbmuxd
连接
- 手机与电脑均配置完成,下面开始通过USB使用ssh连接设备,首先可以通过终端命令检查是否可以工作
frida-ps -U
,若可用会输出PID - Name列表。 - 使用终端将22映射到电脑上的2222端口,也可使用其他端口,但要保证映射和访问时使用同一个,并且dump.py脚本中也要同步进行修改。
iproxy 2222 22
此时终端会输出➜ waiting for connection
,再打开一个终端窗口,使用ssh登录iphone手机
➜ ~ ssh [email protected] -p 2222
[email protected]'s password: #这里密码默认的是alpine
iPhone:~ root#
到了这一步ssh登录成功,下面就可以使用dump.py脚本查看手机里的应用了。
注:我这里使用ssh访问没有成功,折腾半天一直报错
ssh_exchange_identification: read: Connection reset by peer
最终放弃。采用了第二方案,使用爱思助手 --> 打开SSH通道->弹出提示包含端口,密码
,保证dump.py
里面一致即可,随后继续后面的步骤
砸壳
- 如果是新下载的dump脚本,需要在mac用户目录下,先执行一下
source dump.py路径
- 终端查看手机中的应用:
/Users/Mac/frida-ios-dump/dump.py -l
- 在输出的应用中找到要进行砸壳的
bundle Id
:微信 com.tencent.xin
- 创建一个文件夹dump,在dump文件夹下执行砸壳,砸壳生成的ipa将会保存到当前执行目录
- 执行砸壳
➜ dump /Users/Peny/frida-ios-dump/dump.py com.tencent.xin
Start the target app com.tencent.xin
Dumping 微信 to /var/folders/2_/ts8l68y17cncks73d_vjz4vh0000gn/T
[frida-ios-dump]: OpenSSL.framework has been loaded.
[frida-ios-dump]: ProtobufLite.framework has been loaded.
[frida-ios-dump]: andromeda.framework has been loaded.
[frida-ios-dump]: mars.framework has been loaded.
[frida-ios-dump]: marsbridgenetwork.framework has been loaded.
[frida-ios-dump]: matrixreport.framework has been loaded.
start dump /var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/WeChat
WeChat.fid: 100%|███████████████████████████████████████████████████████████████████████████| 144M/144M [00:04<00:00, 33.9MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/mars.framework/mars
mars.fid: 100%|███████████████████████████████████████████████████████████████████████████| 12.7M/12.7M [00:00<00:00, 32.7MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/andromeda.framework/andromeda
andromeda.fid: 100%|██████████████████████████████████████████████████████████████████████| 8.71M/8.71M [00:00<00:00, 31.2MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/OpenSSL.framework/OpenSSL
OpenSSL.fid: 100%|████████████████████████████████████████████████████████████████████████| 2.38M/2.38M [00:00<00:00, 27.1MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/ProtobufLite.framework/ProtobufLite
ProtobufLite.fid: 100%|█████████████████████████████████████████████████████████████████████| 205k/205k [00:00<00:00, 10.0MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/marsbridgenetwork.framework/marsbridgenetwork
marsbridgenetwork.fid: 100%|██████████████████████████████████████████████████████████████| 2.40M/2.40M [00:00<00:00, 27.6MB/s]
start dump /private/var/containers/Bundle/Application/3356DDD1-7B64-4B8E-AA2D-0F7BAA394A9A/WeChat.app/Frameworks/matrixreport.framework/matrixreport
matrixreport.fid: 100%|█████████████████████████████████████████████████████████████████████| 469k/469k [00:00<00:00, 17.3MB/s]
network_setting.html: 260MB [00:12, 22.2MB/s]
0.00B [00:00, ?B/s]
Generating "微信.ipa"
➜ dump
重签名方式一
- 查看电脑安装的所有签名
➜ security find-identity -v -p codesigning
1) 733B3EBFD4132FB93F8E21ABC93500B89563E212 "Apple Development: [email protected] (HM4asdfads)"
2) 6A525348B0F4A138E826DF86C15765EC220CAD57 "Apple Development: xxxx (LP48asdfad)"
3) 1A5BABAD6111FD9C1B947BC7E7B39BF07F28690F "Apple Distribution: Beijing xxxxx (55Wdsasdfadsf)"
3 valid identities found
- 解压ipa,cd到Payload目录下,查看wechat的签名信息
➜ codesign -vv -d WeChat.app
Executable=/Users/XXX/Desktop/dump/Payload/WeChat.app/WeChat
Identifier=com.tencent.xin
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20500 size=2308891 flags=0x0(none) hashes=36071+7 location=embedded
Signature size=4390
Authority=Apple iPhone OS Application Signing
Authority=Apple iPhone Certification Authority
Authority=Apple Root CA
Info.plist entries=72
TeamIdentifier=88L2Q4487U
Sealed Resources version=2 rules=22 files=1683
Internal requirements count=1 size=96
- cd到WeChat.app目录,查看machO文件的信息,在
Load commond
中有一个LC_ENCRYPTION_INFO_64
类型用来表示加密的cryptid
字段,0表示没有加密,1表示AppStore对整个app包进行对称加密过的(其在运行时的内存中解密,因此它必须要高效率,所以使用的对称加密)。可以使用爱思助手下载其他的app验证一下otool -l WeChat | grep crypt
➜ WeChat.app otool -l WeChat
...
Load command 12
cmd LC_ENCRYPTION_INFO_64
cmdsize 24
cryptoff 16384
cryptsize 121225216
cryptid 0 # 0代表没有加密,1代表加密
pad 0
Load command 13
...
- 删除插件和带有插件的app包(Watch文件夹)。
- 对
Frameworks
里面的库进行重签名
➜ WeChat.app cd Frameworks
➜ Frameworks codesign -fs "Apple Development: [email protected] (HM4asdfads)" xxx.frameworks
- 检查WeChat可执行文件权限,如果它是白色的需要改一下权限
chmod -x WeChat
或chmod 777 WeChat
;如果是黑色说明是有执行权限的。 - 创建一个
demo
工程,真机运行,将生成的demo.app
包内的embedded. mobileprovision
复制出来,放到WeChat.app
目录下 - 修改Info.plist文件中的
Bundle Id
- 通过授权文件(Entitlements)重签
app
包
终端命令:security cms -Di embedded.mobileprovision
,提取Entitlements
里面的内容并创建一个新的plist文件,命名可随意:如ent.plist
➜ WeChat.app security cms -Di embedded.mobileprovision
...
Entitlements
application-identifier
HM4asdfads.con.xxxx.demo*
keychain-access-groups
HM4asdfads.*
com.apple.token
get-task-allow
com.apple.developer.team-identifier
55WHPN47NF
...
将ent.plist
文件中,接下来就可以使用ent.plist
对WeChat.app
进行签名了
➜ WeChatDemo ls
AppDelegate.h AppDelegate.m Assets.xcassets Base.lproj Info.plist SceneDelegate.h SceneDelegate.m ViewController.h ViewController.m WeChat.app ent.plist main.m
➜ WeChatDemo codesign -fs "Apple Development: [email protected] (HM4asdfads)" --no-strict --entitlements=ent.plist WeChat.app
WeChat.app: replacing existing signature
➜ WeChatDemo
重签名方式二
使用xcode创建同名工程,这里的同名指的是target一致,xcode根据target在run的时候生成app文件。新创建一个WeChat或者在任意一个工程的TARGETS添加WeChat都可以。
- 运行同名工程,得到一个.app文件
- 打开砸壳后的app,删除里面的插件和带有插件的app包(Watch文件夹)。
- 对
Frameworks
里面的库进行重签名 - 不需要改bundle id,描述文件等,直接将上面两步操作之后的app文件替换同名工程中的app文件,然后xcode run。
重签名方式三
借助xcode中Run Script
,编写shell脚本,实现自动重签,主要是脚本的编写,引用一下别人写的脚本示例:
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"
#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"
rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"
#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
# 设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
最新常见问题
在实验过程中,使用新版的weixin,dingding都不成功,提示The application is not built for this device
,如下图所示
解决方案为:这是因为使用了app瘦身功能,砸壳所用的机型与重签之后使用的机型不一致,需要将plist文件中的
UISupportedDevices
的设备补全,或者直接将这一项删除,在脚本的第4步中添加上
#我这里使用的xs max(A2104),添加`iPhone11,6`即可安装成功
/usr/libexec/PlistBuddy -c "Add :UISupportedDevices: string iPhone11,6" "$TARGET_APP_PATH/Info.plist"
#删除
/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" "$TARGET_APP_PATH/Info.plist"
PS:本人只是为了学习和研究,如有冒犯请多多见谅~