最近答题类的应用实在是太火了,什么冲顶大会、百万英雄啊,动不动就几十上百万的奖金,着实让人看着非常眼红...而后本弱鸡学疏才浅...题目全靠蒙,便不凑什么热闹了。以后没过几日有个小程序却是在办公室里面火了一把,就是此次须要拿来开刀的《头脑王者》
,其实也是个答题的小程序,因此仍是不擅长就是了。虽然我不擅长答题,但我好歹是个程序员呀,因此我走上了一条程序员的通顶之路...node
每轮游戏须要答5题,全对而且快速做答才能拿到满分,满分是1200分。有了这种战绩,世界第一不是梦!固然玩游戏是为了乐趣,本弱鸡只是出于兴趣使然,这种答题类的游戏仍是本身玩比较有意思。git
在开始写这种游戏的辅助以前先思考几个问题。程序员
首先小程序的接口请求都是基于HTTPS的,具体捕获Https的方式我这边仍是采用Anyproxy去捕获,须要安装对应的Https证书才能够。以前的文章也有说起,这里再赘述一遍。 本文采用的Anyproxy,使用其余的代理工具也是同样的。github
1. 安装node.js
2. npm i -g anyproxy
3. anyproxy-ca // 生成证书
4. anyproxy -i // 以代理https的方式启动
// 而后手机端配置代理的IP及PORT,默认端口为8001,
// Anyproxy的WebService的默认端口为8002,这里能够查看到接口
// 手机端配置代理之后须要下载证书并信任,
// 苹果端的能够在手机的Safiri里面输入xxx.xxx.xxx.xxx:8002/fetchCrtFile的方式下载到证书
// 高版本的iOS可能须要在两处地方信任。
复制代码
配置完之后,打开游戏就能抓取到头脑王者对应的请求包了。我先模拟了一次好友对战,而后须要分析了哪些包是须要的。这里我就直接把一些重要的接口给贴出来了数据库
先从接口看一下,这是一个很是顺畅的游戏流程,可是拿到这些接口我就能够开始随心所欲了吗?显然是不可能的,若是每一个人都能有权限肆意使用别人的接口的话,岂不是能够很轻松的作到DDoS攻击或者很轻松地获取到本身想要的信息了吗?对于一家有经验的公司来讲显然是不会犯这种错误的,那么我随便拿一个接口来稍做分析。npm
上图是天梯排位匹配接口,从Body中能够看到须要传给服务端matchId、npcId、uid、t、sign五个参数,这5个参数都是必须的,只有有一个参数出错,那请求就没法成功,前四个其实好理解,关键是第五个签名参数sign,是怎么来的呢?小程序
这里就须要用到逆向工程了...简单的描述就是...拿到小程序中头脑王者压缩后的源码,并分析出其中的加密规则,篇幅有限,这里就直接描述其加密规则了。babel
sign的生成规则:Body内全部的参数(除去sign)+ token(login接口获取)并按照key值排序之后对齐进行MD5加密
, 好比uid=111, t=222, token=333,那么加密前子串应为t=222token=333uid=111markdown
既然sign也有了,那其实就很简单了,而后我就用node写一个简单的client去作伪造了接口请求。工具
目前也有许多冲顶大会、百万英雄的辅助,他们的思路是答题的时候快速识别到题目并进行快速的搜索题目进行辅助答题,但对于这款游戏,若是想实现精准的答题的话,最好的办法就是匹配题库,那么问题就是题库怎么来?固然是经过爬虫去爬取的了,OK...来让咱们找一找题库的接口!显然这是不可能的!要是对外开放了题库的接口,这个游戏也太容易被攻破了把。可是从上述的一步中,其实咱们已经实现了开房模拟对战了,那么是否是能够一直开房间一直对战的方式获取到题库呢?因此我这里采用的就是这种思路。
success是脚本自动答题打对的题目(一共5题),total是总共的题库数量。从这个规模能够看出来,正确率已是极高的了,说明题库的数量应该估计只有17000左右的范围,可是因为剩下的题库仍然在补充且最后的10%会须要较大的成本才能覆盖到,其实题库作到这一步已经足够了,80%+的满分几率...几乎已是无人匹敌了吧?
自动答题的方案有两种:
本弱鸡在这里使用的就是第二种方案(具体实现就不赘述了,你们能够直接看源码)
不太善于写文章,上述不少步骤都简单带过了,在这里只是简单地描述了一下过程,而后我会开源这部分的代码,写得有些简陋但愿各位大佬们不要嘲笑(因为在写Anyproxy的rule的时候无法使用babel,因此我用require取代了import)。最后但愿你们能给与我一点支持及确定,给点star吧...>.<
项目地址GitHub: 头脑王者辅助