1.前言
书接上文,后面我突然发现,之前搞的那部分是智慧树的翻转课部分,但是同学们一般需要刷的都是共享课部分
剩下的三个部分后面会逐一解决,这个共享课与之前搞的翻转课有点不同,在看视频看到一半的时候会跳出答题提醒
还是那句话,我们只需要找到那几个关键的包就大功告成了,它再有什么乱七八糟的功能,到最后无非还是要往后端服务器发请求
2. 代码实现
2.1 无限debugger
在播放视频的网页打开开发者工具,又出现了无限debugger
沿着堆栈向上分析
发现代码被混淆了,为了提高可读性,我们手动把黄线部分解混淆一下
这是解混淆后的结果,可以看到这是用constructor构造出来的无限debugger,和上次那个Function构造出来的又不一样了
注入一下hook代码过掉无限debugger
2.2 分析响应的包
我们随便点击一个视频,服务器给我们响应了这些包
那些.mp4就是服务器响应的视频数据,当然了这不是我们关心的包,剩下的prelearningNote,loadVideoPointInfo这种走接口的包我们多关注一下
查看一下这些接口包,发现他们向服务器发送的请求内容都被加密了
查看prekearningNote的响应内容
这个id可能等会能用得上,先记住
再查看一下loadVideoPointInfo的响应内容
有一个questionIds,这个有百分之九十九的可能和刚刚那个突然跳出来的题目有关系,还有一个timeSec(timesecond)字段,我想应该是在视频播放到多少秒的时候跳出题目
剩下的包基本都是服务器响应了ok等信息,没啥有用的信息
也就是说,现在的关键就是逆向出secretStr的加密方式,然后在每次发送请求前都走一下这个加密逻辑就行了
2.3 secretStr
我们先全局搜索一下secretStr
一下子就找到了两个,都打上断点,再去随便点击一个视频刷新一下
根据刚才的抓包结果,最先发送的请求是prelearningNote接口,那按道理来说我们点击了视频刷新以后,最先被加密的应该也是这个接口发送的信息
可见,这个加密函数接受两个参数,第一个参数是需要被加密的信息,就这个接口而言,就是courseId等等和这个视频相关的信息
第二个参数,我们直接全局搜索一下
原来是服务器响应的密文信息
继续跟栈进入加密函数,看看它是如何实现加密的
虽然代码被混淆了可读性不高,但是我们还是能从中猜出,这个函数是先使用RSA解密了服务器响应的密文信息,然后又从密文信息中提取了某些信息,将这个信息作为密钥,进行AES加密
我们解开混淆验证一下
跟我们的猜测完全一样!经过多轮抓包,这个密钥值是不变的直接写死就行了
我们继续跟栈进去看看这个AES是否被魔改
有这些特征,几乎可以百分百确定没有被魔改了,这个就是直接调用了CryotoJS库来实现的AES加密,直接把这些代码复制到本地,再手动解一下混淆,就ok了!
2.4 寻找记录视频学习完成的关键包
还是和之前一样,要找到记录学习过程的包,我们随便点击一个没学过的视频,一直到它播放结束,记录一下这个过程浏览器是怎么向浏览器发包的
等到视频要播放完的时候,我们刚刚在secretStr处打下的断点突然被断住了
我们看一下要被加密的内容,和prelearningNote接口要加密的内容不同,这里被多重加密了
全局搜索一下ewssw,发现可以搜索到,那我们索性打下断点
再次播放视频,也是在这里断住了
这个ewssw里的内容实在不知道是什么意思,我们把this后面的内容解混淆一下
这个看起来是监测点的意思,和上次那个翻转课的记录方式不同,翻转课那个的记录方式是30秒发送一个确认包,这个是视频播放完了才发送一个总的确认包,所以它必然会有一些字段去记录一下观看的过程,来区分你是否有跳过某些章节或者是否开倍速
我们把这个字符串看成一个数列,我们很容易就能发现规律,除了开头的0,1是固定的,剩下的项都是呈2,2,3,3,3,4,4,5,5,5.....以此类推,但是这个数列有多少项,我们现在暂时不得而知
那我们就来看看sdsew字段
数列的项数是27,这个55是视频播放的时长(PS:其实这个"00:01:27"本应该是"00:00:55"的,应该和前面那两项保持一致,但是我在一边写文章一边复现的过程电脑卡了一下,导致这个前端页面没记录对,请忽略...),也就是说我们播放的时长/2向下取整,就是视频数列的项数,我根据这个猜想又抓了几个包,发现这个猜想是正确的! 那个V4n9wa5Jzhs就是我们上篇文章获取的uuid+'zhs',其他的都是CourseId等参数,我们就不关心了
将这些参数传入这个'Z'函数,就会返回一个很长的字符串,这个函数没什么特别的,就是些位运算啥的,把代码扣下解混淆一下就行,我们继续看zwsds字段
结尾有个等于号,猜测是base64编码,在控制台解码看看
还真解码出来东西了,我们把这个东西全局搜索看看是啥
这不就是我们前面分析包的时候说要记下来的那个id嘛!
根据以上的分析过程构建请求,直接发包,就能实现秒刷视频了!
3.结语
若是在视频播放过程中跳出题目的话,是会有两个确认包的,但是我发现假设我们不答题只上传视频播放的视频的话也是可以记录上的!因此在这里就不过多赘述了。至此,共享课的视频部分就攻克了,接下来会继续攻克共享课的考试部分