获取PSSH的一些思路
前言:
最近把之前放弃的几个站又拿起来了,从头折腾了下PSSH这玩意,大概分享下心路历程。虽然这玩意是解密流程中绕不开的,不过只能算是非重点部分,本来不懂的,看了这个大概就更不懂了。本来懂的话大概可以拓展下思路啥的,当然我也是才折腾这些东西的,难免有错误。
此文章中的PSSH均为widevine PSSH,其它的我完全不会。
直接从mpd中获取
几乎90%以上的PSSH都可以在mpd的响应里看到,可以说非常简单粗暴了。
当然这样说明这玩意没那么重要,直接给你,你也不能咋地。。。
使用EME Logger脚本读取
对于mpd中不直接提供PSSH的情况,首先安装油猴脚本EME Logger(https://greasyfork.org/zh-CN/scripts/373903-eme-logger),在打开对应的视频时,控制台可以看到Init Data,此处的这一串就是PSSH。一般长度适合的话就是正确的了,比如hami。但有时会遇到特别长的,无法继续下一步了,此时先pass,后面再讲。
KID转PSSH
这一段就有点长了,就慢慢来吧。
先学习下PSSH的组成吧。
先从kktv和unext分别找一个官方的PSSH,然后base64转hex,
KKTV_PSSH:
HEX:
UNEXT_PSSH:
HEX:
这样可能看不出有啥东西来。
将PSSH输入https://tools.axinom.com/decoders/PsshBox这个网站可以自动分割组成就比较直观了,可以发现以下几个部分:
Size:000000xx,此段代表整个完整PSSH的字节数
Type:70737368,就是指文本的pssh
Flags:00000000,固定立在这里的旗帜[doge],有用也没用
System ID:edef8ba979d64acea3c827dcd51d21ed,这一串就是指的Widevine,可作为识别部
Data Size:000000xx,此段代表xx之后到PSSH结束的字节数
Key IDs:重要部分,也就是KID
Provider与Content ID:可以看出不同来源是不一样的,比如KKTV的Provider与Content ID都是KKTV(Text (UTF-8)),UNEXT的Provider是unext,Content ID是对应的视频id。
根据页面的提示的content ID可以不与KID同时存在,Provider字段也已经弃用。
此时就大胆尝试舍去Provider与Content ID去请求,发现请求成功并结果与之前一致。
因为KID为固定的16字节长度,那么就可以直接用KID去转换成PSSH了。
根据以上的规律可以得到:
000000347073736800000000EDEF8BA979D64ACEA3C827DCD51D21ED0000001408011210+KID
按这个格式转成PSSH即可。
当然由于各方面都不验证的原因,里面很多的不重要的地方可以瞎写了,依旧可以请求出来。
所以在mpd提供kid的情况下,可以直接转换。mpd不直接提供的话可以下载文件后读取文件的KID进行转换。一般使用mp4info或mp4dump之类的工具,不过有点坑的是路径及名称不能有中文,不然用不了。
或者用这种软件直接可以读PSSH了

4.剥离长PSSH
回到上面那个没解决的问题,处理Init Data返回内容超长的问题。
以videx为例,先获取获取Init Data内容:
输入上面那个PSSH box的网站,可以发现这一长串混杂了playready和widevine的内容。其中playready的内容被识别成文本,包含widevine的PSSH部分为归为Unknown Data。
根据上面的规律可知,08011210后面去16字节的kid即可组成PSSH,再把这段Unknown Data丢上去再来一遍,网站自动分析出KID,然后看结尾截止到哪里了,转成base64就完成了。