Help us understand the problem. What is going on with this article?

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
完成JailBreak,我们即可安装好我们的Plugin.Plugin一般为.deb格式,这源于Cydia借鉴了Ubuntu的包管理方式,没错你可以使用诸如aptapt-getdpkg等命令.
这里我使用theos已经写好了Plugin.theos是一套JailBreak Plugin(越狱插件)专用的开发框架.它一般输出两种成品,一种就是前面提到的.deb,另外一种则是.dylib.至于dylib是什么,我放到后面一段章节来说。
我们可以使用wget命令,将deb下载到本机的iPhone。
image.png
接着使用dpkg -i ShimizuWecaht.deb安装即可
至于如何打开JailBreak下iPhone的ssh,你只需在Cydia中安装OpenSSH即可.
随后,deb插件会注入我们从AppStore中的下载的WeChat.在我们安装deb时可能会报错,因为checkra1n越狱的iPhone默认的Cydia不会安装Cydia Substrate.
image.png
我们一定要提前安装Cydia Substrate,当然你报错以后再安装deb插件,它会默认将状态从挂起变为进行,从而完成安装。
image.png

随后我们重新打开我们的WeChat进行检查,是否Hook成功
image.png
这里我适配了WeChat的最新版——7.0.10
image.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

PS:上面的贴图是旧图,现在的版本号是7.0.8

3.3 dylib注入问题

说完砸壳,我们就来说一下关键性问题——dylib注入。dylib是iOS端的动态链接库的叫法,类似于win下的dll文件。我们可以把写好的deb插件直接转为dylib,然后再使用libsubstrate.dylib这个工具进行注入。其实,ipa安装包本质是一种苹果设立的压缩包格式,完全可以解压。
解压以后,长下面那个样子
image.png
起到重要作用的就是Payload文件夹中的文件。
image.png
Payload文件中的这个文件,本质也是一个压缩包
image.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

直接可以进行一键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

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

以下是我的iPhone 11 Pro Max安装以后的效果(基于7.0.6的砸壳微信ipa包)
image.png

image.png

4.附录

由于相关政策原因,本文不会直接放出打包好的完整ipa包,只放出越狱用户可以使用的deb插件以及非越狱用户需要的dylib.
image.png

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした