WideVineDRM视频解密
WideVineDRM视频解密
本文的目的只是为了能够简单的了解一下WideVineDRM
1、认识流媒体
流媒体(Streaming Media)是一种通过网络实时传输数据的技术,使用户能够在不必先下载完整文件的情况下,边接收数据边播放音频、视频或其他多媒体内容。换句话说,流媒体技术可以让我们直接观看或收听在线的音视频内容,而不需要等待整个文件完全下载完成。
2、流媒体的特点:
- 实时播放:流媒体数据在用户设备上实时接收并播放,而不是先下载完整文件后再播放。
- 持续传输:数据以连续流的方式传输,确保播放不中断。
- 不需要完整下载:用户可以在传输的过程中开始播放,而不必等待完整下载。
3、常见的流媒体类型:
- 视频流媒体:如YouTube、Netflix、腾讯视频、爱奇艺等,用户可以实时观看视频内容。
- 音频流媒体:如Spotify、Apple Music、网易云音乐等,用户可以实时收听音乐或广播。
- 直播流媒体:如Twitch、YouTube直播、Bilibili直播等,用户可以观看实时的直播内容。
4、流媒体的工作原理:
流媒体技术通过将音视频内容切分成小的数据包,这些数据包会被分批次、按顺序地传输到客户端。客户端设备接收到数据后,会将这些数据实时解码并展示给用户。例如,视频流会被切分成多个小的帧,然后逐帧播放。
常见的流媒体协议包括:
- RTSP(Real-Time Streaming Protocol) :用于控制视频流的启动、暂停、停止等操作。
- HLS(HTTP Live Streaming) :通过HTTP协议实现流媒体播放,广泛应用于视频直播。
- DASH(Dynamic Adaptive Streaming over HTTP) :另一种基于HTTP的流媒体传输协议,能够自适应网络带宽。
流媒体技术的优势在于,它减少了用户等待的时间,提升了用户体验,同时支持各种设备和网络环境下的内容分发。
其实说白了就是多缓存一些。上面这些介绍都来自于chatgpt
5、什么是DRM
DRM 主子版权管理是一种技术 策略工具用来保护数字内容的版权和防止未授权的复制、分发或使用。一般用于流媒体
其实m3u8 也是一种DRM这是众所周知的。
比如说。在m3u8信息里面有一种AES加密的,那就是一种特殊的DRM
在源代码中如下:
#EXT-X-KEY:METHOD=AES-128,URI="key.bin"
6、初步认识WidevineDRM
这里说一下我所知道的WidevineDRM吧。
- Windevine 分为三个等级L1、L2、L3,他们的加密程度不一样。其中L1加密的最恨 L3加密的比较轻了就。 所以我们先了解L3
- 加密设备可以是硬件设备和软件设备,硬件设备无法被破解,除非拿到他的硬件,然后去逆向他的硬件设备。 软件设备相对就轻松一些。
提供几个站点吧。
- 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
其实看这些站点有点像大海捞针的感觉,所以还是应该注意一下的,我不太建议这样操作。
7、认识一个开源库
WidevineProxy2: https://github.com/DevLARLEY/WidevineProxy2
这个开源库的使用方法如下(官方已经解释的很清楚了 ,但是是英文的,所以我在这里再说一遍吧):
这里只针对谷歌浏览器哈。火狐的话原理是一样的
打开后的界面是这样的
这时候我们就需要继续阅读github文档了。
官方说:
如果您只有device_client_id_blob和device_private_key,请运行此命令来创建.wvd 文件:
pywidevine create-device -k device_private_key -c device_client_id_blob -t "ANDROID" -l 3
现在,打开扩展,单击Choose File并选择您的 Widevine 设备文件。
首先我们应该先了解一下 device_client_id_blob 文件和 device_private_key文件怎么获取。
-
device_client_id_blob
:通常存储设备的标识符和配置数据,用于身份验证和设备注册。 -
device_private_key
:存储设备的私钥,用于加密通信、数字签名和身份验证。
AI就是好用。
对于如何获取这两个密钥,其实网上说早期可以浏览器直接抓包获取密钥,但是现在已经不适用了,生不逢时啊。
现在可以从安卓设备上提取,如果没有安卓设备也可以从支持DRM的安卓虚拟机中提取。、
这里有一个开源项目开源看一下 L3-Dumping
需要用到安卓逆向的东西,我不会,但是我已经有密钥文件了。哦哈哈哈
拿到device_client_id_blob 文件和 device_private_key 文件后就可以进行下一步操作了。
我直接执行上面说的即可, 生成一个.wvd 文件
在插件中选择Choose File ,后选择wvd文件即可
这里我使用一个DRM保护的网站进行测试
注意感觉观察两个重点,
一个是ChooseFIle 下面一句,L3加密,
已经下面的一些Keys data 什么什么的都有了
我们直接吧CMD里面的命令复制到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 : 内容匹配: 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
请选择 你要下载的内容:
> [ ] 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% - - --:--:--
这时候我们就已经正常跑起来了。
这里是有两个工具需要下载的,
一个是 N_m3u8DL-RE 执行的时候还会提醒少工具,到时候见招拆招即可,
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的
本文结束,下篇文章分析一下开源库的js代码。看一下他是如何hook的数据包。
8、Widevine DRM解密原理
DRM 存在目的是为了防止带有版权的多媒体内容不被非法访问的访问控制技术,被DRM保护的视频即使下载页没办法看,因为有加密嘛。
流媒体服务商先将加密视频内容放在自己的内容服务器,将密钥key放置在谷歌提供的Widevine认证服务器。用户播放时,先与Widevine服务器完成认证,得到key之后从内容服务器下载视频,并用key解密播放。
Widevine拥有三个安全级别——L1、L2和L3。L1是最高的安全级别,解密全过程在硬件中完成,需要设备支持。L3的安全级别最低,解密全程在CDM(Content Decryption Module )软件中完成。L2介于两者之间, 核心解密过程在硬件完成,视频处理阶段在软件中完成。本文只讨论L3级视频的解密方式。
播放L3级加密视频需要CDM模块,主流的视频播放设备均已内置CDM。播放器调用DRM进行解密时,有以下过程:
- 用户开始播放视频时,客户端从视频服务器中下载mpd文件。在解析mpd之后,播放器根据相关字段确定该视频是否使用Widevine加密视频。
- 播放器将加密音视频流初始化信息发送给内置的CDM模块解密。
- CDM接收到来自播放器的初始化信息,并创建“许可证请求”,然后将其发送回给播放器
- 播放器接收到许可证请求后,将该请求发送给Widevine license服务器。许可证请求为全报文加密,抓包改包的方式无法进行攻击。
- license服务器接收到播放器发送的请求后解密,提取初始化信息,并通过初始化信息找到其数据库中的播放key。之后将key加密,返回给播放器。
- 播放器接收到license服务器返回的key,将它传递给CDM。所有往来流量均被加密,播放器和中间人都无法读取相关信息。
- CDM调用相关的解密工具,将加密视频分段解密,实时传送到播放器播放,不在本地存储。
__EOF__
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 本地部署 DeepSeek:小白也能轻松搞定!
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 如何基于DeepSeek开展AI项目