超星学习通协议分析

这几天学校又让刷学习通的网课,看了一下,视频挺多,有90多课,于是就想分析一下学习通的视频进度保存的协议,伪造请求发送给服务器,达到视频不用看直接过,话不多说,开始正文:
首先点开视频再返回,fiddler抓包看一下,这里抓到了一个请求:



关键内容如下:
GET /multimedia/log/a/69553433/226af628bb8ff118d743aff040f376b3?otherInfo=nodeId_143057010&playingTime=329&duration=903&akid=null&jobid=1466044408893&clipTime=0_903&clazzId=8502942&objectId=7f1bd7024ea1de627d15b1ac51d2388b&userid=xxxxxx&isdrag=2&enc=32455dcffa4efae69d837ce13327834b&dtype=Video&view=json HTTP/1.1
又抓了一个包:
GET /multimedia/log/a/69553433/226af628bb8ff118d743aff040f376b3?otherInfo=nodeId_143057010&playingTime=330&duration=903&akid=null&jobid=1466044408893&clipTime=0_903&clazzId=8502942&objectId=7f1bd7024ea1de627d15b1ac51d2388b&userid=xxxxxx&isdrag=2&enc=4d4f1c803cf9004d8b3d31f3141ad6e6&dtype=Video&view=json HTTP/1.1
对比一下可以发现变化的部分只有两个一个是playingTime字段另一个是enc字段,这里分析一下playingTime应该是视频进度时间,duration是视频总时间,单位是秒,现在就只剩下一个enc了,这个enc应该是校验字段,接下来就分析一下enc的值是怎么得到的,首先在Androidkiller中打开学习通,搜索enc可能得到太多结果,这里我搜索playingTime,一共搜到了三个结果:



前两个看起来差不多,随便点进一个看看,往上翻了翻,看到一堆字符串拼接:



在JEB中打开看一下:



很明显这里就是拼接字符串的地方,这个v5[9]中储存的就是enc的值,v5[9]中的值来自v1_1,接下来看一下v1_1的值是什么
[Java] 纯文本查看 复制代码

String v1_1 = com.fanzhou.d.l.b("[" + this.V + "][" + v4 + "][" + this.T.getJobid() + "][" + this.T.getObjectid() + "][" + v1 * 1000 + "][" + "d_yHJ!$pdA~5" + "][" + this.aV * 1000 + "][" + this.aW + "]");

可以看到v1_1就是b方法的返回值,这些this.V这些分别对应下面的那些值,这里就不一一分析了,进入b方法看一下



明显可以看出是md5加密,现在就很明了了,enc的值就是[]+上面那些值加盐值d_yHJ!$pdA~5拼接后的md5的值
至于jobid,objectId这些字段的值抓包分析一下我的课程页面,和课程本身页面 都可以构造url从服务器请求到

接下来分析一下学习通的登陆协议
首先还是抓包分析,这是抓取的数据
POST http://passport2.chaoxing.com/xxt/loginregisternew?token=4faa8662c59590c6f43ae9fe5b002b42&_time=1560511025758&inf_enc=d20cc428ce717f08156ae9e6201b4467 HTTP/1.1
Accept-Language: zh_CN
Cookie:
Content-Length: 727
Content-Type: multipart/form-data; boundary=vj2gwfmP-DxuCIPFN8zUcQ-ZGzXQFa4FJ7pQ
Host: passport2.chaoxing.com
Connection: Keep-Alive
User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; SM-G9350 Build/LMY48Z) com.chaoxing.mobile/ChaoXingStudy_3_5.21_android_phone_206_1 (SM-G9350; Android 5.1.1; zh_CN)_1969814533

--vj2gwfmP-DxuCIPFN8zUcQ-ZGzXQFa4FJ7pQ
Content-Disposition: form-data; name="uname"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

zhanghao  //这是账号
--vj2gwfmP-DxuCIPFN8zUcQ-ZGzXQFa4FJ7pQ
Content-Disposition: form-data; name="code"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

mimamima  //这是密码
--vj2gwfmP-DxuCIPFN8zUcQ-ZGzXQFa4FJ7pQ
Content-Disposition: form-data; name="loginType"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

1
--vj2gwfmP-DxuCIPFN8zUcQ-ZGzXQFa4FJ7pQ
Content-Disposition: form-data; name="roleSelect"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

true
--vj2gwfmP-DxuCIPFN8zUcQ-ZGzXQFa4FJ7pQ--

这里用了multipart/form-data请求,是post的变种,有兴趣的可以去搜一下,这里就不讲了
可以看到,账号密码都是明文,
经过多次抓包发现这个token竟然是不变的,_time是现在的时间,这样就只用分析inf_enc
androidkiller搜索inf_enc



搜索出来两个结果,看着第一个更像一点,在jeb中打开



一开始看到deskey还以为是des加密,没想到点进去还是md5



那现在就只用分析arg3和arg4是什么,先交叉引用看一下



发现有两地方引用了这个方法,随便点进去一个看看,有交叉引用了一下,还是有两地方引用



懒得一个一个看了,这里我又搜索了一下loginregisternew?,这次就只搜到了一个结果



jeb打开



一步一步往下走




进入b方法看一下



这里是一个字符串拼接,就是给token _time赋值
返回上一个方法,进入f方法



接着往下



这里就到了之前找到的关键方法,现在就知道arg3和arg4是什么了
arg3="Z(AfY@XS"
arg4="token="+值+“&_time=”+值
所以inf_enc就是md5("token="+值+“&_time=”+值+"Z(AfY@XS")

下面是我写好的脚本:


ps:因为我只有一门网课,所以抓到的数据都是一门课的数据,没有做多门网课数据的处理,所以有多个网课的同学使用此脚本可能会出现bug
另外,此脚本只能刷视频,不能刷题

地址: https://github.com/jiangyei/fakechaoxing

THE END
喜欢就支持以下吧
点赞1
分享
评论 抢沙发
管埋员的头像-小北的自留地

昵称

取消
昵称