群里一直有小伙伴,不知道咋下载某鹅通的视频,这里说一下我的逆向过程(开始那个某利威的确实不怎么详细,逻辑也很胡乱,主要是我不知道有挺多小伙伴需要这个,我当时就随便写写,记录一下,也没想有多少人看)
1.首先找m3u8链接
这里我们直接抓包,可以看到,这个m3u8链接
这个抓包过程就不赘述了,我们看一下这个m3u8的返回。
可以看到,这个返回的是一串字符,看来是加密的。
2.寻找解密代码
这个m3u8文本是加密的,但是他肯定要解密后才能进行解析,所以,我们要找到他的解密代码。这里对这个m3u8解密视频的key下一个断点。
就是这个链接。
查看一下他的发起程序。
可以看到一个loadkey,既然已经loadkey了,那肯定在这个之前就已经解密完成了,我们再往下移一下看看。
可以看到这个loadsuccess,这个很可疑。点进入看一下。
可以看到这样的代码,很熟悉,应该是对m3u8文件进行解析。看来解密不远了。先打结果断点。断住看看。
断住过后,找到这个解密函数,是这个D.decrypt,输出一下这个t.data。可以看到。
就是没解密的数据,而 D.decrypt(t.data)就是解密后的数据。
3.进入D.decryp函数
进入到decrypt函数,可以看到这些东西,乍一看,人都麻了,这一定是混淆了吧?头都大了,殊不知,这都是障眼法。他是直接运行了这样一行代码。
return t[y[1] + m[54] + y[9] + y[32] + y[26] + m[50] + y[10]](y[24] + v[50] + v[2]) > -1 ? (t = (t = (t = (t = (t = t[y[27] + m[34] + v[29] + y[58] + m[58] + y[30] + y[32]](m[27] + m[42] + v[2], ""))[y[27] + y[32] + m[17] + y[58] + m[58] + y[30] + m[34]](/@/g, y[35]))[m[60] + y[32] + y[19] + m[55] + y[12] + y[30] + y[32]](/#/g, m[44]))[m[60] + m[34] + v[29] + m[55] + v[2] + y[30] + v[8]](/\$/g, y[48]))[v[58] + v[8] + y[19] + v[53] + m[58] + y[30] + v[8]](/%/g, v[11]),I(O(t))) : t
return了一个值,判断ty[1] + m[54] + y[9] + y[32] + y[26] + m[50] + y[10]是否大于-1,如果不大于,就直接返回t,大于则执行,
(t = (t = (t = (t = (t = ty[27] + m[34] + v[29] + y[58] + m[58] + y[30] + y[32])y[27] + y[32] + m[17] + y[58] + m[58] + y[30] + m[34])m[60] + y[32] + y[19] + m[55] + y[12] + y[30] + y[32])m[60] + m[34] + v[29] + m[55] + v[2] + y[30] + v[8])v[58] + v[8] + y[19] + v[53] + m[58] + y[30] + v[8], I(O(t)))这一行代码。
在控制台输出一下,可以看到y,m,v都是定值,他是从里面选字母,组成单词,对t进行解密。
解密后的代码是这样的。
(t = (t = (t = (t = (t = t.replace("_ba", "")).replace(/@/g, 1)).replace(/#/g, 2)).replace(/\$/g, 3)).replace(/%/g, 4)) const buff = Buffer.from(t, 'base64'); const str = buff.toString('utf-8');
先移除一些关键词,在对结果对base64解码。就可以得到解密后的m3u8文本了。
4.请求m3u8文本
这里有一点要注意,请求链接的时候要带上referer和origin,某鹅通对这个有检测。这里你就可以请求视频下载了。
这个总体还是很简单的。可以作为练手。
有啥问题加群:342096685