1.前言
在未成为一名web安全工程师前,我是一名iOS开发。iOS开发在当时主要使用编程语言Objective-C
,其发展的另外一个方向则是Tweak
开发.所谓Tweak
其实就是JailBreak Plugin(越狱插件)
,它基于Cydia可以让用户自定义想要的功能代码,而这一技术一度称为Hook
——钩子技术
.本位将以WeChat
举例,谈一谈如何在JailBreak
和非JailBreak
两种状态下为WeChat
添加功能.
准备
- 1.电脑(最好为Macos系统)
- 2.iPhone(越狱机iPhone6SPlus,非越狱机iPhone 11 Pro Max)
- 3.数据线
2.JailBreak下的附加
JailBreak
方法我推荐使用checkra1n
,因为它基于iPhone的A系列CPU的漏洞.你可以访问https://checkra.in/ 获得.
然后按照指引即可完成A11以下设备的JailBreak
完成JailBreak
,我们即可安装好我们的Plugin
.Plugin
一般为.deb格式,这源于Cydia
借鉴了Ubuntu的包管理方式,没错你可以使用诸如apt
、apt-get
、dpkg
等命令.
这里我使用theos
已经写好了Plugin
.theos
是一套JailBreak Plugin(越狱插件)
专用的开发框架.它一般输出两种成品,一种就是前面提到的.deb,另外一种则是.dylib.至于dylib是什么,我放到后面一段章节来说。
我们可以使用wget命令,将deb下载到本机的iPhone。
接着使用dpkg -i ShimizuWecaht.deb
安装即可
至于如何打开JailBreak下iPhone的ssh,你只需在Cydia
中安装OpenSSH
即可.
随后,deb插件会注入我们从AppStore中的下载的WeChat
.在我们安装deb时可能会报错,因为checkra1n
越狱的iPhone默认的Cydia
不会安装Cydia Substrate
.
我们一定要提前安装Cydia Substrate
,当然你报错以后再安装deb插件,它会默认将状态从挂起变为进行,从而完成安装。
随后我们重新打开我们的WeChat
进行检查,是否Hook
成功
这里我适配了WeChat
的最新版——7.0.10
3.非JailBreak下的附加
非JailBreak下,就比较麻烦了。一般需要解决三个问题.
- 1.签名问题
- 2.砸壳问题
- 3.dylib注入问题
- 4.安装问题
3.1 签名问题
iOS安装app一般只有两种方式,一种是商店(App Store)下载,另外一种则是证书分发。那么证书分发这种方式则是采用了签名验证机制。iOS的签名一般可以通过开发者账号、企业账号来获取。所有AppleID都可以成为开发者账号。而开发者账号,一般分为付费用户和未付费用户。付费用户可以上架一个demo APP,然后将本地的自定义ipa安装包使用demo APP的证书进行重签名实现洗白。而非付费用户的证书有效期只有7天,所以相对JailBreak下较为麻烦。
3.2 砸壳问题
由于iOS的app上架App Store默认会有一层壳,和Android不同的是,iOS的壳很好脱。我们把脱壳这个行为叫做砸壳。砸壳需要使用已经越狱以后的iPhone配合frida。当然我们也可以使用一些别人砸好壳的ipa。比如PP助手就分为越狱专区和正版专区,越狱专区的ipa都是已经砸好壳的ipa。
PS:上面的贴图是旧图,现在的版本号是7.0.8
3.3 dylib注入问题
说完砸壳,我们就来说一下关键性问题——dylib注入。dylib是iOS端的动态链接库的叫法,类似于win下的dll文件。我们可以把写好的deb插件直接转为dylib,然后再使用libsubstrate.dylib这个工具进行注入。其实,ipa安装包本质是一种苹果设立的压缩包格式,完全可以解压。
解压以后,长下面那个样子
起到重要作用的就是Payload文件夹中的文件。
Payload文件中的这个文件,本质也是一个压缩包
图中那个红色标注的名为WeChat才是实际运行在iOS平台上面的app程序主体。
而我们则是需要将dylib注入到里面去。
我们利用自动注入脚本进行注入。
首先我们打开iTerm进入到脚本目录
脚本代码如下
# !/bin/bash
# 使用 ./autoInsertDylib.sh ipa文件路径 dylib文件路径 eg: ./autoInsertDylib.sh wechat.ipa robot.dylib
shell_path="$(dirname "$0")"
SOURCEIPA="$1"
DYLIB="$2"
LIBSUBSTRATE="${shell_path}/libsubstrate.dylib"
temp_dir="${shell_path}/tweak-temp-tk"
ipa_bundle_path="${temp_dir}/${SOURCEIPA##*/}"
libsubstrate_path="${temp_dir}/${LIBSUBSTRATE##*/}"
dylib_path="${temp_dir}/${DYLIB##*/}"
framework_path="${app_bundle_path}/${framework_name}.framework"
rm -rf ${shell_path}/../Products/*
mkdir ${shell_path}/../Products/
if [ ! -d ${temp_dir} ]; then
# echo "创建 ${temp_dir}"
mkdir ${temp_dir}
fi
cp "$SOURCEIPA" "$DYLIB" "$LIBSUBSTRATE" ${temp_dir}
# cd "$shell_path"
echo "开始注入dylib >>> \n\n\n"
# echo "正将" ${SOURCEIPA##*/} ${DYLIB##*/} ${LIBSUBSTRATE##*/} "拷贝至/tweak-temp-tk"
otool -L ${dylib_path} > ${temp_dir}/depend.log
grep "/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate" ${temp_dir}/depend.log >${temp_dir}/grep_result.log
if [ $? -eq 0 ]; then
# echo "发现有 ${DYLIB##*/} 依赖于 CydiaSubstrate, 正将其替换为 libsubstrate"
install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib ${dylib_path}
# else
# echo "没有发现依赖于CydiaSubstrate"
fi
# echo "解压" ${SOURCEIPA##*/}
unzip -qo "$ipa_bundle_path" -d ${shell_path}/extracted
APPLICATION=$(ls "${shell_path}/extracted/Payload/")
app_path="${shell_path}/extracted/Payload/${APPLICATION}"
# cp -R ${app_path} ./
# rm -rf ~/Desktop/temp/extracted/Payload/$APPLICATION/*Watch*
cp "${shell_path}/popup_close_btn.png" ${app_path}
cp ${dylib_path} ${libsubstrate_path} ${app_path}
# echo "删除" ${APPLICATION##*/} "中 watch 相关文件"
rm -rf ${app_path}/*watch* ${app_path}/*Watch*
# echo "注入" ${DYLIB##*/} "到" $APPLICATION
${shell_path}/insert_dylib @executable_path/${DYLIB##*/} ${app_path}/${APPLICATION%.*} > ${temp_dir}/insert_dylib.log
echo "注入成功 !!!"
rm -rf ${app_path}/${APPLICATION%.*}
mv ${app_path}/${APPLICATION%.*}_patched ${app_path}/${APPLICATION%.*}
cp -R ${app_path} ${shell_path}/../Products/${APPLICATION}
# echo "删除临时文件 >>>"
rm -rf ${shell_path}/extracted ${temp_dir}
# echo "打开 tweak-temp-tk 文件夹"
open ${shell_path}/../Products/
# open /Applications/iOS\ App\ Signer.app
命令如下:
./autoInsertDylib.sh ipa文件路径 dylib文件路径
注入完后以后,Products文件夹会自动打开,里面就是生成好的Payload文件夹中的二进制文件压缩包。
二进制压缩包可以使用工具将其转为.ipa安装包
当然现在都2020年了,谁还用脚本注入啊?有开发者写出了一键注入工具
直接可以进行一键ipa破解工作
你可以通过这里获得http://www.iosre.com/t/ipa-ipa/15494 (win用户请无视)
3.4 安装问题
如果你是Mac用户,你可以安装Xcode的monkeyDev扩展来安装注入好的ipa到你的iPhone
如果你没有Mac或者你没有Xcode,你可以使用Impactor(不支持MacOS10.15.1)
它同时支持win和Mac,这里不再赘述使用方法,网络上关于这个工具有很多介绍
例如:https://www.52pojie.cn/thread-946944-1-1.html
以下是我的iPhone 11 Pro Max安装以后的效果(基于7.0.6的砸壳微信ipa包)
4.附录
由于相关政策原因,本文不会直接放出打包好的完整ipa包,只放出越狱用户可以使用的deb插件以及非越狱用户需要的dylib.
链接: https://pan.baidu.com/s/1tBzCy8wcoziSu3ucdnc3uQ 提取码: wvgt