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

前言

分析

获取小程序源码

接口参数

使用fiddler中间代理. 抓取接口相对头脑王者没多大变化.

我们的工作无非是伪造请求数据. 获取返回数据.

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数据. 方便快捷

好友对战

排位辅助

问题如何与代理工具交互 获取拦截的数据

总结

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

0

Powered by Jekyll and Theme by solid