m3u8 加密视频破解

Xial 发布于 2023-08-16 211 次阅读


闲来无事研究了一下 m3u8 的加密原理。

浏览器抓包获取 m3u8 文件

一般会有两个,一个形如:

#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=256000, NAME="270p 3G"
7172666e6a716f717274313435667165_1.m3u8?aaa=2345782345897&bbb=348979fhi

这个用于对不同的网速应用不同的清晰度。

另一个形如:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-KEY:METHOD=AES-128,URI="http://example.com/***/7172666e6a716f717274313435667165_1.key",IV=0x32333439307468373877676e75396577
#EXT-X-TARGETDURATION:11
#EXTINF:8.400000,
http://example.com/***/7172666e6a716f717274313435667165_1_0.ts?aaa=2345782345897&bbb=348979fhi
#EXTINF:1.667000,
http://example.com/***/7172666e6a716f717274313435667165_1_1.ts?aaa=2345782345897&bbb=348979fhi
#EXTINF:10.000000,
http://example.com/***/7172666e6a716f717274313435667165_1_2.ts?aaa=2345782345897&bbb=348979fhi
#EXTINF:10.000000,
http://example.com/***/7172666e6a716f717274313435667165_1_3.ts?aaa=2345782345897&bbb=348979fhi
#EXTINF:10.000000,
http://example.com/***/7172666e6a716f717274313435667165_1_4.ts?aaa=2345782345897&bbb=348979fhi
#EXTINF:10.000000,
http://example.com/***/7172666e6a716f717274313435667165_1_5.ts?aaa=2345782345897&bbb=348979fhi
#EXTINF:10.000000,
http://example.com/***/7172666e6a716f717274313435667165_1_6.ts?aaa=2345782345897&bbb=348979fhi

............

一般会有很多很多行,对应着视频不同的加密片段(ts 文件)的地址。

#EXT-X-KEY: 记录了加密方式以及加密的秘钥,密钥文件放在 URI 标签中,播放视频时先获取 URI 中的标签,之后解密视频,播放。

现有的破解方式是获取到秘钥后在本地对 ts 文件解密后拼接成完整的视频。而秘钥的 url 通常会做 token 认证,因此比较方便的方法是在浏览器中抓包获取。

获取 key 值

在浏览器中检索 m3u8 文件中 key 的 URI 对应的请求,获取 key 值,比较简单的加密在获取到 key 值之后可以直接用该 key 值使用对应的解密方式解密每一个 ts 文件。

可以使用 openssl 完成,对应的命令为:

openssl aes-128-cbc -d -in encrypt.ts -out decode.ts -K c28540d871bd8ea669098540be58fef5 -iv 32333439307468373877676e75396577

这样就可以成功解密。

但有部分 key 值经过了二次加密,这种 key 会在解密视频文件之前先解密 key 值自身。

AES 128 加密的 key 值长度应该为 16 字节,但有一些 key 值直接抓包拿到的长度为 32 字节,这种一般有二次加密。可以在 player.js 中找到解密部分并在控制台输出解密后的结果。

据了解某利威便是这样做的。可以首先尝试直接整个替换 player js 文件。在 chrome F12 开发者界面中选中源代码标签,在 替换 标签下选择本地路径后开启本地替换,在网页源代码中找到 player.js 并启动本地替换。

可以尝试将 player.js 整个替换为如下文件: player.js.zip

这样会在控制台输出解密后的 key 值。

获取 key 值后可以逐个下载 ts 文件并依次解密,最后合并成完整的视频文件。

最后更新于 2023-08-16