分析超星学习通加密算法&&秒刷课分析
0x00 前言:
一天一妹子跑来问我能不能做出学习通的刷课的软件,心想妹子问到,怎么可能说做不出来呢。于是我非常没有底气的说了一声我试试吧。
0x01 正文:
首先进入到了学习通的网页版,打算先了解一下网站的播放流程。
随便报名了一个课程,在看视频的过程中发现不能快进,焦点不能离开播放器,一离开视频就会自动暂停。根据自觉判断,这样的形式的话,有可能会在每次暂停之后开始播放都会做一个请求处理。
接下来我们来看一下在暂停状态中点击播放看看请求了什么。
可以看到,点击播放的时候请求了一个URL。返回结果是{"isPassed":false}
。先来看看请求的URL带了些什么参数。
现在来重复几次请求试试,看看返回的参数,以及请求参数是否有什么变化。
重复点了几次请求后发现一个非常重要的地方。“playingTime”
参数以及“enc”
参数是会变的,我们先看“playingTime”
,这个参数是值是每次播放的当前时间,也就是说,我当前播放了10秒,暂停了。我在点播放,那么这个参数的值就为10
。”enc“
参数毫无疑问肯定是一个密钥,当这个密钥正确的时候才能正常执行请求。我们的主要目的就是它。
首先来分析一下“playingTime”
具体作用到底是啥,如果它的值是当前播放的值,那么它是否就是类似于一个记录,记录你播放了该视频多长时间呢?为了验证这个想法,我们重新刷新网页看看。是否请求的时候带有“playingTime”
刷新之后,并没有出来任何时间上的东西。证明还没有触发这段视频对你的记录。点一下播放按钮。看下请求的时候,是否是直接跳到上一次播放的时间。
果然就是从上一次播放的时间开始,那么如果我们将“playingTime”
修改成当前视频的完毕的时候,然后请求一次,我们是否就可以直接刷完这门课了呢?来尝试一下。这里可以看到视频一共9分38秒
。也就是一共:578秒
。
我们看会参数。又有一个发现。就是”duration“
,因此又可以得到一个信息”duration“
参数就是为当前视频的最大时间。
我们来直接把"playingTime"
修改成最大时间。访问一下。不过肯定会出错的,因为还有一个enc值是需要变动的。
接下来,我们来找一下enc
值到底是怎么算的,算法在哪个位置。按照我的直觉,一般这种算法都是会放在JS里面计算的,所以我们第一步,先把在加载播放页面的时候加载的js全部看一遍。
加载了非常多的js。我们不能盲目的去一个个看,得找到关键字样的js。比如有意思是加密,播放,视频等这类型的js文件。
在"moocplayer_4.0.11.js"
发现了一些关键的信息。
可以知道。这个请求的url就是从这个js里面处理而来。
这里是对处理过的url进行了一次ajax
的请求。现在我们需要知道的就是这个enc加密方法是不是从这个js里面来的。
请求的url格式为:https://mooc1-1.chaoxing.com/multimedia/log/ + this.data.dtoken + url
可以从处理的URL看到后面的参数都是在this.data.dtoken
里边的,而data的数据则是从调用MoocPlayer
传入进来的值,我们找找哪个地方调用了MoocPlayer
。
在页面的上发现了调用的js代码。
发现参数又是从调用showMoocPlayer
处传进来的。
最后得知这个dtoken
是请求的一个url后得来的,我们搜索一下ananas看看到底是什么。
经过对比发现就是请求的这个url。看下返回值。
发现并不是跟enc相关。最后得到的URL为:最后请求的url格式为:https://mooc1-1.chaoxing.com/multimedia/log/ + ac88b7d520e3c79392c1ce36cf3dbfcc + ur
返回到代码处发现url
是从logFunc
里面传进来的。所以我针对logFunc
去搜索。发现页面上并没有任何地方调用了这个函数。于是针对播放字眼去对js一一排查。最后发现一个“cxplayer.4.0.5.js”
文件
调用了logFunc
函数的。
看到代码最上方发现有两个flash
文件之后,我在想会不会通过flash
对参数进行加密?
发现在加载请求请求的时候,网页只请求的是"player"
这个flash
文件。我们对这个flash
文件下载下来,反编译看看。
最后果然在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。
接下来,我们来测试一下。
根据正常播放请求的参数,我们来套一下。之后测试是否真的与其enc
一致。[1062578][63068168][1478252624518][4ae900fbed255f7bc97f59c2df9bfe2f][61000][d_yHJ!$pdA~5][578000][0_578]
将这一串进行md5加密。看下加密的md5是否匹配。
一致的。就是代表这个算法是正确的。“61000”
是playingTime*1000
得来的结果。如果我们想立刻刷完课,那就是duration*1000
就是578000
了。
[1062578][63068168][1478252624518][4ae900fbed255f7bc97f59c2df9bfe2f][578000][d_yHJ!$pdA~5][578000][0_578]
最后的URL为:
访问一下。
返回了true。
直接就秒刷完了。
我们试试1.12这章。
这样子我们就可以直接达到秒刷课的效果了。但是要注意。学习通会有一个检测功能的。检测到异常可能会导致你的课程全部清空需要重新学,或者扣学分的操作。
版权声明:分析超星学习通加密算法&&秒刷课分析,本文出处:Poacher's Blog
本文链接:http://bugsafe.cn/archives/20.html
如非特别注明,本站内容均为博主原创,转载请务必注明作者和原始出处。
4ngle回复
楼主你好 文章写得很精彩 我最近也在写刷课软件 但是看不懂actionscript 请问一下加密enc的是哪一个as
Poacher回复
player_4.1.11.swf 这个呢