关于超星学习通视频加密分析

学校又有新的课程要观看了,没办法,只能上才艺了

对于像这种网课类的观看,发送的数据请求一般都是ajax,携带的关键参数大致如下

  • 当前的观看时间
  • 当前观看的课程章节id
  • 当前课程的id

随便找了一个课程,发送的数据如下

因为我已经分析过了,就直接告诉大家,发送数据的参数只有enc是不断变化的,且用js加密生成,objectid和ontherinfo针对当前所看的课程章节是不变的,
观看其他的课程就会发生相对的变化,好了,通过单词的字面意思大致知道意思,接下来我们就要分析enc是怎么生成的,好模拟发送对应的请求

找js的方法有很多,这里就不介绍了,网上一大堆方法,我这里通过发送对应的ajax的initiator找到了相关的js文件

我这里为了方便观看,直接提取出关键的js代码

var format = "[{0}][{1}][{2}][{3}][{4}][{5}][{6}][{7}]"
var clipTime = (params.startTime || "0") + "_" + (params.endTime || params.duration);
var enc = Ext.String.format(format, params.clazzId, params.userid, params.jobid ? params.jobid : "", params.objectId, currentTimeSec * 1000, "d_yHJ!$pdA~5", params.duration * 1000, clipTime);
var rurl = [params.reportUrl, "/", params.dtoken, "?clazzId=", params.clazzId, "&playingTime=", currentTimeSec, "&duration=", params.duration, "&clipTime=", clipTime, "&objectId=", params.objectId, "&otherInfo=", params.otherInfo, "&jobid=", params.jobid, "&userid=", params.userid, "&isdrag=", isdrag, "&view=pc", "&enc=", md5(enc), "&rt=", params.rt, "&dtype=Audio", "&_t=", new Date().getTime()].join("");

为了更方便的观看数据,我已经提前打好了断点,拿到了数据,可以看到enc其实是拿对应的参数进行字符串的拼接,然后做md5签名
我们已经知道了enc是怎么生成的,然后我们需要知道其他的参数怎么来的,前面已经说过,既然这些参数是不变的,那么一般都会在页面刚加载的时候就已经生成了
我们对其中任一一个固定的值进行全文检索

 mArg = {"attachments":[{"headOffset":139000,"jobid":"1581681271463334","otherInfo":"nodeId_305814262-cpi_67960467","isPassed":false,"property":{"jobid":"1581681271463334","switchwindow":"true","size":1025113278,"fastforward":"true","hsize":"977.62 MB","module":"insertvideo","name":"3.5 从“全面建设小康”到“全面建成小康”.mp4","mid":"9733390305491581681270487","type":".mp4","objectid":"9c3a5a79e7d0473b06409f9bb566acad","_jobid":"1581681271463334"},"mid":"9733390305491581681270487","playTime":139000,"job":true,"type":"video","objectId":"9c3a5a79e7d0473b06409f9bb566acad"}],"defaults":{"fid":"1982","isFiled":0,"ignoreVideoCtrl":0,"reportUrl":"https://mooc1-1.chaoxing.com/multimedia/log/a/67960467","userid":"82506971","reportTimeInterval":60,"initdataUrl":"https://mooc1-1.chaoxing.com/richvideo/initdatawithviewer","knowledgeid":305814262,"qnenc":"4d74ade22640d3418796027099215e30","defenc":"9e694cf3bbb44d0d9764fa88acfb3dd5","clazzId":25967418,"cardid":274708987,"imageUrl":"https://p.ananas.chaoxing.com/star3/origin/3a7c4e2929905646967168696f78ff01.png","lastmodifytime":1588505782000,"state":0,"courseid":211852763,"subtitleUrl":"https://mooc1-1.chaoxing.com/richvideo/subtitle"},"control":true};

这里面的值差不多就是提交ajax的参数了

我们可以通过请求这个url,来拿到对应的数据,这里的knowledgeid就是chapterid
写到这里,感觉参数都拿的差不多了,可以试着来模拟一下请求,发送数据了

当我看到请求的url时,纳尼,怎么连url都有对应的参数,通过上面mArg中的reportUrl可以看出只有后面的一串数字是变化的
到目前为止,我们还有两个参数没有拿到,一个是请求url的最后一串数字,还有一个duration

其实请求url的最后一串数字就是dtoken

像这种参数的话,一般都是在请求课程页面的时候,会发送ajax获取到相关的数据

这个请求返回了我们要找的dtoken和duration

但这个请求后面的url是通过objectid来拼接的

到目前为止,我们已经找到了发送请求的所有数据了,可能有点乱,我来总结一下步骤

  1. 通过课程的首页拿到每一个章节的chapterid和clazzid,courseid

  2. 通过之前拿到的courseid,clazzid,chapterid来请求这个url,拿到mArg里面的数据

  3. 拿到了objectid,对这个url进行请求,拿到duration和dtoken

  4. 对拿到的所有数据进行封装,最后发送ajax请求修改观看的时间

叮叮叮,大功告成了,因为超星的检测比较严,过度的请求会出异常,所以自己看着来就好了,上述教程只供学习使用

posted @ 2020-05-04 12:20  WillWeson  阅读(2936)  评论(12编辑  收藏  举报