最近在看视频学习。观看视频期间发现平台对视频窗口做了限制,无法将鼠标离开窗口,也无法快进。通过F12查看浏览器的网络面板看到会定时向后台发送视频观看的日志信息,修改其参数然后再发送发现会报错,于是便对其逻辑做了分析,顺便学习了一波前端破解。
直接进入控制台中,查看【元素】-【事件监听器】,可以看到其添加了mouseout事件监听器,移除即可。
复制并查看视频观看记录请求包,发现`playingTime`,`enc`和`_t`参数一直在变,其中`playingTime`参数会每一分钟增加60,因此推测`playingTime`记录了视频观看打卡的日志。
[] 纯文本查看 复制代码 https://mooc1.xxxxxx.com/multimedia/log/a/325xxxx270/797608xxxxxx65265170xxxxf1d83e?clazzId=77735865&playingTime=125&duration=2369&clipTime=0_2369&objectId=8259bb87xxxxxxcbb4c86211aad9&otherInfo=nodeId_745347156-cpi_32xxxxxxxx_1-be_0_0-vt_1-v_6-enc_538a5dc1d7xxxxxxe0a9f021f0307998&courseId=234908773&jobid=1672133846352355&userid=28xxxxxx4&isdrag=3&view=pc&enc=97e121ea5ab03ea746fe4879c8&rt=0.9&dtype=Video&_t=1691885644798
直接修改`playingTime`参数发现请求会报错,推测与`enc`参数相关,下面就查找一下`enc`参数的生成过程。
进入【源代码】页面,找到【十几秒侦听器断点】,然后为选中XHR,为所有的ajax请求加入断点。
断点触发之后,可以在调用堆栈中看到对应的函数调用堆栈。然后一次点击不同的堆栈,依次点击不同的调用堆栈向上回溯。
回溯至`_0xa4b2fd`这个函数时发现有一段构造请求的代码,将鼠标放置url上还能看到对应的提示。点击该变量,发现该变量来自传入的参数,且为函数的第二个参数,继续回溯堆栈。
可以在该堆栈中找到URL变量的构建过程,_0x37a9a5这个变量便是传入的URL变量
根据该变量的声明过程,发现其中的` md5(_0x4555be)`函数表示`enc`参数。也可以知道`enc`参数是由md5哈希生成。
[] 纯文本查看 复制代码 _0x37a9a5 = [_0x46503e[_0x20f39c(0x3e0)], '/', _0x46503e[_0x20f39c(0x3a0)], _0x20f39c(0x33f), _0x46503e['clazzId'], _0x20f39c(0x213), _0x847d49, '&duration=', _0x46503e[_0x20f39c(0x3a7)], _0x20f39c(0x266), _0x133074, _0x20f39c(0x210), _0x46503e[_0x20f39c(0x475)], _0x20f39c(0x44a), _0x46503e[_0x20f39c(0x46a)], _0x20f39c(0x3ca), _0x46503e[_0x20f39c(0x3c8)], _0x20f39c(0x440), _0x46503e[_0x20f39c(0x4b7)], '&isdrag=', _0x478c58, '&view=pc', _0x20f39c(0x20f), md5(_0x4555be), _0x20f39c(0x34e), _0x46503e['rt'], _0x20f39c(0x27e), _0x20f39c(0x212), new Date()[_0x20f39c(0x2ee)]()][_0x20f39c(0x297)]('');
_0xa4b2fd(_0x9289c, _0x37a9a5, _0x46503e[_0x20f39c(0x3c8)], _0x681ef6);
};
此时可以在此处打一个断点,然后就可以获取传入`md5`函数的参数
分析传入的参数,发现其构成如下。由此可以确认该参数的生成方法。
[Asm] 纯文本查看 复制代码 md5([clazzId]+[userid]+[jobid]+[objectId]+[playingTime+"000"]+["d_yHJ!$pdA~5"]+[duration+"000"]+[clipTime])
进一步跟进`_0x4555be`变量,发现其创建过程如下。
[JavaScript] 纯文本查看 复制代码 var _0x4555be = Ext[_0x20f39c(0x3d7)][_0x20f39c(0x26b)](_0x58cdef, _0x46503e[_0x20f39c(0x28e)], _0x46503e[_0x20f39c(0x4b7)], _0x46503e[_0x20f39c(0x3c8)] || '', _0x46503e['objectId'], _0x2f17e7, _0x20f39c(0x1fb), _0x46503e['duration'] * 0x3e8, _0x133074)
开启一个隐私窗口,然后加载该JavaScript文件,发现传入的特殊字符串`d_yHJ!$pdA~5`未发生变化,因此确定该字符串是一个硬编码的值,可以直接使用。后面就是构造请求,然后发送,之后刷新页面,可以看到该视频已经成功被定位到目标地址。
|