又到年末,微信红包又开始成为大家所关心的话题了,不管是公司年会,还是朋友聚会,似乎不发红包就没办法继续聊下去了。因此,值此新年来临之际,我对我的iOS 微信抢红包 tweak进行了一下改进。主要增加了插件开关,以及随机延迟功能,让你在新一轮红包大战中无往而不利。

但是,这毕竟是一个 tweak,只有少数有越狱机器的小伙伴才能使用这个插件,无疑门槛是太高了。到目前为止,已经有无数朋友在问到底有没有免越狱版本的插件了。

今天,我们就要讨论下如果制作免越狱版本的微信抢红包插件。

注意:本篇文章只讲我在自己摸索过程中的一点总结,并不深入讲解原理。我对 iOS 逆向也只是初窥门径,对很多原理也还未达到深入理解的程序,国内关于这方面的文章也是在少数,我也不希望我写出语焉不详的文章导致读者被我误导。同时,也不排除将来我研究得够深入的时候,再回过头来写关于原理的文章。

原理

虽然这里并不深入讲解,但是最基本的原理我们还是要理解的,因为后面所做的工作,都是基于这个原理来进行开发的。越狱机器之所以能使用 tweak,主要是因为在越狱的时候,手机里就安装了 mobilesubstrate 这个库,这个库的作用就是能在程序运行的时候动态加载我们自己写的 dylib 动态运行库。而由于非越狱手机系统里面是没有这个库的,所以我们需要直接将这个库打包进 ipa 当中,使用它的 API 实现注入。

关于注入的原理,可以参考这篇文章:移动App入侵与逆向破解技术-iOS篇。

好了,这就是目前为止我们所需要了解的东西。下面就可以开始动手了。

获取砸壳版本的微信 ipa

因为在 AppStore 上面下载得到的应用都是经过加密的,可以执行文件上已经被加过一层壳,所以我们需要先拿到砸过壳版本的微信应用。

有两种方法:

  1. 直接在 PP 助手下载
  2. 使用 Clutch 对越狱手机上应用进行砸壳

第一种方法没什么好说的,这里主要讲讲第二种方法。

首先,将 Cluth 仓库 clone 到本地:

$ git clone https://github.com/KJCracks/Clutch
$ cd Clutch

接着,使用 Xcode 进行构建,得到可执行文件:

$ xcodebuild -project Clutch.xcodeproj -configuration Release ARCHS="armv7 armv7s arm64" build

生成出来的可执行文件就在 Clutch 目录下,将其拷贝到手机上:

scp Clutch/clutch root@<your.device.ip>:/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

可以看到,clutch 将砸过后的 ipa 文件放到了 /private/var/mobile/Documents/Dumped/ 目录下。

我们将它改成一个比较简单的名字,然后拷回电脑上:

$ 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

这里,我把它拷到了电脑桌面上。之后就可以进行下一步操作了。

准备 dylib 动态链接库

这步就很简单了,直接到我的 WeChatRedEnvelop 上把源码 clone 下来,然后执行 make 命令,就能拿到 dylib 文件了。

$ 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 # 注意是 .theos 目录,这是个隐藏目录

将生成的 dylib 文件拷贝到桌面,跟刚刚砸过壳的微信应用放到一个目录层级。

检查依赖项

因为这个代码是我自己写的,所以我知道这个 dylib 除了 mobilesustrate 外没有依赖其它的库。但是如果我们拿到的是别人的 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)/usr/lib/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)/usr/lib/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)

可以看到除了 substrate 库,其它依赖的都是系统自带的库。我们将 libsubstrate.dylib 拷出,使用 install_name_tool 命令修改动态库的路径,指向 app 二进制文件的同级目录。

如果你的系统中不是 /usr/lib/libsubstrate.dylib 而是 /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 的话,解决方法可以参考 Github 上的 issue。

$ scp root@:/usr/lib/libsubstrate.dylib ~/Desktop
$ install_name_tool -change /usr/lib/libsubstrate.dylib @loader_path/libsubstrate.dylib WeChatRedEnvelop.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)

可以看到 libsubstrate.dylib 的路径已经变更了。

将动态链接库注入二进制文件中

接下来,就需要将我们的库注入到微信的二进制文件中,可以使用开源的 optool 工具。

编译安装 optool 工具:

# 因为 optool 添加了 submodule,因为需要使用 --recuresive 选项,将子模块全部 clone 下来
$ git clone --recursive https://github.com/alexzielenski/optool.git
$ cd optool
$ xcodebuild -project optool.xcodeproj -configuration Release ARCHS="i386 x86_64" build

将砸壳过的 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 注入到二进制文件中:

$ /path/to/optool install -c load -p "@executable_path/WeChatRedEnvelop.dylib" -t wechat/Payload/WeChat.app/WeChat

在开始打包之前,请先将 WeChat.app 里面的 Watch 目录删除,这个目录是跟 Watch 有关的,如果不删除的话,会导致后继的安装步骤出问题。出现 A WatchKit app within this app is not a valid bundle 的错误。

打包并重签名

打包 ipa 与重签名可以直接使用图形化工具 ios-app-signer 来完成。

这个工具可以自动加载出本机的证书以及 Provisioning Profile 文件,使用起来十分方便,当然也可以手动选择证书文件。

如果是使用个人开发者证书,需要先将设备的 UUID 加到 Provisioning Profile 中。

我这里是直接从一个 archive 过的应用中提取 embedded.mobileprovision 文件,并在 Provisioning Profile 一栏中选择 Choose Custom File 使用这个文件。

ios-app-signer

点击 start 后,指定保存路径,iOS App Signer 就会帮你搞定所有事情。

安装

在 iOS App Signer 完成打包与重签名后,我们就可以进行安装了。

安装有两种方法,一种是使用 iTool 工具安装 ipa 文件。

另外一种是针对有 XCode 的同学,在菜单 - Window - Devices 中打开设置窗口。点击 Installed Apps 栏下面的 + 号就可以选择 ipa 文件进行安装了。

Xcode-install-ipa

效果

重签名后的应用由于与原应用的 Bundle id 是不同的,所以可以同时安装两个应用。这也就是淘宝上所谓的微信多开的原理。

Resign-effect

小结

我们最终得到了一个可以安装在免越狱设备上的微信 ipa 文件,但是这些步骤对于有些来说,可能还是太过复杂了。他们需要的只是重签名过的 ipa 文件,但是很可惜,由于我是使用的个人证书打包的,所以无法直接将 ipa 文件发出来。

如果有哪位好心的小伙伴可以贡献一个企业证书的话,我就可以利用这个企业证书打个包,然后直接进行应用分发,这也许就是最方便快捷的方法了。

参考文章

  • 移动App入侵与逆向破解技术-iOS篇5
  • DingTalkNoJailTweak

赞赏

如果本篇文章对你有帮助,可以进行小额赞助,鼓励作者写出更好的文章。

免越狱版 iOS 抢红包插件相关推荐

  1. AE2017免安装版使用粒子插件红巨星套装插件经验分享

    1.安装了AE2020,AE2017版都出现粒子插件Trapcode15.0.0提示39::7错误(无法导入.OBJ对象)是因为缺少TrapcodeOBJ.AEX插件,把此插件复制到C:\Progra ...

  2. 带你了解手机群控 苹果免越狱群控系统是怎么实现的

    手机群控,其实手机群控这个词你在网上搜集,会发现有很多讨论结果,手机群控系统大家无非想到苹果手机群控,然后就是安卓手机群控,其实不是的,手机群控往往比你们想的要多的多:那么就和大家相互讨论一下手机群控 ...

  3. 硬件版--苹果ios免越狱脚本实现硬件方案

    实现原理 通过电脑串口控制鼠标模块对手机进行点击和滑动等操作,iOS需要支持AirPlay投屏,所以iOS版本要大于等于iOS14.3. 该方案的优点,就是不需要签名,不需要安装APP,只需要一个硬件 ...

  4. IOS微信逆向-免越狱抢红包防撤回等自定义功能实现

    微信砸壳 CrackerXI+砸壳,或手动使用dumpdecrypted砸壳 把已砸壳的wech使用scp或者助手at.ipa导出 monkeydev MonkeyDev集成在xcode上面,可以快速 ...

  5. redenvelope php,微信免越狱抢红包速成手册

    很早之前就有开发者推出了红包插件,在iOS平台,从越狱到非越狱都能欢快的抢抢抢,只不过在不流行越狱的现在,大家还是倾向免越狱抢红包.在网上的免越狱教程都略显复杂,时间长了再次执行的时候还得翻看教程,本 ...

  6. 初涉iOS逆向工程:免越狱修改微信(外观篇)

    点击上方"iOS开发",选择"置顶公众号" 关键时刻,第一时间送达! 美国学者埃德加·戴尔(Edgar Dale)1946年提出了"学习金字塔&quo ...

  7. iOS 免越狱修改微信运动步数

    说明: 相信喜欢逆向工程的小伙伴已经对微信自动抢红包插件有所耳闻了,或者可以说,已经被广泛的传播了,但笔者发现,其实只有两篇是原创的,其余均为疯狂转载.看了下网上对于微信的"喜爱" ...

  8. wifi信息修改插件ios_iOS免越狱修改运营商信息/修改“应用图标标记”颜色

    iOS免越狱修改运营商信息捷径/workflow规则 地址: https://www.icloud.com/shortcuts/cc295815769b44f7a711dab6910e1be8 iOS ...

  9. APP逆向分析之钉钉抢红包插件的实现-iOS篇

    花费了很多天的原创文章,转载请注明出处https://yohunl.com/ding-ding-qiang-hong-bao-cha-jian-iospian/ ,谢谢! 网络上关于微信红包的分析文章 ...

  10. EasyClick iOS脚本_免越狱_免硬件工程打包IPA使用说明

    EasyClick iOS脚本打包IPA EasyClick iOS脚本,免越狱,免硬件支持打包ipa包,并安装到手机上执行,具体打包流程如下 选择需要打包的工程 必须要选择EasyClick iOS ...

最新文章

  1. 全球及中国汽车零部件信息化行业需求预测与竞争战略规划报告2022年
  2. 树网的核 Vijos1362 NOIP2007 树结构 直径 暴搜
  3. Swift中文件和图片上传处理
  4. Leetcode 950. Reveal Cards In Increasing Order
  5. 美女学霸直博中科院,本科武大王者全国16强,妥妥现实版“爽文女主”!
  6. JEECG_3.7 权限开发讲解-张代浩-专题视频课程
  7. python获取股票历史数据_量化交易之如何获取股票历史数据并存为csv
  8. c++ primer5 第一章书籍上的一些代码
  9. 昨晚的我是歌手,人工智能也掺了一脚
  10. 自学python能干些什么副业-学会Python有哪些可以做的兼职?
  11. matlab2c使用c++实现matlab函数系列教程-unifstat函数
  12. Ext4文件系统架构分析(三) ——目录哈希、扩展属性与日志
  13. 果然发生了,百度一29 岁程序员因“篡改数据”被抓
  14. mimikatz猕猴桃工具使用教程
  15. ictclas分词系统 java_1-Ictclas50分词系统ForJava
  16. 超级NB的防DDOS(小量级)攻击的脚本
  17. oracle幂函数运算公式,幂函数公式_幂的运算法则公式14个
  18. 转载:解决 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passw
  19. ElasticSearch的scroll分批查询
  20. 971: 统计利用先序遍历创建的二叉树的深度

热门文章

  1. c语言科学计数法输出1_e10,PAT 1024科学计数法的代码实现及错误分析(C语言)
  2. java找不到路径应该怎么弄_cd java 找不到指定路径
  3. c语言windows程序设计pdf下载,windows程序设计第7版(windows程序设计第7版珍藏版) pdf...
  4. C语言程序——小数的四舍五入
  5. 百度Apollo 2.0 车辆控制算法之LQR控制算法解读-清晰版
  6. 从零开始的车牌识别课题设计(一)
  7. 认识影片版本(CAM、TS、TC、DVD、HD、BD、TVRIP等)
  8. Contacts Provider基础
  9. NSIS脚本开发总结
  10. 联想r720自带杜比驱动下载_5499起!联想YOGA家族四款新品预售开启!-联想 ——快科技(驱动之家旗下媒体)-...