獲取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。但有時會遇到特別長的,無法繼續(xù)下一步了,此時先pass,后面再講。
KID轉PSSH
這一段就有點長了,就慢慢來吧。
先學習下PSSH的組成吧。
先從kktv和unext分別找一個官方的PSSH,然后base64轉hex,
KKTV_PSSH:
HEX:
UNEXT_PSSH:
HEX:
這樣可能看不出有啥東西來。
將PSSH輸入https://tools.axinom.com/decoders/PsshBox這個網站可以自動分割組成就比較直觀了,可以發(fā)現(xiàn)以下幾個部分:
Size:000000xx,此段代表整個完整PSSH的字節(jié)數(shù)
Type:70737368,就是指文本的pssh
Flags:00000000,固定立在這里的旗幟[doge],有用也沒用
System ID:edef8ba979d64acea3c827dcd51d21ed,這一串就是指的Widevine,可作為識別部
Data Size:000000xx,此段代表xx之后到PSSH結束的字節(jié)數(shù)
Key IDs:重要部分,也就是KID
Provider與Content ID:可以看出不同來源是不一樣的,比如KKTV的Provider與Content ID都是KKTV(Text (UTF-8)),UNEXT的Provider是unext,Content ID是對應的視頻id。
根據(jù)頁面的提示的content ID可以不與KID同時存在,Provider字段也已經棄用。
此時就大膽嘗試舍去Provider與Content ID去請求,發(fā)現(xiàn)請求成功并結果與之前一致。
因為KID為固定的16字節(jié)長度,那么就可以直接用KID去轉換成PSSH了。
根據(jù)以上的規(guī)律可以得到:
000000347073736800000000EDEF8BA979D64ACEA3C827DCD51D21ED0000001408011210+KID
按這個格式轉成PSSH即可。
當然由于各方面都不驗證的原因,里面很多的不重要的地方可以瞎寫了,依舊可以請求出來。
所以在mpd提供kid的情況下,可以直接轉換。mpd不直接提供的話可以下載文件后讀取文件的KID進行轉換。一般使用mp4info或mp4dump之類的工具,不過有點坑的是路徑及名稱不能有中文,不然用不了。
或者用這種軟件直接可以讀PSSH了

4.剝離長PSSH
回到上面那個沒解決的問題,處理Init Data返回內容超長的問題。
以videx為例,先獲取獲取Init Data內容:
輸入上面那個PSSH box的網站,可以發(fā)現(xiàn)這一長串混雜了playready和widevine的內容。其中playready的內容被識別成文本,包含widevine的PSSH部分為歸為Unknown Data。
根據(jù)上面的規(guī)律可知,08011210后面去16字節(jié)的kid即可組成PSSH,再把這段Unknown Data丟上去再來一遍,網站自動分析出KID,然后看結尾截止到哪里了,轉成base64就完成了。