###0x00 前言: 一天一妹子跑来问我能不能做出学习通的刷课的软件,心想妹子问到,怎么可能说做不出来呢。于是我非常木有底气的说了一声我试试吧(表示在这妹子之前,我都没有听过学习通这个名字)。 ###0x01 正文: 首先进入到了学习通的网页版,打算先了解一下网站的播放流程。 ![1.jpg][1] 随便报名了一个课程,在看视频的过程中发现不能快进,焦点不能离开播放器,一离开视频就会自动暂停。根据自觉判断,这样的形式的话,有可能会在每次暂停之后开始播放都会做一个请求处理。 接下来我们来看一下在暂停状态中点击播放看看请求了什么。 ![2.png][2] 可以看到,点击播放的时候请求了一个URL。返回结果是` {"isPassed":false} `。先来看看请求的URL带了些什么参数。 ![3.png][3] 现在来重复几次请求试试,看看返回的参数,以及请求参数是否有什么变化。 ![4.png][4] 重复点了几次请求后发现一个非常重要的地方。 `“playingTime”`参数以及`“enc”`参数是会变的,我们先看`“playingTime”`,这个参数是值是每次播放的当前时间,也就是说,我当前播放了10秒,暂停了。我在点播放,那么这个参数的值就为`10`。 `”enc“`参数毫无疑问肯定是一个密钥,当这个密钥正确的时候才能正常执行请求。我们的主要目的就是它。 首先来分析一下`“playingTime”`具体作用到底是啥,如果它的值是当前播放的值,那么它是否就是类似于一个记录,记录你播放了该视频多长时间呢?为了验证这个想法,我们重新刷新网页看看。是否请求的时候带有`“playingTime”` ![5.jpg][5] 刷新之后,并没有出来任何时间上的东西。证明还没有触发这段视频对你的记录。点一下播放按钮。看下请求的时候,是否是直接跳到上一次播放的时间。 ![6.jpg][6] 果然就是从上一次播放的时间开始,那么如果我们将`“playingTime”`修改成当前视频的完毕的时候,然后请求一次,我们是否就可以直接刷完这门课了呢?来尝试一下。这里可以看到视频一共`9分38秒`。也就是一共:`578秒`。 我们看会参数。又有一个发现。就是`”duration“`,因此又可以得到一个信息`”duration“`参数就是为当前视频的最大时间。 ![7.png][7] >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][8] 接下来,我们来找一下`enc`值到底是怎么算的,算法在哪个位置。按照我的直觉,一般这种算法都是会放在JS里面计算的,所以我们第一步,先把在加载播放页面的时候加载的js全部看一遍。 ![9.png][9] 加载了非常多的js。我们不能盲目的去一个个看,得找到关键字样的js。比如有意思是加密,播放,视频等这类型的js文件。 在`"moocplayer_4.0.11.js"`发现了一些关键的信息。 ![10.png][10] 可以知道。这个请求的url就是从这个js里面处理而来。 ![11.png][11] 这里是对处理过的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][12] 在页面的上发现了调用的js代码。 ![13.png][13] 发现参数又是从调用`showMoocPlayer`处传进来的。 ![14.png][14] 最后得知这个`dtoken`是请求的一个url后得来的,我们搜索一下ananas看看到底是什么。 ![15.png][15] 经过对比发现就是请求的这个url。看下返回值。 ![17.png][16] 发现并不是跟enc相关。最后得到的URL为:最后请求的url格式为:`https://mooc1-1.chaoxing.com/multimedia/log/ + ac88b7d520e3c79392c1ce36cf3dbfcc + ur` 返回到代码处发现 ![18.png][17] `url`是从`logFunc`里面传进来的。所以我针对`logFunc`去搜索。发现页面上并没有任何地方调用了这个函数。于是针对播放字眼去对js一一排查。最后发现一个`“cxplayer.4.0.5.js”`文件 ![19.png][18] 调用了`logFunc`函数的。 ![20.png][19] 看到代码最上方发现有两个`flash`文件之后,我在想会不会通过`flash`对参数进行加密? ![21.jpg][20] 发现在加载请求请求的时候,网页只请求的是`"player"`这个`flash`文件。我们对这个`flash`文件下载下来,反编译看看。 ![22.png][21] 最后果然在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][22] 根据正常播放请求的参数,我们来套一下。之后测试是否真的与其`enc`一致。 `[1062578][63068168][1478252624518][4ae900fbed255f7bc97f59c2df9bfe2f][61000][d_yHJ!$pdA~5][578000][0_578]`将这一串进行md5加密。看下加密的md5是否匹配。 ![24.png][23] 一致的。就是代表这个算法是正确的。 `“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][24] 返回了true。 ![26.png][25] 直接就秒刷完了。 我们试试1.12这章。 ![27.png][26] 这样子我们就可以直接达到秒刷课的效果了。但是要注意。学习通会有一个检测功能的。检测到异常可能会导致你的课程全部清空需要重新学,或者扣学分的操作。 **所以,看到这篇文章而且需要用到的朋友,请谨慎使用,后果本文作者一概不负责。** [1]: http://www.bugsafe.cn/usr/uploads/2017/12/298390544.jpg [2]: http://www.bugsafe.cn/usr/uploads/2017/12/1009479643.png [3]: http://www.bugsafe.cn/usr/uploads/2017/12/65276626.png [4]: http://www.bugsafe.cn/usr/uploads/2017/12/509008810.png [5]: http://www.bugsafe.cn/usr/uploads/2017/12/673476644.jpg [6]: http://www.bugsafe.cn/usr/uploads/2017/12/2049676613.jpg [7]: http://www.bugsafe.cn/usr/uploads/2017/12/2873427839.png [8]: http://www.bugsafe.cn/usr/uploads/2017/12/1134101023.png [9]: http://www.bugsafe.cn/usr/uploads/2017/12/221454616.png [10]: http://www.bugsafe.cn/usr/uploads/2017/12/3798015713.png [11]: http://www.bugsafe.cn/usr/uploads/2017/12/3249222666.png [12]: http://www.bugsafe.cn/usr/uploads/2017/12/1718058716.png [13]: http://www.bugsafe.cn/usr/uploads/2017/12/1428537470.png [14]: http://www.bugsafe.cn/usr/uploads/2017/12/3686241687.png [15]: http://www.bugsafe.cn/usr/uploads/2017/12/3140460782.png [16]: http://www.bugsafe.cn/usr/uploads/2017/12/530630911.png [17]: http://www.bugsafe.cn/usr/uploads/2017/12/530536632.png [18]: http://www.bugsafe.cn/usr/uploads/2017/12/3213686983.png [19]: http://www.bugsafe.cn/usr/uploads/2017/12/3590236721.png [20]: http://www.bugsafe.cn/usr/uploads/2017/12/3423550459.jpg [21]: http://www.bugsafe.cn/usr/uploads/2017/12/2852907552.png [22]: http://www.bugsafe.cn/usr/uploads/2017/12/901881933.png [23]: http://www.bugsafe.cn/usr/uploads/2017/12/1428672282.png [24]: http://www.bugsafe.cn/usr/uploads/2017/12/1026646838.png [25]: http://www.bugsafe.cn/usr/uploads/2017/12/283719852.png [26]: http://www.bugsafe.cn/usr/uploads/2017/12/2227743681.png