前言

因为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提取法

安装Android Studiohttps://developer.android.google.cn/studio?hl=zh-cn

【教程】学习一下某平台DRM解密方法(+下载和转播)

进入模拟器管理器(Virtual Device Manager):

【教程】学习一下某平台DRM解密方法(+下载和转播)

新建一个机型Pixel 6、版本安卓9(Pie)的模拟器:

【教程】学习一下某平台DRM解密方法(+下载和转播)

【教程】学习一下某平台DRM解密方法(+下载和转播)

按Finish下载镜像并完成安装后,百度找一下安卓平台工具(用爱玩机工具箱一类的带adb程序的也行),下载Win版:

【教程】学习一下某平台DRM解密方法(+下载和转播)

在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

【教程】学习一下某平台DRM解密方法(+下载和转播)

运行后这个指令行会暂时没动静,不用关也不用管。

接下来在dumper仓库下载仓库文件并且打开指令行

然后依次输入下面指令(protobuf需要降级才能正常使用):

pip3 install -r requirements.txt
pip install protobuf==3.20.* 
python .\dump_keys.py

【教程】学习一下某平台DRM解密方法(+下载和转播)

这样就又出现一个命令行窗口,这个也不要关(只要显示Hooks Completed就OK)。

安卓模拟器那边的窗口可以打开了,给它安装好需要的软件以后,挂好代理打开sample视频窗口:

https://bitmovin.com/demos/drm

视频能正常播放就说明抓取到了相关的凭据文件。

在dumper-main那边文件夹下可以挖到private_keys的一个子文件夹,这个文件夹下的内容就是我们需要的凭据文件。

【教程】学习一下某平台DRM解密方法(+下载和转播)

然后模拟器和两个命令行都可以关了。

最后在这个key文件夹执行一下就可以获取到需要的wvd文件了:

pywidevine create-device -k private_key.pem -c client_id.bin -t "CHROME" -l 3 -o wvd

【教程】学习一下某平台DRM解密方法(+下载和转播)

注:WidevineProxy2仓库里面写的是pywidevine create-device -k device_private_key -c device_client_id_blob -t "ANDROID" -l 3 ,个人推测应该是没有区别的。

下面这个方法简单不少。

Root手机提取法

昨天某个视频下载的时候重新拿手上的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安装Keydive
  • keydive -kwp运行安装脚本,会在手机上自动安装Kaltura Device Info
  • 在手机上打开APP以后,点击右下角按钮后,再点Test DRM playback(挂代理),随便选一个播放即可在电脑抓到此设备的keys。

【教程】学习一下某平台DRM解密方法(+下载和转播)

某平台视频抓取方法

打开的Releases页面,下载Chrome或Firefox用的浏览器插件:

【教程】学习一下某平台DRM解密方法(+下载和转播)

然后通过各个平台的开发者模式安装这些插件包。

安装以后导入刚才生成的wvd文件(Chooese File,然后在弹出的窗口里面选择刚才获得的文件):

【教程】学习一下某平台DRM解密方法(+下载和转播)

打开需要下载或者转播的页面,让其可以正常播放(遇到第一次播放可能会失败,请刷新一下):

【教程】学习一下某平台DRM解密方法(+下载和转播)

这个时候点一下插件,可以发现插件成功抓取了播放需要的keys并且点+号可以看到生成了一段下载指令行。

【教程】学习一下某平台DRM解密方法(+下载和转播)

格式大概是这样(我用的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也可以实现同等效果)

【教程】学习一下某平台DRM解密方法(+下载和转播)

然后从N_m3u8DL-RE仓库下载win-x64.zip并解压,将对应的exe文件和packager-win-x64.exe放在一起,这里假设为E:\soft

【教程】学习一下某平台DRM解密方法(+下载和转播)

在Windows搜索框里面搜索环境变量,然后打开编辑系统环境变量:

【教程】学习一下某平台DRM解密方法(+下载和转播)

指向用户变量Path,点击编辑,然后点击新建,将E:\soft输入到其中(请无视我图中的例子)。

【教程】学习一下某平台DRM解密方法(+下载和转播)

【教程】学习一下某平台DRM解密方法(+下载和转播)

在指令行输入以下内容:

$env:HTTP_PROXY="http://127.0.0.1:7890"; $env:HTTPS_PROXY="http://127.0.0.1:7890"
N_m3u8DL-RE {后略}

然后会有非常简单易懂的指令选择,直接下就好。

【教程】学习一下某平台DRM解密方法(+下载和转播)

不过某平台对于速度过快的下载好像会掐(而且没有断点续传),所以最好限个速。

推流

因为后续另外一个演唱会也是这个某平台再加上另外一位朋友希望转播到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。

参考文献

文章目录