WideVineDRM視頻解密
WideVineDRM視頻解密
本文的目的只是為了能夠簡單的了解一下WideVineDRM
1、認識流媒體
流媒體(Streaming Media)是一種通過網(wǎng)絡(luò)實時傳輸數(shù)據(jù)的技術(shù),使用戶能夠在不必先下載完整文件的情況下,邊接收數(shù)據(jù)邊播放音頻、視頻或其他多媒體內(nèi)容。換句話說,流媒體技術(shù)可以讓我們直接觀看或收聽在線的音視頻內(nèi)容,而不需要等待整個文件完全下載完成。
2、流媒體的特點:
- 實時播放:流媒體數(shù)據(jù)在用戶設(shè)備上實時接收并播放,而不是先下載完整文件后再播放。
- 持續(xù)傳輸:數(shù)據(jù)以連續(xù)流的方式傳輸,確保播放不中斷。
- 不需要完整下載:用戶可以在傳輸?shù)倪^程中開始播放,而不必等待完整下載。
3、常見的流媒體類型:
- 視頻流媒體:如YouTube、Netflix、騰訊視頻、愛奇藝等,用戶可以實時觀看視頻內(nèi)容。
- 音頻流媒體:如Spotify、Apple Music、網(wǎng)易云音樂等,用戶可以實時收聽音樂或廣播。
- 直播流媒體:如Twitch、YouTube直播、Bilibili直播等,用戶可以觀看實時的直播內(nèi)容。
4、流媒體的工作原理:
流媒體技術(shù)通過將音視頻內(nèi)容切分成小的數(shù)據(jù)包,這些數(shù)據(jù)包會被分批次、按順序地傳輸?shù)娇蛻舳恕?蛻舳嗽O(shè)備接收到數(shù)據(jù)后,會將這些數(shù)據(jù)實時解碼并展示給用戶。例如,視頻流會被切分成多個小的幀,然后逐幀播放。
常見的流媒體協(xié)議包括:
- RTSP(Real-Time Streaming Protocol) :用于控制視頻流的啟動、暫停、停止等操作。
- HLS(HTTP Live Streaming) :通過HTTP協(xié)議實現(xiàn)流媒體播放,廣泛應(yīng)用于視頻直播。
- DASH(Dynamic Adaptive Streaming over HTTP) :另一種基于HTTP的流媒體傳輸協(xié)議,能夠自適應(yīng)網(wǎng)絡(luò)帶寬。
流媒體技術(shù)的優(yōu)勢在于,它減少了用戶等待的時間,提升了用戶體驗,同時支持各種設(shè)備和網(wǎng)絡(luò)環(huán)境下的內(nèi)容分發(fā)。
其實說白了就是多緩存一些。上面這些介紹都來自于chatgpt
5、什么是DRM
DRM 主子版權(quán)管理是一種技術(shù) 策略工具用來保護數(shù)字內(nèi)容的版權(quán)和防止未授權(quán)的復(fù)制、分發(fā)或使用。一般用于流媒體
其實m3u8 也是一種DRM這是眾所周知的。
比如說。在m3u8信息里面有一種AES加密的,那就是一種特殊的DRM
在源代碼中如下:
#EXT-X-KEY:METHOD=AES-128,URI="key.bin"
6、初步認識WidevineDRM
這里說一下我所知道的WidevineDRM吧。
- Windevine 分為三個等級L1、L2、L3,他們的加密程度不一樣。其中L1加密的最恨 L3加密的比較輕了就。 所以我們先了解L3
- 加密設(shè)備可以是硬件設(shè)備和軟件設(shè)備,硬件設(shè)備無法被破解,除非拿到他的硬件,然后去逆向他的硬件設(shè)備。 軟件設(shè)備相對就輕松一些。
提供幾個站點吧。
- https://w3c.github.io/encrypted-media/
- https://developers.google.com/widevine/access?hl=zh-cn
- https://github.com/cryptonek/widevine-l3-decryptor/blob/master/license_protocol.proto
- https://datatracker.ietf.org/doc/html/rfc8216
其實看這些站點有點像大海撈針的感覺,所以還是應(yīng)該注意一下的,我不太建議這樣操作。
7、認識一個開源庫
WidevineProxy2: https://github.com/DevLARLEY/WidevineProxy2
這個開源庫的使用方法如下(官方已經(jīng)解釋的很清楚了 ,但是是英文的,所以我在這里再說一遍吧):
這里只針對谷歌瀏覽器哈?;鸷脑捲硎且粯拥?/p>
打開后的界面是這樣的
?
?
這時候我們就需要繼續(xù)閱讀github文檔了。
官方說:
如果您只有device_client_id_blob和device_private_key,請運行此命令來創(chuàng)建.wvd 文件:
pywidevine create-device -k device_private_key -c device_client_id_blob -t "ANDROID" -l 3
現(xiàn)在,打開擴展,單擊Choose File并選擇您的 Widevine 設(shè)備文件。
首先我們應(yīng)該先了解一下 device_client_id_blob 文件和 device_private_key文件怎么獲取。
- ?
device_client_id_blob?:通常存儲設(shè)備的標(biāo)識符和配置數(shù)據(jù),用于身份驗證和設(shè)備注冊。 - ?
device_private_key?:存儲設(shè)備的私鑰,用于加密通信、數(shù)字簽名和身份驗證。
AI就是好用。
對于如何獲取這兩個密鑰,其實網(wǎng)上說早期可以瀏覽器直接抓包獲取密鑰,但是現(xiàn)在已經(jīng)不適用了,生不逢時啊。
現(xiàn)在可以從安卓設(shè)備上提取,如果沒有安卓設(shè)備也可以從支持DRM的安卓虛擬機中提取。、
這里有一個開源項目開源看一下 L3-Dumping
需要用到安卓逆向的東西,我不會,但是我已經(jīng)有密鑰文件了。哦哈哈哈
拿到device_client_id_blob 文件和 device_private_key 文件后就可以進行下一步操作了。
我直接執(zhí)行上面說的即可, 生成一個.wvd 文件
在插件中選擇Choose File ,后選擇wvd文件即可
這里我使用一個DRM保護的網(wǎng)站進行測試
?
?
注意感覺觀察兩個重點,
一個是ChooseFIle 下面一句,L3加密,
已經(jīng)下面的一些Keys data 什么什么的都有了
我們直接吧CMD里面的命令復(fù)制到cmd中。
11:22:36.008 INFO : N_m3u8DL-RE (Beta version) 20241203
11:22:36.025 INFO : 加載URL: https://vod-playlist.sr.roku.com/1.mpd?origin=https%3A%2F%2Fvod.delivery.roku.com%2Fe174c5f87e80445aa595c04ec8ab2d2e%2Fc672fdbb6a5c40c89adf8b6d7de5ca80%2F9cfdd7260db04117a8259afeb417d2a4%2Findex.mpd%3Faws.manifestfilter%3Daudio_codec%3AAACL%2CAACH%3Baudio_language%3Aen%2Ceng%3Bsubtitle_language%3Aunused&ovpFilter=
11:22:37.261 INFO : 內(nèi)容匹配: Dynamic Adaptive Streaming over HTTP
11:22:37.263 INFO : 正在解析媒體信息...
11:22:37.341 WARN : 寫出meta json
11:22:37.372 INFO : 已解析, 共計 6 條媒體流, 基本流 5 條, 可選音頻流 1 條, 可選字幕流 0 條
11:22:37.374 INFO : Vid *CENC 1920x1080 | 4171 Kbps | 5 | 23.976 | avc1.640028 | 3252 Segments | ~01h48m30s
11:22:37.376 INFO : Vid *CENC 1280x720 | 2621 Kbps | 4 | 23.976 | avc1.4D401F | 3252 Segments | ~01h48m30s
11:22:37.377 INFO : Vid *CENC 720x406 | 971 Kbps | 3 | 23.976 | avc1.42C01E | 3252 Segments | ~01h48m30s
11:22:37.379 INFO : Vid *CENC 512x288 | 571 Kbps | 2 | 23.976 | avc1.42C01E | 3252 Segments | ~01h48m30s
11:22:37.380 INFO : Vid *CENC 384x216 | 271 Kbps | 1 | 23.976 | avc1.42C01E | 3252 Segments | ~01h48m30s
11:22:37.381 INFO : Aud *CENC 6 | 128 Kbps | mp4a.40.2 | eng | 2CH | 3252 Segments | ~01h48m30s
請選擇 你要下載的內(nèi)容:
> [ ] Basic
[X] Vid *CENC 1920x1080 | 4171 Kbps | 5 | 23.976 | avc1.640028 | 3252 Segments | ~01h48m30s
[ ] Vid *CENC 1280x720 | 2621 Kbps | 4 | 23.976 | avc1.4D401F | 3252 Segments | ~01h48m30s
[ ] Vid *CENC 720x406 | 971 Kbps | 3 | 23.976 | avc1.42C01E | 3252 Segments | ~01h48m30s
[ ] Vid *CENC 512x288 | 571 Kbps | 2 | 23.976 | avc1.42C01E | 3252 Segments | ~01h48m30s
[ ] Vid *CENC 384x216 | 271 Kbps | 1 | 23.976 | avc1.42C01E | 3252 Segments | ~01h48m30s
[ ] Audio
[X] Aud *CENC 6 | 128 Kbps | mp4a.40.2 | eng | 2CH | 3252 Segments | ~01h48m30s
(按 空格鍵 選擇流, 回車鍵 完成選擇)
11:22:52.716 INFO : 保存文件名: 1_2024-12-13_11-22-37
11:22:52.718 WARN : 你已開啟下載完成后混流,自動開啟二進制合并
11:22:52.722 INFO : 開始下載...Vid 1920x1080 | 4171 Kbps | 5 | 23.976 | avc1.640028
11:22:53.874 WARN : Type: cenc
11:22:53.878 WARN : PSSH(WV): CAESEHzjh6lZNVQY0KMc05oHt4EaCmludGVydHJ1c3QiASo=
11:22:53.880 WARN : KID: 7ce387a959355418d0a31cd39a07b781
11:22:53.883 WARN : 讀取媒體信息...
11:22:55.476 INFO : [0x1]: Video, h264 (avc1), 1920x1080
Vid 1920x1080 | 4171 Kbps | 23.976 ------------------------------ 512/3253 15.74% 480.16MB/3.18GB 37.38MBps 00:01:31 /
Aud 128 Kbps | eng | 2CH ------------------------------ 0/100 0.00% - - --:--:--
這時候我們就已經(jīng)正常跑起來了。
這里是有兩個工具需要下載的,
一個是 N_m3u8DL-RE 執(zhí)行的時候還會提醒少工具,到時候見招拆招即可,
11:22:52.718 WARN : 你已開啟下載完成后混流,自動開啟二進制合并
11:22:52.722 INFO : 開始下載...Vid 1920x1080 | 4171 Kbps | 5 | 23.976 | avc1.640028
11:22:53.874 WARN : Type: cenc
11:22:53.878 WARN : PSSH(WV): CAESEHzjh6lZNVQY0KMc05oHt4EaCmludGVydHJ1c3QiASo=
11:22:53.880 WARN : KID: 7ce387a959355418d0a31cd39a07b781
11:22:53.883 WARN : 讀取媒體信息...
11:22:55.476 INFO : [0x1]: Video, h264 (avc1), 1920x1080
11:24:23.095 INFO : 二進制合并中...
11:24:28.873 WARN : Type: cenc
11:24:30.142 WARN : PSSH(WV): CAESEHzjh6lZNVQY0KMc05oHt4EaCmludGVydHJ1c3QiASo=
11:24:30.144 WARN : KID: 7ce387a959355418d0a31cd39a07b781
11:24:30.145 INFO : Decrypting using MP4DECRYPT...
11:24:47.029 INFO : 開始下載...Aud 6 | 128 Kbps | mp4a.40.2 | eng | 2CH
11:24:47.298 WARN : Type: cenc
11:24:47.303 WARN : PSSH(WV): CAESEHzjh6lZNVQY0KMc05oHt4EaCmludGVydHJ1c3QiASo=
11:24:47.306 WARN : KID: 7ce387a959355418d0a31cd39a07b781
11:24:47.308 WARN : 讀取媒體信息...
11:24:48.329 INFO : [0x1]: Audio, aac (mp4a)
Vid 1920x1080 | 4171 Kbps | 23.976 ------------------------------ 3253/3253 100.00% 3.17GB - 00:00:00
Aud 128 Kbps | eng | 2CH ------------------------------ 1365/3253 41.96% 43.12MB/105.95MB 2.25MBps 00:00:27 \
自動下載還是非常nice的
本文結(jié)束,下篇文章分析一下開源庫的js代碼??匆幌滤侨绾蝖ook的數(shù)據(jù)包。
8、Widevine DRM解密原理
DRM 存在目的是為了防止帶有版權(quán)的多媒體內(nèi)容不被非法訪問的訪問控制技術(shù),被DRM保護的視頻即使下載頁沒辦法看,因為有加密嘛。
流媒體服務(wù)商先將加密視頻內(nèi)容放在自己的內(nèi)容服務(wù)器,將密鑰key放置在谷歌提供的Widevine認證服務(wù)器。用戶播放時,先與Widevine服務(wù)器完成認證,得到key之后從內(nèi)容服務(wù)器下載視頻,并用key解密播放。
Widevine擁有三個安全級別——L1、L2和L3。L1是最高的安全級別,解密全過程在硬件中完成,需要設(shè)備支持。L3的安全級別最低,解密全程在CDM(Content Decryption Module )軟件中完成。L2介于兩者之間, 核心解密過程在硬件完成,視頻處理階段在軟件中完成。本文只討論L3級視頻的解密方式。
播放L3級加密視頻需要CDM模塊,主流的視頻播放設(shè)備均已內(nèi)置CDM。播放器調(diào)用DRM進行解密時,有以下過程:
- 用戶開始播放視頻時,客戶端從視頻服務(wù)器中下載mpd文件。在解析mpd之后,播放器根據(jù)相關(guān)字段確定該視頻是否使用Widevine加密視頻。
- 播放器將加密音視頻流初始化信息發(fā)送給內(nèi)置的CDM模塊解密。
- CDM接收到來自播放器的初始化信息,并創(chuàng)建“許可證請求”,然后將其發(fā)送回給播放器
- 播放器接收到許可證請求后,將該請求發(fā)送給Widevine license服務(wù)器。許可證請求為全報文加密,抓包改包的方式無法進行攻擊。
- license服務(wù)器接收到播放器發(fā)送的請求后解密,提取初始化信息,并通過初始化信息找到其數(shù)據(jù)庫中的播放key。之后將key加密,返回給播放器。
- 播放器接收到license服務(wù)器返回的key,將它傳遞給CDM。所有往來流量均被加密,播放器和中間人都無法讀取相關(guān)信息。
- CDM調(diào)用相關(guān)的解密工具,將加密視頻分段解密,實時傳送到播放器播放,不在本地存儲。
?

浙公網(wǎng)安備 33010602011771號