前言
前几篇讲了一些工具,今天咱们就用这些工具来做一个微信自动抢红包的插件吧。这里代码是从GitHub上下载的。小编也是看着一篇博客来做的,中途也遇到过一些挫折。
原理
越狱机之所以能够使用tweak,主要是因为在越狱的时候,手机里就安装了mobilesubstrate这个库,这个库的作用就是能在程序运行的时候动态加载我们自己写的dylib动态运行库。由于非越狱机系统里没有这个库,那么我们就要把这个库打包到ipa中,使用它的api实现注入。注入原理这里先不说,大家可以去参考这篇文章:移动App入侵与逆向破解技术-iOS篇。
获取砸壳版本的微信ipa
在AppStore里下载的应用都是经过加密的,可执行文件上面被加了一层壳,这里我们就要先得到砸过壳的微信应用。有两种方法:
- 直接利用pp助手 去下载微信
- 使用Clutch对越狱手机上的应用进行砸壳
这里咱们说第二种方式
首先 ,在终端下将Clutch仓库clone到本地:
$ git clone https://github.com/KJCracks/Clutch
$ cd Clutch
接着,使用Xcode进行构建,得到可执行文件:
xcodebuild -project Clutch.xcodeproj -configuration Release ARCHS="armv7 armv7s arm64" build
这里小编生成的可执行文件在Clutch/build/ 文件夹下 可执行文件的名字是Clutch,各位去自己的Clutch文件夹中看看,自己的可执行文件在哪里。将可执行文件拷贝到越狱机上:
$ scp Clutch/build/Clutch root@:/usr/bin/
现在,就要利用这个工具进行砸壳了。
先ssh到越狱手机上,然后列出当前安装的应用:
$ ssh root@
$ Clutch -i
# Installed apps:
# 1: WeChat
# 2: DingTalk
# 3: 喜马拉雅FM(听书社区)电台有声小说相声英语
可以看到clutch把相应应用的包名都显示出来了,得到了包名那么开始砸:
$ Clutch -d com.tencent.xin
# com.tencent.xin contains watchOS 2 compatible application. It's not possible to dump watchOS 2 apps with Clutch 2.0.4 at this moment.
# Zipping WeChat.app
# Swapping architectures..
# ASLR slide: 0xb3000
# ...
# writing new checksum
# DONE: /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS7.0-(Clutch-2.0.4).ipa
# Finished dumping com.tencent.xin in 76.9 seconds
我们可以看到砸壳后的ipa在/private/var/mobile/Documents/Dumped/这个文件下。
这里我们把它改一个简单的名字后,再拷贝到电脑上(小编放到了桌面的wechat文件夹下):
$ mv /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS7.0-\(Clutch-2.0.4\).ipa /private/var/mobile/Documents/Dumped/wechat.ipa
$ scp root@:/private/var/mobile/Documents/Dumped/wechat.ipa ~/Desktop/wechat
准备dylib动态链接库
一开始小编就提到了代码是直接clone下来的,然后执行make命令,得到dylib文件 然后拷贝到桌面wechat文件夹下:
$ git clone https://github.com/buginux/WeChatRedEnvelop.git
$ cd WeChatRedEnvelop
$ make
# > Making all for tweak WeChatRedEnvelop…
# ==> Preprocessing Tweak.xm…
# ==> Compiling Tweak.xm (armv7)…
# ==> Compiling XGPayingViewController.m (armv7)…
# ...
# ==> Signing WeChatRedEnvelop…
$ cp .theos/obj/debug/WeChatRedEnvelop.dylib ~/Desktop/wechat # 注意是 .theos 目录,这是个隐藏目录
这一步,你可能会遇到一些问题,遇到了问题可以问小编。小编这里遇到了挺多问题的,原因还没有找到,同样clone下来的代码,小编的同事make就会顺利得到dylib,小编就没有顺利得到,这里小编先把dylib给你提供一下。
检查依赖项
我们要确保dylib所依赖的库都打包进ipa里面。这里使用macOS自带的otool工具进行检查:
otool -L WeChatRedEnvelop.dylib
WeChatRedEnvelop.dylib (architecture armv7):
/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
WeChatRedEnvelop.dylib (architecture arm64):
/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
在我参考的博客里面,博主得到的libsubstrate.dylib的目录是在/use/lib/下的,而小编的是/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 这里读者不用担心,这里不会造成影响,咱们通过install_name_tool命令修改动态库WeChatRedEnvelop.dylib的路径。
$ install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib WeChatRedEnvelop.dylib
这里的install_name_tool -change 命令其实就是把WeChatRedEnvelop.dylib里面的/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 改成了loader_path/libsubstrate.dylib 可以简单理解为字符串替换(小编觉得这样好懂一些~)
下面在看一下依赖:
$ otool -L WeChatRedEnvelop.dylib
WeChatRedEnvelop.dylib (architecture armv7):
/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
@loader_path/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
WeChatRedEnvelop.dylib (architecture arm64):
/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
@loader_path/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
将动态链接库注入到二进制文件中
这里用到的工具是开源的optool工具。
$ git clone --recursive https://github.com/alexzielenski/optool.git
$ cd optool
$ xcodebuild -project optool.xcodeproj -configuration Release ARCHS="x86_64" build
这里要留意一下你的optool可执行文件在哪里,后面会用到
下面咱们将ipa文件进行解压,然后将libsubstrate.dylib与WeChatRedEnvelop.dylib拷贝到解压后的WeChat.app目录下。
$ cd ~/Desktop
$ unzip wechat.ipa -d wechat
$ cp libsubstrate.dylib WeChatRedEnvelop.dylib wechat/Payload/WeChat.app
接着使用optool把WeChatRedEnvelop.dylib注入到WeChat.app/WeChat中:
$ /Users/mengyijie/optool/build/Release/optool install -c load -p "@executable_path/WeChatRedEnvelop.dylib" -t /Users/mengyijie/Desktop/wechat/wechat/Payload/WeChat.app/WeChat
对这个命令做一下解释说明 install -c load -p "@executable_path/WeChatRedEnvelop.dylib" -t 前面的是上面提到了optool可执行文件的路径 后面是WeChat.app/WeChat的路径(把对应的文件拖到终端下就会得到路径)
在开始打包之前,请先将 WeChat.app 里面的 Watch 目录删除,这个目录是跟 Watch 有关的,如果不删除的话,会导致后继的安装步骤出问题。出现 A WatchKit app within this app is not a valid bundle 的错误。
这里小编再加一条,打包前,看一下plist文件
看看是否支持你的手机。
打包并重签名
打包 ipa 与重签名可以直接使用图形化工具 ios-app-signer 来完成。
这个工具可以自动加载出本机的证书以及 Provisioning Profile 文件,使用起来十分方便,当然也可以手动选择证书文件。
如果是使用个人开发者证书,需要先将设备的 UUID 加到 Provisioning Profile 中。
这里小编用的个人账号。
安装
两种安装方法,一种是使用iTools工具,一种是通过Xcode安装
使用方法
在设置页面,有个微信小助手以及关注我的公众号两项,因为这里用的别人的代码,也没有去修改,关注的公众号是作者的~
参考资料
免越狱版 iOS 抢红包插件