微信升级限制的突破

接下来的几篇文章,小程将会实战地演示一下:如何注入iOS的APP。其中使用到的知识,基本在前面的文章中都有介绍到,读者可以翻阅一下。

小白:小程,我想用回旧版本的微信!

小程:为什么要用旧版本微信呢?

小白:你不知道,我装一个旧版本的可共存的微信,再装一个最新版本的微信,我就可以同时登陆两个账号, 然后就可以在群里面互粉装逼了。但微信5.0版本提示我版本太低,不给用,要升级!你有没有办法骗过服务器呢?

本文解决一个问题:让低版本的微信可以使用。

(1)安装与运行

在网上搜索微信的历史版本,下载一个兼容多开的版本(实际上是bundleID不一样),比如5.0版本。当然也可以通过小程之前介绍charles时使用的办法,在AppStore上下载到微信旧版本,再重签名。

通过pp助手之类的工具,把旧版本微信安装到手机。

启动微信,登陆账号,遇到这样的提示:

版本过低,无法使用。

问题出现了,那怎么解决呢?

小程很自然地猜测,客户端有一个逻辑,是把当前的版本号与服务器返回的版本号作对比,如果发现当前的版本号过低,就提示升级。

那么,当前的版本号是怎么获取到的呢,它是不是从一个函数返回的呢?如果小程把这个值改掉会怎么样呢?

(2)突破限制

然后搜索”version”关键字,对可能是返回版本值的函数进行注入,观察各个地方的输出。

注入的办法,用小程上一篇介绍的iOSOpenDev来做即可,而观察输出则使用之前介绍的socat。

这里给出部分注入的代码的截图(直接贴代码会遇到排版的问题):

最终可以确认,CUtility::GetVersion就是目标函数,通过一个公共类来返回版本值,这在设计上是很合理的事情了。

运行微信时,可以在系统日志中看到这样的输出:

Oct 18 15:14:46 yeah MicroMessenger[2506] : ——-CUtility::GetVersion in

Oct 18 15:14:46 yeah MicroMessenger[2506] : ——-MicroMessengerAppDelegate::didFinishLaunchingWithOptions in

对CUtility::GetVersion这个函数的返回值作修改,尝试返回452321792(这个值是简单地把最高位加1而来):

再次运行微信,低版本的限制消失了,看到这样的界面:

身份验证之后,进入到陈旧的5.0界面:

bundleID是一个APP的唯一标识,比如微信6.x版本的bundleID是这样的:

因为微信6.x的bundleID与5.0版本的不一样,这就意味着,同时安装5.0版本与6.x版本的微信是可行的,比如小程就安装了两个(微信多开),运行起来的效果是这样的(录制时的帧率有点低,实际上是两个APP在切换):

总结一下,通过classdump拿到类的信息,然后进行猜测与跟踪注入,用socat观察输出,最终锁定目标函数并完成注入修改,这个过程就是一般的hook过程。重点在于跟踪与iOSOpenDev注入的使用,难度系数为低。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180123G0GBNA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券