1. 前言
现在我们在网页端看的视频,其前端实现原理就小编目前知道的而言,总的有两点:其一,直接就是一个mp4(或其他类似的)视频链接,如果我们能得到这个视频链接,直接用这个链接就能下载到这个视频;其二,和第一点差不多吧!但是直接用链接下载,获取不到视频文件,而是一个其他类型的文件(比如m3u8文件),虽然不能直接下载到视频,但是通过进一步处理,最后还是能得到视频文件的。最近,看到了一个视频平台,觉得这个平台挺好的,没有广告,想得到在这个平台的视频文件,但是其原理属于第二种情况,且网站进行相对复杂的加密处理,怎样才能得到这个平台上的视频的m3u8文件呢?
目标网址:aHR0cHM6Ly92LmRvdXl1LmNvbS9zaG93L244R3pNWG1Pam9KVzZxeVA=
1.分析数据
分析网址发现某鱼的视频下载的参数data有加密参数。看起来有点像MD5加密。
2. 了解sign这个参数的加密原理(js逆向)
我们点击到启动器,如下:
可以看到这个启动器下面有一大堆js文件的链接,我们点到图上的第6个链接(这里直接省略点击上面5个链接的步骤了,小编是一个个都点击过的,可以并没有发现东西,知道点击到第6个链接后),发现如下:
然后再这里断点调试,可以看到sign结果已经出来了。
我们现在找t这个是哪里来的。发现t是上面:t = "".concat(p, "&vid=").concat(r) ,其中p是var p = window[l](a, o, s); r是视频的id.
var p = window[l](a, o, s);这个里面有三个参数:
a: 37425776
o: "765acd633469527b4fde252700041701"
s: 1724482607
window[l] 这个就是主要的加密函数,点击进入n8GzMXmOjoJW6qyP这个发现它的加密函数如下:看着这个函数有点像MD5的加密。
function ub98484234(y190b2880, y190b2881, y190b2882) {
var rk = [25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21, 10, 25, 16, 24, 17, 30, 23, 37, 21];
var k2 = [0x744668f3, 0x22d8cf77];
var lk = [0x744668f3, 0x22d8cf77];
var v = y190b288.slice(0);
var k = [0xbd7375f8, 0xdfcfb71b, 0x3f7fed8e, 0xf7bb9631];
for (var O = 0; O < 394; O++) {
v[O] ^= 0x29ec07c5;
}
v[1] = (v[1] << (lk[1] % 16)) | (v[1] >>> (32 - (lk[1] % 16)));
v[0] += lk[0];
v[3] = (v[3] >>> (lk[1] % 16)) | (v[3] << (32 - (lk[1] % 16)));
v[2] ^= lk[0];
v[5] += lk[1];
v[4] ^= lk[0];
v[7] -= lk[1];
v[6] = (v[6] >>> (lk[0] % 16)) | (v[6] << (32 - (lk[0] % 16)));
v[9] = (v[9] >>> (lk[1] % 16)) | (v[9] << (32 - (lk[1] % 16)));
v[8] = (v[8] >>> (lk[0] % 16)) | (v[8] << (32 - (lk[0] % 16)));
v[11] ^= lk[1];
v[10] += lk[0];
v[13] = (v[13] << (lk[1] % 16)) | (v[13] >>> (32 - (lk[1] % 16)));
v[12] ^= lk[0];
v[15] -= lk[1];
v[14] += lk[0];
v[17] -= lk[1];
v[16] -= lk[0];
v[19] = (v[19] << (lk[1] % 16)) | (v[19] >>> (32 - (lk[1] % 16)));
v[18] += lk[0];
v[21] = (v[21] >>> (lk[1] % 16)) | (v[21] << (32 - (lk[1] % 16)));
v[20] ^= lk[0];
v[23] += lk[1];
v[22] ^= lk[0];
v[25] -= lk[1];
v[24] = (v[24] >>> (lk[0] % 16)) | (v[24] << (32 - (lk[0] % 16)));
v[27] = (v[27] >>> (lk[1] % 16)) | (v[27] << (32 - (lk[1] % 16)));
v[26] = (v[26] >>> (lk[0] % 16)) | (v[26] << (32 - (lk[0] % 16)));
v[29] ^= lk[1];
v[28] += lk[0];
v[31] = (v[31] << (lk[1] % 16)) | (v[31] >>> (32 - (lk[1] % 16)));
v[30] ^= lk[0];
v[33] -= lk[1];
v[32] += lk[0];
v[35] -= lk[1];
v[34] -= lk[0];
v[37] = (v[37] << (lk[1] % 16)) | (v[37] >>> (32 - (lk[1] % 16)));
v[36] += lk[0];
v[39] = (v[39] &