前言
因为EXTREME HEARTS在某平台的直播回放有DRM加密(L3级别),因此简单学习了相关软件的使用方法,接下来分享一下。
Widevine DRM介绍
本节使用Kimi进行总结
Widevine DRM 是什么?
Widevine DRM 是一种数字版权管理(DRM)技术,用来保护视频内容不被非法复制或观看。简单来说,它就像一把锁,把视频文件锁起来,只有通过正确的方式才能打开观看。
Widevine 的工作原理
- 加密视频和密钥分开存放
- 流媒体服务商先把视频加密,然后把加密后的视频放在自己的服务器上。
- 密钥(用来解锁视频的“钥匙”)则放在谷歌的 Widevine 认证服务器上。
用户播放视频时的流程
- 用户播放视频时,播放器会先和 Widevine 认证服务器“打招呼”,验证身份。
- 验证通过后,Widevine 服务器会把密钥发给播放器。
- 播放器用这个密钥解密视频,然后播放出来。
解密视频的方法
要解密 L3 级别的视频,关键是要拿到密钥。文章中提到的步骤是:
- 提取 CDM(内容解密模块)
- CDM 是一个特殊的软件模块,用来解密视频。
- 提取 CDM 的方法是:找一个旧安卓手机或安卓模拟器(不是玩手游用的),root 后用工具提取 CDM。
准备工作
已获得WVD
文件的,可以直接跳到第二节。
提取CDM的方法
本节所用软件:
下面这个方法复杂很多。
安装Android Studio:https://developer.android.google.cn/studio?hl=zh-cn
进入模拟器管理器(Virtual Device Manager):
新建一个机型Pixel 6、版本安卓9(Pie)的模拟器:
按Finish下载镜像并完成安装后,百度找一下安卓平台工具(用爱玩机工具箱一类的带adb程序的也行),下载Win版:
在Windows安装脚本(已安装Python环境前提下):
注:记得后面带version的部分都要根据情况进行修改。
pip install frida
pip install frida-tools
在frida-server
仓库下下载新版本的frida-server-[version]-android-x86.xz
文件。
注:xz格式文件可以用7zip解压。
将解压好的不带后缀名的frida-server-[version]-android-x86
文件移动到刚才下载的平台工具文件夹内(即包含adb.exe文件的文件夹)通过adb指令(右键打开指令行)推送到模拟器内。
adb devices
adb push frida-server-[version]-android-x86 /sdcard
移动后输入:
adb shell
su
mv /sdcard/frida-server-[version]-android-x86 /data/local/tmp
chmod +x /data/local/tmp/frida-server-[version]-android-x86
/data/local/tmp/frida-server-[version]-android-x86
运行后这个指令行会暂时没动静,不用关也不用管。
接下来在dumper
仓库下载仓库文件并且打开指令行
然后依次输入下面指令(protobuf需要降级才能正常使用):
pip3 install -r requirements.txt
pip install protobuf==3.20.*
python .\dump_keys.py
这样就又出现一个命令行窗口,这个也不要关(只要显示Hooks Completed
就OK)。
安卓模拟器那边的窗口可以打开了,给它安装好需要的软件以后,挂好代理打开sample视频窗口:
https://bitmovin.com/demos/drm
视频能正常播放就说明抓取到了相关的凭据文件。
在dumper-main那边文件夹下可以挖到private_keys
的一个子文件夹,这个文件夹下的内容就是我们需要的凭据文件。
然后模拟器和两个命令行都可以关了。
最后在这个key文件夹执行一下就可以获取到需要的wvd文件了:
pywidevine create-device -k private_key.pem -c client_id.bin -t "CHROME" -l 3 -o wvd
注:WidevineProxy2仓库里面写的是pywidevine create-device -k device_private_key -c device_client_id_blob -t "ANDROID" -l 3
,个人推测应该是没有区别的。
下面这个方法简单不少。
昨天某个视频下载的时候重新拿手上的Xiaomi MIX2的老机子提取了一下Key。下面简单讲一下流程:
- 刷机,记得需要刷root权限,开USB调试。
- 通过adb指令连接手机。
- 将
frida server
推送到手机根目录。(adb push frida-server-[version]-android-arm64 /sdcard
mv /sdcard/frida-server-[version]-android-arm64 /data/local/tmp
chmod +x /data/local/tmp/frida-server-[version]-android-arm64
) pip install keydive
安装Keydivekeydive -kwp
运行安装脚本,会在手机上自动安装Kaltura Device Info- 在手机上打开APP以后,点击右下角按钮后,再点
Test DRM playback
(挂代理),随便选一个播放即可在电脑抓到此设备的keys。
某平台视频抓取方法
打开的Releases页面,下载Chrome或Firefox用的浏览器插件:
然后通过各个平台的开发者模式安装这些插件包。
安装以后导入刚才生成的wvd文件(Chooese File
,然后在弹出的窗口里面选择刚才获得的文件):
打开需要下载或者转播的页面,让其可以正常播放(遇到第一次播放可能会失败,请刷新一下):
这个时候点一下插件,可以发现插件成功抓取了播放需要的keys并且点+号可以看到生成了一段下载指令行。
格式大概是这样(我用的firefox插件所以模拟终端也是这个):
N_m3u8DL-RE "[mpd-url]" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0" -H "Accept: */*" -H "Referer: https://[site].co.jp/" -H "Origin: https://[site].co.jp" --key [key1]:[key2] --use-shaka-packager -M format=mkv
下载和转播方法
从上面的指令行,我们发现需要另外两个工具:
前者是下载和转播用的工具,后者则是解密用的工具。
下载
首先从shaka-packager
仓库下载packager-win-x64.exe
。(实际上mp4decrypt
也可以实现同等效果)
然后从N_m3u8DL-RE
仓库下载win-x64.zip
并解压,将对应的exe文件和packager-win-x64.exe
放在一起,这里假设为E:\soft
。
在Windows搜索框里面搜索环境变量
,然后打开编辑系统环境变量:
指向用户变量的Path
,点击编辑,然后点击新建,将E:\soft
输入到其中(请无视我图中的例子)。
在指令行输入以下内容:
$env:HTTP_PROXY="http://127.0.0.1:7890"; $env:HTTPS_PROXY="http://127.0.0.1:7890"
N_m3u8DL-RE {后略}
然后会有非常简单易懂的指令选择,直接下就好。
不过某平台对于速度过快的下载好像会掐(而且没有断点续传),所以最好限个速。
推流
因为后续另外一个演唱会也是这个某平台再加上另外一位朋友希望转播到b站,我问了一下群友并且看了一下文档暂时确定了下面这个推送方法:
$env:HTTP_PROXY="http://127.0.0.1:7890"; $env:HTTPS_PROXY="http://127.0.0.1:7890"
set RE_LIVE_PIPE_OPTIONS="-c copy -f flv rtmp://your-streaming-server-url/your-stream-key"
N_m3u8DL-RE "[mpd-url]" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0" -H "Accept: */*" -H "Referer: https://[site].co.jp/" -H "Origin: https://[site].co.jp" --select-video best --select-audio all --key "[key1]:[key2]" --use-shaka-packager --ui-language "zh-CN" --live-real-time-merge --live-pipe-mux
简单来说就是:
1.设定代理
2.设定推送管道(RMTP)
3.基于N_m3u8DL-RE
自带的FFmpeg进行实时混流和推送,追加了-sv best
直接选择最佳画质
你唯一需要做的就是先去b站直播网页端开播拿到rtmp地址和推送密钥然后丢到这里面去就可以了。
下载指令与上相似:
N_m3u8DL-RE "[mpd-url]" -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0" -H "Accept: */*" -H "Referer: https://[site].co.jp/" -H "Origin: https://[site].co.jp" --select-video best --select-audio all --key "[key1]:[key2]" --use-shaka-packager --ui-language "zh-CN" -M format=mkv
注:对于红色某平台,在下载URL部分需要去除filter=pc_hd_001
的部分,否则会限制画质为720P。