如何玩坏微信小游戏

如何玩坏微信小游戏

起因

微信小游戏有多火,毋需多言。从上线的第一天引爆朋友圈和群聊,到将近一个月持续热度的『跳一跳』风靡全国,再到最强『弹一弹』与『最强球球』再次点燃全场。更不乏『天天爱消除』、『头脑王者』等一系列全明星级别的现象级应用作为陪衬穿插其中。窥一斑而知全豹,仅看小游戏的受欢迎程度,便可知腾讯的实力雄厚。甚至令人后怕——一家企业能够很大程度上控制一个普通人的空闲时间,让这些时间产生价值,从中牟利;甚至还会有意无意地在期末考试期间发布爆款小游戏,实在免不了让我杨毅一番。控制了人的时间,就是控制了社会生产力,既羡慕又害怕,只是祈祷大企业不作恶显然是天方夜谭。

在小程序功能发布不久时,恰巧有机会尝试小程序的开发平台,其是基于wxml/wxss的一种网页应用。显然是面向轻量化、注重社交属性的应用。体验了一款叫做『小船分账』的小程序,整体的操作逻辑非常清晰。由于时间关系最后还是没有深入了解小程序,直到今天突发奇想。

随着一波『最强大脑』、『最强弹一弹』、『最强投篮』、『欢乐球球』、『欢乐斗地主』、『欢乐坦克大战』的刷屏,我也陷入了每天吸一下小程序的怪圈。今天玩儿完『加减大师』这个小游戏后不免生出几分惆怅:这TM也太难了!或许人的反馈系统就是不适合这类高频度低难度的操作。回想起一个猩猩做记忆测试的视频,经过几年的训练它们完全能够碾压人类。更别提机器在这种任务中所展现出的统治力了。说了这么多就是想给自己写挂找个借口

事不宜迟放狗搜索。果然已经有人在一两个星期前做过类似的工作了。去粗取精,我也来搞个小游戏外挂吧!

思路

从最初跳一跳火热时层出不穷的外挂看,真是八仙过海各显神通。从简单粗暴的直接改请求数据,到杀鸡用牛刀的模式识别辅助,再到工科浪漫的机械臂全自动控制系统,每个人都有自己的思路。同样的,对于这个任务,我也考虑了多种方案。

仿生

首先映入我脑海的就是猩猩。在屡战屡败倒在胜利大门之前时,我发扬了从自身找问题的优良传统,企图以更多次的尝试来攻破难关。直到我又一次悲伤地意识到,以人力撼动概率论是多么的可笑才收手。自然,我想到了OpenCV+机械臂这一万能无敌挂,但只是想想罢了。就像自动化测试中使用Selenium一样,让计算机模仿人的行为去做原本更适合计算机的工作,肯定会使效率大幅度下降。机械臂不可取,那么自然会想到Selenium。

模拟点击

模拟点击是自动化测试中不可少的一部分。想在这个游戏中开挂,自然是追求以最快速度选择正确答案。算数简直是计算机最擅长的工作了,问题便集中在如何让计算机得到所需算的数。

在此有两位长者校友亦可赛艇提供了他们的思路,也是最常见的解决这类问题的思路:让计算机“看”懂问题。通过截屏、分析图像中的数字和算符得到算式,然后算出结果比较后得出结论,最后点击对应的按钮。为了使程序的效率提高,最需要优化的便是“看”的过程——毕竟计算机并不擅长看人眼看到的世界。他们分别通过识别模型的学习与建立、分割像素点以寻找对应的数字来实现。同时,借助高效的投屏协议使计算机能够更快地看到屏幕上的图像。总之,他们的结果很不错,也初步达成了开挂的目的。

本来我就准备搭建环境开始开挂了,结果却遇到了棘手的问题:iOS并不支持投屏的反馈操作!也就是说,投屏到电脑确实能够获得当前的手机画面,但并不能通过鼠标和键盘对手机进行操作。而Android系统则没有这样的限制。归根到底还是iOS的权限限制带来的麻烦。我的解决思路当然是想办法攻破iOS的权限,于是找来越狱的iPad,鼓捣半天发现还是不能伪装成手机版的微信客户端。倒是顺道解决了一个问题,在微信APP根目录的info.plist里面设置UI适配类型,限制为1即可变为手机版的UI。手头没有安卓设备,我几乎已经放弃了,直到看到另一个repo得到了启发,从而重燃希望。

构造请求

这个po主的思路变了,既然无法让程序操控手机,那么还是由人来操作,但让计算机代替人的思考,只留下反应的时间,从而提高效率。看了他的JavaScript思路很明确了,就是劫持请求,由计算机给出答案,再让人不用动脑直接点击。但是js那一套我是见的不多了,还是Python搞起比较合适。

学习了一个以后发现逻辑很简单,对是对,错是错。使用mitmproxy库作为中间的代理服务器,劫持并分析请求的内容。改变请求从而使操作变骚。具体参见代码

崩坏

挂写好了,一切顺利。效果如下。

有了挂再也不怕做错了,轻松通关。据说通关有奖品?

没有条件?创造条件!

坑爹的是,前几天看的时候通关还有奖品呢,今天打开一看居然不再给奖品了。通关以后奖品数确实变成了1,但找遍界面竟然摘不到兑换入口。看来是被玩儿坏了!但是我还是不死心,既然是刚刚变成不能兑换,那么兑换页面的后台应该还没有下线。不如……不如……霸王硬上弓?!

从报错信息探求程序逻辑

很轻松地找到了兑换页面的地址:/send_gift。幸运的是,报错代码直接给出,方便分析表单的逻辑。哈,只是简单填入几个值POST一下就可以了。看来为了换娃娃绕了很多弯路啊!

话不多说,从代理服务器拿到token,通过Chrome Postman插件构造请求,直接把表单送出去了。顺带还学习了一个iPhone的UA格式,岂不美哉。

死皮赖脸POST个form

搞到这里,小程序的逻辑可谓一览无余。能不能得到娃娃完全就看对方够不够意思了。感觉自己甚至有点不要脸……如果想的话,完全可以拿个十个八个token填上不同的信息去刷表单。话说回来,用姓名地址手机号码换个娃娃真的值吗?在这个数据就是金钱的年代,宝贵的个人信息拿给人家去换一个不知道拿不拿得到的娃娃,简直亏大了好伐!

结语

俗话讲得好:“占小便宜吃大亏”。为了一个虚无缥缈的“通关虚荣感”花费一晚上时间,真的是不值当的。试想,这一晚上时间不算精力,光是金钱成本都有近50元。最后换来的仅仅是一个不知道是否存在的娃娃,以及一堆复用性不高的菜鸡代码。亏了,亏了!本可以刷题的时间就这么白白扔掉了。

之前有过类似精力的便是2014年的钱宝网。当时在好几个贴吧看到说这个网站免费发钱,可以白撸个U盘。本着不采白不采的想法,花了一大晚上注册俩邮箱填了两份信息,换来个U盘。当时觉得挺值,现在想想有点感叹。每个人都会有这样的阶段:看到一点点蝇头小利不费吹灰之力便可以得到,好像发现新大陆一般飞蛾扑火。或许我还没有完全脱离这个阶段,还会花费大把时间从事没有价值的活动。唉,真希望自己能够理性克制一点!

为了纪念一晚上的瞎忙活,恶狠狠地气鼓鼓地选了个小猪佩奇,也不知道能不能送到。毕竟

参考

https://gist.github.com/ImSingee/81e578392231541336acb7fc3c73019f

Chen Ting

Chen Ting

The page aimed to exhibit activities & achievements during Ting's undergraduate & graduate period. Meanwhile, other aspects such as lifestyles, literary work, travel notes, etc. would interweave in the narration.

Leave a Comment

Disqus might be GFW-ed. Excited!