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`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/372bda8b-65ca-7f06-0ccc-bd436c29ff27.png)
完成`JailBreak`，我们即可安装好我们的`Plugin`.`Plugin`一般为.deb格式，这源于`Cydia`借鉴了Ubuntu的包管理方式,没错你可以使用诸如`apt`、`apt-get`、`dpkg`等命令.
这里我使用`theos`已经写好了`Plugin`.`theos`是一套`JailBreak Plugin(越狱插件)`专用的开发框架.它一般输出两种成品，一种就是前面提到的.deb，另外一种则是.dylib.至于dylib是什么，我放到后面一段章节来说。
我们可以使用wget命令，将deb下载到本机的iPhone。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/ed8ef871-1ab2-e6a0-88e9-61a03196f888.png)
接着使用`dpkg -i ShimizuWecaht.deb`安装即可
至于如何打开JailBreak下iPhone的ssh，你只需在`Cydia`中安装`OpenSSH`即可.
随后，deb插件会注入我们从AppStore中的下载的`WeChat`.在我们安装deb时可能会报错，因为`checkra1n`越狱的iPhone默认的`Cydia`不会安装`Cydia Substrate`.
<img width="414" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/162217a4-15fc-b657-ee8f-b9b5cc8db061.png">
我们一定要提前安装`Cydia Substrate`，当然你报错以后再安装deb插件，它会默认将状态从挂起变为进行，从而完成安装。
<img width="414" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/1b950249-534b-1013-5107-4f286e79bfbe.png">

随后我们重新打开我们的`WeChat`进行检查，是否`Hook`成功
<img width="414" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/9d7caa56-4ff8-504e-b426-32e56de30808.png">
这里我适配了`WeChat`的最新版——7.0.10
<img width="414" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/272d6c3c-a55d-0735-00ba-7b22bcb5c395.png">
### 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。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/d964932f-4dc9-ec72-4470-253cb4c48c75.png)
##### PS:上面的贴图是旧图，现在的版本号是7.0.8
### 3.3 dylib注入问题
说完砸壳，我们就来说一下关键性问题——dylib注入。dylib是iOS端的动态链接库的叫法，类似于win下的dll文件。我们可以把写好的deb插件直接转为dylib，然后再使用libsubstrate.dylib这个工具进行注入。其实，ipa安装包本质是一种苹果设立的压缩包格式，完全可以解压。
解压以后，长下面那个样子
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/0ddfc004-2366-93f2-7228-1ea9bdee17cf.png)
起到重要作用的就是Payload文件夹中的文件。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/dffa9ae0-31ee-a195-df94-8d401c3ae013.png)
Payload文件中的这个文件，本质也是一个压缩包
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/d18f4fe8-4383-4c12-4a98-ab4c5fd24aae.png)
图中那个红色标注的名为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年了，谁还用脚本注入啊？有开发者写出了一键注入工具

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/a636ab22-e56f-0039-e913-f49b848f996f.png)

直接可以进行一键ipa破解工作

你可以通过这里获得http://www.iosre.com/t/ipa-ipa/15494 (win用户请无视)


### 3.4 安装问题
如果你是Mac用户，你可以安装Xcode的monkeyDev扩展来安装注入好的ipa到你的iPhone
如果你没有Mac或者你没有Xcode，你可以使用Impactor(不支持MacOS10.15.1)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/fc9003f1-066e-3955-5745-e30e201cf26f.png)

它同时支持win和Mac，这里不再赘述使用方法，网络上关于这个工具有很多介绍
例如：https://www.52pojie.cn/thread-946944-1-1.html

以下是我的iPhone 11 Pro Max安装以后的效果(基于7.0.6的砸壳微信ipa包)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/09a19d15-6e22-ec69-9abd-560d08b3eb2d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/1808607e-ca94-adef-5169-ec808ee2f765.png)

### 4.附录
由于相关政策原因，本文不会直接放出打包好的完整ipa包，只放出越狱用户可以使用的deb插件以及非越狱用户需要的dylib.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/4518ba9c-0544-a4d5-fe37-b7bd7c070a6d.png)

链接: https://pan.baidu.com/s/1tBzCy8wcoziSu3ucdnc3uQ 提取码: wvgt