又到年末,微信红包即将成为一个重点娱乐项目,最近看到大家都在玩微信自动抢红包,原来是有好心人把工具开源了,而且配有详细解说,好奇之下也手痒来玩了一下。[作者已经将越狱版的工具发到bigboss,不愿意折腾的可以直接下载使用]

因为在此之前我从未接触过iOS开发,这说明自动抢红包目前来看门槛还很低,所以感兴趣的TX可以试着玩玩,过程中挺涨知识的,原理什么的我大概明白了一点,就不班门弄斧了,纯粹是生日的娱乐。

前期工作

需要设备

  1. 越狱iPhone一台(非必须,已有未加密微信ipa的可跳过)

  2. 装好Xcode8的mac一台(或使用虚拟机)

环境准备

  • 安装Theos和ldid


    export THEOS=/opt/theos
    sudo git clone --recursive https://github.com/theos/theos.git $THEOS
    wget http://joedj.net/ldid
    cp ldid $THEOS/bin/
  • 编译WeChatRedEnvelop

make之前请修改WeChatRedEnvelop.plist里的Bundles为你的新应用名字(就是后面签名用的bundles值)。

    git clone https://github.com/buginux/WeChatRedEnvelop.git
    cd WeChatRedEnvelop
    make
    cp .theos/obj/debug/WeChatRedEnvelop.dylib ~/Desktop
  • 编译安装optool
    如果git clone过程中出现权限问题,请自行修改submodule的config内容,或者添加ssh证书。

    git clone --recursive https://github.com/alexzielenski/optool.git
    cd optool
    xcodebuild -project optool.xcodeproj -configuration Release ARCHS="x86_64" build
    sudo cp optool/build/Release/optool ~/Desktop

获取未加密的微信ipa

在AppStore上面下载得到的应用都是经过加密的,可以执行文件上已经被加过一层壳,重签包需要用未加密的应用。一般获取未加密应用有两种方式:

  1. 在各种第三方助手下载

  2. 对越狱手机上应用进行砸壳

第一种方法没什么好说的,主要怕助手里的应用夹带私货,这里记录一下自己获取未加密微信ipa步骤。

  • iPhone上安装OpenSSH和Cycript

在越狱iPhone上的Lydia里搜索OpenSSH和Cycript,然后进行安装。OpenSSH成功安装后22端口会开启,同一局域网内可以ssh上去,默认root密码alpine,请立即修改默认密码

接着用Clutch进行砸壳,但Clutch暂时不支持watchOS 2,而微信包是多target的,使用Clutch砸壳的时候会出现如下提示:

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.

所以后续重新打包的时候要把watchOS的相关内容删除。

    git clone https://github.com/KJCracks/Clutch
    cd Clutch
    xcodebuild -project Clutch.xcodeproj -configuration Release ARCHS="armv7 armv7s arm64" build

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

    scp Clutch/Clutch root@172.16.86.220:/var/root
    ssh -l root 172.16.86.220
    ./Clutch -d com.tencent.xin

成功之后在/private/var/mobile/Documents/Dumped/目录里可以得到解密后的ipa文件,改名为wx.ipa然后scp到桌面上备用。

修改未加密的微信ipa

准备依赖库

用macOS自带的otool工具进行依赖项检查:

    yangmudeMacBook-Pro:Desktop yangmu$ 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.13.0)
        /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.22.0)
        /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.6.21)
        /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.13.0)
        /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.22.0)
        /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.6.21)
        /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)

从越狱的iOS设备中把/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate等非系统自带的库scp处理,改名后放在WeChatRedEnvelop.dylib的同级目录下,然后修改库指向。

    scp root@172.16.86.220:/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate .
    mv CydiaSubstrate libsubstrate.dylib
    install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib WeChatRedEnvelop.dylib 

注入Tweak至二进制文件

解压ipa文件,删除会造成问题的watch,将Tweak及其依赖文件拷贝到app目录后向wechat中注入Tweak。

    unzip wx.ipa -d wx
    rm -rf wx/Payload/WeChat.app/watch
    cp libsubstrate.dylib WeChatRedEnvelop.dylib wx/Payload/WeChat.app/
    ~/Desktop/optool install -c load -p "@executable_path/WeChatRedEnvelop.dylib" -t wx/Payload/WeChat.app/WeChat

打包并重签名

打包 ipa 与重签名可以直接使用图形化工具ios-app-signer来完成。他可以自动加载本机的证书以及Provisioning Profile 文件,使用起来十分方便

6.tiff

点击 start 后,指定保存路径,打包成功后生成新的ipa。

安装使用

重签名打包的ipa可以通过xcode或者itool之类的助手安装,安装成功后效果如下(请原谅我无耻地修改):

723154621.jpg

2102947927.jpg

1175546243.jpg


后记

微信对这种方法其实已经有所对策,主要把判断秒抢和查询bundleid,被查到一般都是直接封禁朋友圈和部分功能之类的,所以各位玩的时候尽量克制,所谓:“小撸怡情 大撸伤身 强撸…… ”

PS:本来想用dumpdecrypted砸壳,结果了解到dumpdecrypted只会砸你手机处理器对应的那个壳,fat binary 的其它部分仍然是有壳的,所以在这里不好用。不过还是记录一下折腾dumpdecrypted的过程。

下载dumpdecrypted源码并编译

    git clone https://github.com/stefanesser/dumpdecrypted.git
    cd dumpdecrypted
    make

编译成功之后会得到一个dumpdecrypted.dylib文件,这就是我们等下砸壳所要用到的工具。将该工具用scp复制到越狱iOS设备上的/var/root/中。

获取APP目录信息

关闭越狱iOS设备上所有的应用,然后打开微信,用ps -e命令可以获取微信的APP目录地址,如图所示,有/var/mobile/Containers/Bundle/Application/字样的结果就是微信可执行文件的全路径,记录下来(设该值为path1),待会儿要用。

1.tiff

获取Documents目录信息

用Cycript找出微信的Documents目录路径,如图所示有/var/mobile/Containers/Data/Application/字样的结果就是微信的Documents目录全路径,记录下来(设该值为path2),待会儿也要用。

    cycript -p WeChat
    cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

2.tiff

开始砸壳

将dumpdecrypted移动到微信的Documents目录下,然后用下列命令开始砸壳{path1}和{path2}请替换成前面两步得到的路径:

    DYLD_INSERT_LIBRARIES=/{path2}/dumpdecrypted.dylib /{path1}

效果如图:
3.tiff

4.tiff

当前目录下会生成WeChat.decrypted,即砸壳后的未加密文件,请将该文件scp到电脑上备用。

    yangmudeMacBook-Pro:Desktop yangmu$ scp root@172.16.86.220:/var/root/WeChat.decrypted .
    root@172.16.86.220's password: 
    WeChat.decrypted                                             100%   54MB   5.0MB/s   00:11