第三方收发微信消息主流技术小结

一篇水文。最近因为需要去了解了一下如何通过第三方技术收发微信的消息,以至于实现一些更复杂的功能。由于微信实际上并没有开放这方面的 API ,所以通俗来讲,就是研究了下如何破解微信的体系。

大体的思路也比较好理解,就是通过微信的各个端入手来模拟。主流的做法大概有以下几种:

Android 端 Hook

原理: Android 中有著名的 Xposed 框架,可以 Hook 任何 App 的方法,在调用前后插入自己的逻辑。

对于收发微信消息来说,收消息相对比较简单,因为可以通过 Hook 数据库插入的方法来实现。而微信的数据库使用 wcdb ,表结构为了稳定也不会轻易变化。也就是说,只要能找到数据库插入的操作,稳定的 Hook 方式便可以一直存在。但是 Hook 发消息就没那么容易了。发消息是一组复杂的方法调用,当涉及到消息类型为图片、语音等复杂类型时还会更为复杂。找到发消息的方法已经是难事了,更何况混淆过后的代码还和天书一样,没有十足的耐心根本找不到线索。更甚,混淆后的方法名每个版本都不一样,可能你辛辛苦苦破解了一个版本,到了下一个版本,哪怕源码做了一丁点改动,你也要花费很大的工作量去适配。

从市面上来看,使用 Xposed 破解微信的主要用途还是在于消息防撤回和一些 UI 上的定制化,对于发消息的需求并不算多。另一方面,针对发消息的 Hook 开源代码也比较少,且不太成熟,有些人在兜售成熟的解决方案,尚不知道是否有用。尝试了一些开源代码以后,我找到个 WechatBotXposed(基于微信 6.6.6 版本) 还是比较靠谱的。

由于使用 Xposed 需要 Root 手机比较麻烦,这里也提供了一个尝试代价小的方案可供试玩:

  1. 手机安装 VirtualXposed
  2. VirtualXposed 安装微信 6.6.6 版本(旧版本的微信可以通过豌豆荚安装,这不是广告)
  3. VirtualXposed 安装上述插件
  4. 启用插件并重启 VirtualXposed

Demo

如果想进一步开发,也可以看这篇讲 WechatBotXposed 的思路的文章,学习如何反编译分析微信的方法。

不过,对于这种破解方式,微信的打击还是比较厉害的。去年年中微信封禁了一波使用 Xposed 的帐号,据称是为了打击世界杯赌球。根据网上能看到的传闻,微信可能会读取手机中已安装应用的列表,判断手机是否被 Root 、是否安装了 Xposed 应用。也有一种方式是判断方法的调用栈中是否存在 Xposed 相关。当然,微信也存在一套行为分析的系统,会通过你登录频次、消息发送频次、设备信息等因素,判断帐号是否存在异常行为。

个人认为,对于这种方式,微信还是比较容易判断出来的。收消息暂且不论,对于发消息,本来是需要用户手动点击发送按钮,而现在一定会有某个函数触发了发消息的逻辑,一定能通过调用栈判断出来。事实上,我用这种方式玩了两天以后,微信就限制了我的帐号在低版本上的登录,必须让我在新版本上才能登录了。

使用 Android 上的辅助功能

原理: Android 上的辅助功能,原本是给残障人士所使用,帮助他们更好地使用手机上的功能。但我们也可以利用这些功能来做到辅助读屏、模拟点击的功能。

获取屏幕上的控件或点击对应的按钮,需要我们知道界面元素的资源 ID ,所幸这并不需要什么高超的破解技巧,只要使用旧版的 DDMS 对手机界面进行 Dump 就可以了。虽然每次微信升级后,由于混淆的原因,资源 ID 会发生变化,但重新适配的成本也比 Xposed 方案低的多。再退一步讲,即使不知道界面元素的资源 ID ,也可以通过按钮的文字等来区分,这样就完全不需要破解或 Dump 之类的工作了。

辅助功能的适用场景正好和 Xposed 方案相反。对于发消息,它的实现非常容易,只要你能找到正确的发送对象,接下来输入框和发送按钮都是固定的,直接模拟点击即可。在 Github 上也可以找到现成的实现。但如何判断收消息就困难了不少,因为你很难去监测收到消息这一不是我们主动触发的行为。在网上找到了两种不同的思路,其一是通过监测通知栏的变动,其二是通过监测聊天界面的改变。但两种方式的缺陷也很明显,前者通知栏的推送并不稳定,同时多条通知处理起来也比较麻烦;后者则必须停留在某人的聊天界面中才能监测到。

也正是因为这样的特点,使用辅助功能的玩法一般用于实现各类微信群发助手。群发助手天然符合它的长处:一方面只管发消息,不管收消息;另一方面,对于所有人发送消息,也避免了判断发送对象是否正确的烦恼。

这种玩法最大的优势在于完全合法,无需考虑被微信打击的因素。但缺点也很明显,模拟点击的原理使得你不得不为操作加上一些延迟,一些从代码层面来看很简单的操作(比如获取微信号 etc)也需要绕很大的圈子才能做到。同时它受外界影响极大,一旦手机出现些不可预知的卡顿,或其他界面弹出,或同时交流的人数过多,界面变化频繁时,自动执行的操作就会被打断,甚至产生消息发错对象的尴尬。这使它注定只能作为玩具,而无法成为大规模商业化的应用。

使用微信网页版 API

原理: Web 即意味着不设防,相比于其他客户端, Web 永远是防御力最薄弱的那个。另外 Web 并不是微信的主打方向,因此迭代速度较慢,版本适配难度也较低。只要破解了 Web API ,就可以模拟登录网页版微信收发消息了。

这个方法实在没有什么好说的,原理简单粗暴,以前的 Web QQ 也遭遇过这样的毒手。现在基于 Web 微信的机器人程序已经形成了一个庞大而成熟的开源社区,有着完善而优雅的 RESTful API 、命令行工具等。

Wechaty

相比前面两种方法,我认为这种做法是目前最成熟且具有可行性的。虽然这也属于破解的范畴,但是由于 Web 端的特定使然,微信并不能做出什么很有针对性的防御。不过微信并非没有采取措施。正如 Web QQ 现在已经被废弃一样,微信也一刀切地禁止了所有新注册帐号的 Web 端登录权限,坊间也一直有微信会取消 Web 版的传言。但即使微信不会取消 Web 版,光是新注册帐号无法登录这一举措,就使得这一方法未来的潜力大打折扣,沦为部分爱折腾的存量用户的玩具。另外,微信的风控体系,也会对那些明显超出频次调用接口的帐号进行临时的封禁,以阻止用户的为所欲为。

除了以上提到的几点, Web 版本身的功能也是有限的。除了简单的收发消息,进阶的功能比如收发红包、朋友圈等并没有相关的 API ,对于野心更大的开发者来说是个局限。另外,由于 Web 端走 HTTP 协议,对于收发消息的稳定性会比 Native 端略低。

其他途径

上述提到的三种是目前的主流技术,但可以看到都有比较大的局限性,因此也有不少人在探索新的解决方案,例如基于 iPad 版和 PC 版的破解。当然,也曾见到技术实力较高的团队,通过自行定制 Android ROM 的方式,提供软硬件一体的解决方案,对微信做大规模的 Hack 。不过以上方案在网上都鲜有公开的资料流出,一方面是为了低调防打击,另一方面也是将其作为商业化的手段。

结语

作为普通用户的我们难以想象基于微信这一看似封闭的 App 衍生出了多大的产业链。朋友圈的微商、公众号,还有现在的小程序和小游戏,已经完全可以支撑起一个像样的创业团队。也因此,对微信的破解成了一件十分有利可图的事,吸引了不少人前仆后继。对于时长脑洞大开的开发者如我,自然希望微信可以像 Telegram 那样开放出更多的 API ,以便把更多创意落到实处,但也理解关系链之于微信的重要性,明白这几乎就是天方夜谭。只是,对于那些把身家性命放在微信破解上的公司和开发者,就好像空中楼阁,被微信反手就能玩死,也未免太可悲了。

正在加载,请稍候……