iOS WeChat Plugin和JailBreak在2019年度的那些事


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的包管理方式,没错你可以使用诸如aptapt-getdpkg等命令.
这里我使用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