背景
不知道从什么时候开始,学校的体育理论考试搞成了下载一个app然后在这上面考。。。本来觉得没什么,然后突然爆出这个app有一坨bug,安卓端多选题只能提交一个答案(后来发现原因是多选题提交答案时的while循环里多写了一个break。。。),导致分数奇低。虽然后来做了一个紧急修复,但从这也能看出开发人员的尿性。。。再后来,有个专门搞app的同学说他能够刷到满分,我稍微想了下,这种考试型app的逻辑能够被破解,无非有两个方法:第一种就是记录所有模拟题库中的题目和答案,然后比对考题进行提交;第二种就是他在把题目发送过来的时候顺带把答案也发送过来了,然后在本地做的成绩校验,最后把结果发回服务器。后来实际操作了下,发现app中的题库在考试阶段是关闭的,那么只就剩下第二种可能了。不得不说开发的同行们也是人才,发送考试卷子还会把答案发过来,而且报文还是明文未加密的,这不是成心勾人犯罪么。。。
这样,思路有了,下面就是操作了。说白了,我们需要做的就是抓包分析,分析他前后台传送的http报文,然后模拟考试。
抓包分析
跟抓网页不一样,这次是抓手机的包,那么就需要用电脑来代理手机的网络,具体做法详见Fiddler代理如何配置。这里讲的很清楚了,不过需要注意的是默认的端口8888可能会被一些程序占用,无法使用的时候换一个端口号即可。
当然首先电脑跟手机得是一个局域网,我这里当然是校园网。
顺便提一句,这个方法还可以用一个网关登陆N多个终端。。。不过目测是分享带宽的。。。
代理配置好之后,打开app,考一次试(这将浪费一次考试机会),记录下fiddler抓到的报文:
一、登陆
request
1 | POST http://appsrv.ihodoo.com/login HTTP/1.1 |
respond
1 | { |
登陆的过程就是把用户名密码post过去,然后他会返回给你一堆信息,这里显示了json数据部分,意思也都很清楚,尤其注意那个token。
二、进入考试
request
1 | GET http://appsrv.ihodoo.com/auth/exam/enterIndex?uid=17751129083&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb HTTP/1.1 |
respond
1 | { |
这是进入考试的提醒,把uid和token用Get方法传过去,他会返回你即将得到的考卷的信息,包括某编号(id)、题目数(totalSubCount)、试卷编号(examPaperId)。
三、获得考卷
request
1 | GET http://appsrv.ihodoo.com/auth/exam/start/10/318367?uid=17751129083&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb&totalCount=50 HTTP/1.1 |
respond
1 | { |
这是获得考卷的过程,把id、examPaperId、uid、token、totalSubCount传过去即可,得到一堆试题。。。。。。这里取三种典型题目,第一个是单选题,第二个是判断题,第三个是多选题。每道题都有题目内容,题目编号,题目顺序(由于json是不保证顺序的,因此需要有个sort来控制顺序)、题目选项、以及题目答案。。。
四、模拟做题
request
1 | GET http://appsrv.ihodoo.com/auth/exam/select/318367/38861?selectOptions=B,C&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb&uid=17751129083 |
返回结果大概就是提交成功之类的。
这个过程其实就是把每道题的id、答案加上自己的uid和token一起发过去,非常简单。
五、提交试卷
request
1 | GET http://appsrv.ihodoo.com/auth/exam/submit/318367?uid=17751129083&token=afa6da18-0fd2-476c-93df-4a2e3b0263eb HTTP/1.1 |
respond
1 | { |
套路跟上面一样。。。最后发现我得了6.0分。。。