0x00 前言:

一天一妹子跑来问我能不能做出学习通的刷课的软件,心想妹子问到,怎么可能说做不出来呢。于是我非常没有底气的说了一声我试试吧。

0x01 正文:

首先进入到了学习通的网页版,打算先了解一下网站的播放流程。
1.jpg
随便报名了一个课程,在看视频的过程中发现不能快进,焦点不能离开播放器,一离开视频就会自动暂停。根据自觉判断,这样的形式的话,有可能会在每次暂停之后开始播放都会做一个请求处理。

接下来我们来看一下在暂停状态中点击播放看看请求了什么。
2.png
可以看到,点击播放的时候请求了一个URL。返回结果是{"isPassed":false}。先来看看请求的URL带了些什么参数。
3.png

现在来重复几次请求试试,看看返回的参数,以及请求参数是否有什么变化。
4.png
重复点了几次请求后发现一个非常重要的地方。
“playingTime”参数以及“enc”参数是会变的,我们先看“playingTime”,这个参数是值是每次播放的当前时间,也就是说,我当前播放了10秒,暂停了。我在点播放,那么这个参数的值就为10
”enc“参数毫无疑问肯定是一个密钥,当这个密钥正确的时候才能正常执行请求。我们的主要目的就是它。
首先来分析一下“playingTime”具体作用到底是啥,如果它的值是当前播放的值,那么它是否就是类似于一个记录,记录你播放了该视频多长时间呢?为了验证这个想法,我们重新刷新网页看看。是否请求的时候带有“playingTime”

5.jpg
刷新之后,并没有出来任何时间上的东西。证明还没有触发这段视频对你的记录。点一下播放按钮。看下请求的时候,是否是直接跳到上一次播放的时间。

6.jpg
果然就是从上一次播放的时间开始,那么如果我们将“playingTime”修改成当前视频的完毕的时候,然后请求一次,我们是否就可以直接刷完这门课了呢?来尝试一下。这里可以看到视频一共9分38秒。也就是一共:578秒
我们看会参数。又有一个发现。就是”duration“,因此又可以得到一个信息”duration“参数就是为当前视频的最大时间。

7.png

https://mooc1-1.chaoxing.com/multimedia/log/ac88b7d520e3c79392c1ce36cf3dbfcc?duration=578&dtype=Video&objectId=4ae900fbed255f7bc97f59c2df9bfe2f&clazzId=1062578&clipTime=0_578&otherInfo=nodeId_92855388&userid=63068168&rt=0.9&jobid=1478252624518&view=pc&playingTime=578&isdrag=3&enc=0d4ba63456e7eef45bcacfca6914cc48

我们来直接把"playingTime"修改成最大时间。访问一下。不过肯定会出错的,因为还有一个enc值是需要变动的。

8.png
接下来,我们来找一下enc值到底是怎么算的,算法在哪个位置。按照我的直觉,一般这种算法都是会放在JS里面计算的,所以我们第一步,先把在加载播放页面的时候加载的js全部看一遍。

9.png
加载了非常多的js。我们不能盲目的去一个个看,得找到关键字样的js。比如有意思是加密,播放,视频等这类型的js文件。
"moocplayer_4.0.11.js"发现了一些关键的信息。

10.png
可以知道。这个请求的url就是从这个js里面处理而来。

11.png
这里是对处理过的url进行了一次ajax的请求。现在我们需要知道的就是这个enc加密方法是不是从这个js里面来的。

请求的url格式为:https://mooc1-1.chaoxing.com/multimedia/log/ + this.data.dtoken + url

可以从处理的URL看到后面的参数都是在this.data.dtoken里边的,而data的数据则是从调用MoocPlayer传入进来的值,我们找找哪个地方调用了MoocPlayer

12.png
在页面的上发现了调用的js代码。

13.png
发现参数又是从调用showMoocPlayer处传进来的。

14.png
最后得知这个dtoken是请求的一个url后得来的,我们搜索一下ananas看看到底是什么。

15.png
经过对比发现就是请求的这个url。看下返回值。

17.png
发现并不是跟enc相关。最后得到的URL为:最后请求的url格式为:https://mooc1-1.chaoxing.com/multimedia/log/ + ac88b7d520e3c79392c1ce36cf3dbfcc + ur

返回到代码处发现
18.png
url是从logFunc里面传进来的。所以我针对logFunc去搜索。发现页面上并没有任何地方调用了这个函数。于是针对播放字眼去对js一一排查。最后发现一个“cxplayer.4.0.5.js”文件
19.png
调用了logFunc函数的。
20.png
看到代码最上方发现有两个flash文件之后,我在想会不会通过flash对参数进行加密?
21.jpg
发现在加载请求请求的时候,网页只请求的是"player"这个flash文件。我们对这个flash文件下载下来,反编译看看。
22.png

最后果然在flash里面发现了对enc的计算。
loc5 = com.chaoxing.player.util.MD5.startMd("[" + arg1.clazzId + "]" + "[" + arg1.userid + "]" + "[" + arg1.jobid + "]" + "[" + arg1.objectId + "]" + "[" + loc4 * 1000 + "]" + "[d_yHJ!$pdA~5]" + "[" + int(arg1.duration) * 1000 + "]" + "[" + arg1.clipTime + "]");
发现就是参数拼接加上一段字符进行的一次md5加密。然后在调用js的logFunc。
接下来,我们来测试一下。
23.png
根据正常播放请求的参数,我们来套一下。之后测试是否真的与其enc一致。
[1062578][63068168][1478252624518][4ae900fbed255f7bc97f59c2df9bfe2f][61000][d_yHJ!$pdA~5][578000][0_578]将这一串进行md5加密。看下加密的md5是否匹配。
24.png
一致的。就是代表这个算法是正确的。
“61000”playingTime*1000得来的结果。如果我们想立刻刷完课,那就是duration*1000就是578000了。

[1062578][63068168][1478252624518][4ae900fbed255f7bc97f59c2df9bfe2f][578000][d_yHJ!$pdA~5][578000][0_578]
最后的URL为:

https://mooc1-1.chaoxing.com/multimedia/log/ac88b7d520e3c79392c1ce36cf3dbfcc?duration=578&dtype=Video&objectId=4ae900fbed255f7bc97f59c2df9bfe2f&clazzId=1062578&clipTime=0_578&otherInfo=nodeId_92855388&userid=63068168&rt=0.9&jobid=1478252624518&view=pc&playingTime=578&isdrag=3&enc=b243a6f3743462a3bf9792b8aaebabda

访问一下。
25.png
返回了true。
26.png
直接就秒刷完了。
我们试试1.12这章。
27.png
这样子我们就可以直接达到秒刷课的效果了。但是要注意。学习通会有一个检测功能的。检测到异常可能会导致你的课程全部清空需要重新学,或者扣学分的操作。

所以,看到这篇文章而且需要用到的朋友,请谨慎使用,后果本文作者一概不负责。