获取知乎答题王题库与排位辅助
-
参考文章 我是如何次次《头脑王者》获得满分的
前言
- 参见头脑王者辅助项目,想造一个python版的。实践之前了解的https. 架好势的那天,头脑王者违规下线… 过了半个月知乎答题王”全新”上线. 闲着没事再捡起这个…
分析
获取小程序源码
- root后的安卓手机在微信目录下可找到小程序包
- 这里 对小程序包进行了分析,并提供了解包工具. 解包可以获得小程序源码. 这次的知乎答题王源码都集中在了
aap-service.js
内. 格式化后,大概能阅读.
接口参数
使用fiddler中间代理. 抓取接口相对头脑王者没多大变化.
- intoRoom: 进入房间
- login: 请求登录
- findQuiz: 获取题目
- choose: 选择答案
- fightResult: 获取比赛结果
我们的工作无非是伪造请求数据. 获取返回数据.
- login请求包含微信生成的openid验证这个不好模拟. 只能重返回数据取得cookie: token 和 uid 做后面的身份验证.
- intoRoom请求参数如下:
roomID=-1&uid=*****&t=1519878599411&sign=af47d27f9852373ac87a3bccd9d23e8c
a. roomID是开房对战房间号,-1表示初始化房间.返回数据会包含房间号 b. uid是login得到的用户id,t为时间戳. c. 关键是sign参数. 在前面提到的参考文章中已经介绍了它的生成方式…想学习一下去源码找到了位置. 发现签名方式略有改动:
将当前所有请求参数加上时间戳加上token和uid的拼接值升序排列进行十六进制md5加密 例: roomID=111&t=222&uid=333&token=444则排序整理后得: roomID=111t=222token=444333uid=333 进行md5加密后得到sign的值
然后所有请求的sign参数都是同样构造,唯一有问题的在choose请求新增了很多奇怪的参数:
roomID=112675704&quizNum=1&option=1&magic=228843a2d2def32805f53d06a247e3f6 &cfTime=317&ccTime=1519870891736&uid=*****t=1519870891868 &sign=6659e1636f3d64059df7e7bb814a545a
a. quizNum代表当前比赛的第几个题目,从0开始计数. option是选择答案序号,1开始计数.
b. magic: 一串乱码,看来也是加密数据. 读源码发现 这是当前题目4个选项升序拼接后md5加密的结果…这个参数应该是检测某些辅助修改选项标记答案.
c. ccTime,cfTime: 这两个时间参数找了好久,上点代码
{
key: "setServerTime",
value: function(e) {
l.serverTime = 1e3 * e, //e 登陆时服务器返回的时间,在login的返回数据中有sysTime 服务器时间舍去了后三位,可能是去掉网络耗时吧
l.time = (new Date).getTime() //登录成功返回后设置本机系统时间
}
},
{
key: "getServerTime",
value: function() {
if (!l.serverTime) return (new Date).getTime();
var e = new Date(l.serverTime).getTime();
return (new Date).getTime() + (e - l.time)//加上服务器与本机时间差
}
}
后面的时间获取都是通过调用getServerTime获取时间. cfTime 是获取题目信息请求与得到题目信息返回数据两次getServerTime的时间差. ccTime是发送choose请求时调用getServerTime的值…….. 这么多时间参数应该是为了对战更精确计算分值.
这两个参数的构造我偷了个懒,直接获取当前时间代替getServerTime. 测试能用
至此,所有需要的参数我们都能构造了.
数据存储
使用Mongodb持久保存json数据. 方便快捷
好友对战
- 好友对战实现完全照搬头脑王者项目
- player1请求开房
- player2进入房间
- 开始答题
- 获取题目,选择题目.重复5次
- 获取比赛结果 选手退出房间 goto 1
排位辅助
- 既然所有参数都能构造,完成自动排位不是不可能.
- 知道了magic,修改返回数据应该也能逃过作弊检测.
- 我这里舍难求易,拦截题目信息,数据库查找在终端显示答案.
问题如何与代理工具交互 获取拦截的数据
- fiddler 可以写js脚本保存拦截数据到本地. python轮询获取
- anyproxy 、charles… 没了解
- 喜好找到了一个mitmproxy python写的代理工具.了解了一下 提供了回调接口. pip install 一下就行…挺方便的.就用它吧.
总结
因为之前了解过跳一跳,星途之类的辅助…反编译了小程序. 手机抓包学习了中间人攻击. 想着不实践一下有点浪费.本来js不怎么会. 看反编译变量替换过变量的js 简直痛苦. 告一段落.预习面经
- 上一篇 wordpress使用disquss
- 下一篇 zookeeper-1