获取知乎答题王题库&排位辅助

前言

  • 参见头脑王者辅助项目,想造一个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: 这两个时间参数找了好久,上点代码

后面的时间获取都是通过调用getServerTime获取时间.
cfTime 是获取题目信息请求与得到题目信息返回数据两次getServerTime的时间差. ccTime是发送choose请求时调用getServerTime的值…….. 这么多时间参数应该是为了对战更精确计算分值.

这两个参数的构造我偷了个懒,直接获取当前时间代替getServerTime. 测试能用

至此,所有需要的参数我们都能构造了.

数据存储

使用Mongodb持久保存json数据. 方便快捷

好友对战

  1. player1请求开房
  2. player2进入房间
  3. 开始答题
  4. 获取题目,选择题目.重复5次
  5. 获取比赛结果 选手退出房间 goto 1

排位辅助

  • 既然所有参数都能构造,完成自动排位不是不可能.
  • 知道了magic,修改返回数据应该也能逃过作弊检测.
  • 我这里舍难求易,拦截题目信息,数据库查找在终端显示答案.

问题如何与代理工具交互 获取拦截的数据
– fiddler 可以写js脚本保存拦截数据到本地. python轮询获取
– anyproxy 、charles… 没了解
– 喜好找到了一个mitmproxy python写的代理工具.了解了一下 提供了回调接口. pip install 一下就行…挺方便的.就用它吧.

总结

因为之前了解过跳一跳,星途之类的辅助…反编译了小程序. 手机抓包学习了中间人攻击. 想着不实践一下有点浪费.本来js不怎么会. 看反编译变量替换过变量的js 简直痛苦. 告一段落.预习面经