前言
前一段时间有朋友让我帮忙看看能不能破解西瓜视频,我才知道,原来西瓜视频已经开始加密了,原来都是可以直接IDM抓包下载的。
果不其然,已经有巨佬盯上了西瓜,已经成功地解决了加密的问题。
【教程】XiGua视频DRM手动解密 · Discussion #17 · nilaoda/Blog · GitHub
但是经过实测,发现西瓜经过更新以后,这种方法已经失效了……
但其实仔细阅读可以发现,西瓜视频的加密原理是通过一个API返回一串字符,然后通过本地的JS函数,解密这串字符,得到视频的DRM-KEY。
但其实,知道原理并没有卵用[捂脸],毕竟我又不打算从头写一遍,只不过是想找到最终可以解密视频的那个KEY而已。
在对着教程里说的那几个JS文件寻摸了很久以后,我基本确定了一件事,我的JS基础可能不足以读懂那堆代码(毕竟是字节跳动的产品啊),于是乎决定去控制台碰碰运气。

控制台看多了,基本上摸出了门道,哪个后边的值多就先看哪个[再次捂脸]

直到我看到了这,这_malloc和_openBox不就是教程里提到的那个函数吗?
我去,狗屎运这就来了啊,再找找,发现教程里提到的几个函数都能凑齐,可以实现字符串转DRM-KEY的过程了。
至于那串字符串去哪找,可真是太简单了,西瓜也是没藏着,直接过滤drm关键字就能得到接口的返回的数据。

在控制台试一下,就会发现很神奇的得到了DRM-KEY,再用解密软件验证一下,amazing!
其实还有一个问题,就是函数的路径问题,准确的路径是dash_+时间戳,每次都会变,但好在就这一个函数,所以在JS里加入一个遍历的前置处理,就可以准确定位到的这个函数了。
这是我写好的一个JS便签,渣代码,凑合看
javascript: var dashtemp = prop;for (var prop in window){ if(prop.indexOf(“dash_”) != -1) { dashtemp = window[prop]; }}function str2hex (e) { if (“” === e) return “”; for (var t = [], r = 0; r < e.length; r++) t.push(e.charCodeAt(r)); return t}tt = prompt(“%E8%AF%B7%E8%BE%93%E5%85%A5%E5%BE%85%E8%A7%A3%E5%AF%86%E7%9A%84DRM-KEY”);var tt1 = window.atob(tt);var tt2 = str2hex(tt1);var tt3 = dashtemp + “.__dash__.awManager.module._malloc(Number(tt2.length))”;dashtemp.__dash__.awManager.module.HEAP8.set(tt2, tt3);var p = dashtemp.__dash__.awManager.module._openBox(Number(tt3), tt2.length);var f = dashtemp.__dash__.awManager.module.UTF8ToString(p);prompt(“%E8%A7%A3%E5%AF%86%E5%90%8E%E7%9A%84DRM-KEY”, f);
进阶
你有没有觉得这样其实很麻烦,每次都要先抓包,得到一串字符串,再用这个标签处理得到最终的DRM-KEY。
我又开始了漫长的搜寻之路。

是我大意了,其实已经有了,可以直接取的,没必要自己算一遍。
javascript: var dashtemp = prop;for (var prop in window){ if(prop.indexOf(“dash_”) != -1) { dashtemp = window[prop]; }}prompt(“%E8%A5%BF%E7%93%9C%E8%A7%86%E9%A2%91DRM-KEY”,dashtemp.__dash__.dash.keyValue );
进进阶
什么?你现在就把上一个标签删了?那你可是大错特错了。
五一期间,你好李焕英在鲜时光(西瓜TV版)独家上线七天,这个时候就是上一个标签的用武之地了。
在模拟器里抓包得到电视版的片源MPD,没有KEY解密可咋办呢?
这时候就可以拿着视频的ID,通过那个极其暴露且毫无加密的接口,得到那个一串字符。然后再依靠上一个标签,解密得到DRM-KEY。
这才是正确的打开方式[狗头]
结语
我也是真没想到,我能靠一己之力破解西瓜的加密,当然也是少不了大佬的教程帮助。
还有一个获取MPD的标签,这个真没啥技术含量,一并放出来吧
javascript:var dashtemp = prop;for (var prop in window){ if(prop.indexOf(“dash_”) != -1) { dashtemp = window[prop]; }}prompt(“MPD%E9%93%BE%E6%8E%A5”, “https:”+dashtemp.config.dashOpts.dynamic_video.main_url);
以上内容仅供学习参考,侵删。
