吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7158|回复: 51
收起左侧

[Web逆向] 某平台m3u8视频js获取解密key过程分析

  [复制链接]
xdxgkxq 发表于 2024-2-5 13:20
本帖最后由 xdxgkxq 于 2024-2-5 13:30 编辑

前言

机缘巧合之下侥幸免费获得某付费教程视频的观看权限,但期限只有一个多月。由于之前一些事情耽搁,等到有时间看已快到期限。于是打算下载本地留个备份。
先试试 IDM 自带的资源嗅探,寄
Pasted image 20240205005940.png

开始

m3u8

首先控制台抓包拿 m3u8 文件:
Pasted image 20240205010712.png

下载ts

然后下载 ts 文件:
简单写个 python 调用 IDM 爬一下

pip install idm
from idm import IDMan
downloader = IDMan()
fold_path = "D:\\video"
for i in range(0, xxx):
    i = str(i).zfill(4)
    url = f"https://略了/index_encrypt_00{i}.ts"
    downloader.download(url, fold_path)

找key

从m3u8的文件信息中可知,使用的加密方法为AES128,获取key的url链接也知道

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="http://略/api/略?vod_id=略&app_id=略",IV=0x00000000000000000000000000000000
#EXTINF:4.000000,
略/index_encrypt_000000.ts
#EXTINF:4.000000,
略/index_encrypt_000001.ts
#EXTINF:4.000000,
略/index_encrypt_000002.ts
#EXTINF:4.000000,
略/index_encrypt_000003.ts

直接访问获取密钥的链接,得到以下内容:

{"msg":"success","code":"200","data":{"cipher_key":"MjEs*sN*****NTMD**U*Us****Y="}}

得到密钥是一串base64编码,在线解码即可:
Base64 编码/解码 - 在线工具 (toolhelper.cn)
Pasted image 20240205012738.png

手动新建一个key.key文件,用Hex编辑器将解码得到的16个数字填进去
Pasted image 20240205013158.png
推荐使用vscode的扩展:Hex Editor
Pasted image 20240205013309.png
之后顺便把index.m3u8文件中这行:

#EXT-X-KEY:METHOD=AES-128,URI="http://略/api/略?vod_id=略&app_id=略",IV=0x00000000000000000000000000000000

改为:

#EXT-X-KEY:METHOD=AES-128,URI="key.key",IV=0x00000000000000000000000000000000

最后将下载到的所有.tskey.keyindex.m3u8文件都放在同一个文件夹内,在shell中执行下面的命令:

ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.ts

注:使用该命令需要下载ffmpeg,如果你装有scoop,可执行scoop install ffmpeg命令直接安装,其他下载方法我没尝试过,烦请自行搜索
然后........
Pasted image 20240205014745.png
就寄了......悲
为什么呢,因为直接访问链接拿到的密钥是错的
然后只能看源码了
根据观察大佬们得来的经验,从ts的启动器入手:
Pasted image 20240205015520.png
进去之后,根据观察大佬们的经验,搜索decryphtdata.key之类的关键词
总共找到三个结果,打断点,发现原本播放的视频断了,所以一般而言,这个this.decryphtdata.key的值就应该是真的密钥了
Pasted image 20240205021215.png
但是!!
AES128加密的密钥不应该是16位吗?这个密钥怎么是47位???

根据观察大佬的文章,判断这个key是被二次加密过,那就接着找解密key的代码
接着查看另外两个结果,发现下面这些相关代码:
Pasted image 20240205020319.png
不懂直接问GPT:

这段代码是一个方法,名为"decryptBuffer",接受两个参数e和t。在方法内部,调用了this.decrypter对象的decrypt方法,传入了e、this.decryptdata.key.buffer和this.decryptdata.iv.buffer作为参数。这个方法的作用是使用decrypter对象对e进行解密,使用this.decryptdata.key.buffer和this.decryptdata.iv.buffer作为解密所需的key和iv,将结果存储在t中。

然后我们搜索decrypter,找到这个:
Pasted image 20240205024716.png
问GPT:

这段代码是一个方法,名为"push",接受多个参数。在方法内部,首先对参数进行一些判断和处理,然后调用了this.decrypter对象的decrypt方法,传入了e、t.key.buffer和t.iv.buffer作为参数。当解密完成后,触发了一个事件并调用了pushDecrypted方法,将解密后的数据和其他参数传入。如果不需要解密,直接调用了pushDecrypted方法,将原始数据和其他参数传入。这段代码主要实现了对数据进行解密和处理后推送到指定位置的功能。

那么这里应该是key的解密程序了,然后打断点查看值:
Pasted image 20240205025438.png
没错确实是16位,把值像前面一样写进key.key文件,

解密

然后就是tsm3u8key.key放在一个文件夹下,执行命令:

ffmpeg -allowed_extensions ALL -protocol_whitelist "file,http,crypto,tcp" -i index.m3u8 -c copy out.ts

大功告成,耶(截图是后面补的)
Pasted image 20240205122935.png

参考文章

非常感谢一下大佬的文章,给了非常非常大的帮助,本文的也基本是仿照大佬写的

写在最后

蒟蒻第一次心血来潮搞这个,网上找了好多教程,虽然自己写的找key的过程就几句话,实际做的过程中卡了好长时间,还是自己太菜了,比如一开始找到的key为什么是47位,其实是因为base64解码出来的一串数组,像下面这样:

28,99,99,08,03,00,99,99,99,99,99,99,99,99,99,54

它的带逗号的,$2*16+15 =47$ ,这也是为什么这里44会反复出现
Pasted image 20240205124836.png
就想这种一个简单的问题卡了好长时间........


免责声明

本人仅仅用于个人学习。任何人不得将上述内容用于商业或者非法用途。




免费评分

参与人数 19威望 +1 吾爱币 +36 热心值 +17 收起 理由
csvip + 1 谢谢@Thanks!
zooo1996 + 1 + 1 热心回复!
owouwu + 1 + 1 热心回复!
plasd + 1 + 1 用心讨论,共获提升!
xxxlsy + 1 + 1 热心回复!
letr + 1 我很赞同!
yjn866y + 1 + 1 谢谢@Thanks!
独行风云 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
modesty88 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
JAMEZWER + 1 用心讨论,共获提升!
businiao10000 + 1 + 1 我很赞同!
PVC1294 + 1 看不太懂但学习一下,感谢分享
b6571 + 1 + 1 用心讨论,共获提升!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
luffy365 + 1 + 1 用心讨论,共获提升!
kuiba + 1 + 1 用心讨论,共获提升!
liuxuming3303 + 1 + 1 用心讨论,共获提升!
jason76wong + 1 + 1 我很赞同!
Bob5230 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

god4 发表于 2024-2-6 03:51
本帖最后由 god4 于 2024-2-6 03:53 编辑

把m3u8文件中的url编辑好,用绝对地址,然后直接用ffmpeg下载转换成mp4,命令为:
ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,https,tls,crypto,tcp" -i 文件名.m3u8 -c copy 文件名.mp4
wakichie 发表于 2024-2-5 15:37
 楼主| xdxgkxq 发表于 2024-2-5 15:59
xmiter 发表于 2024-2-5 18:33
老哥这操作不错,学习了
stoneman 发表于 2024-2-5 20:35

老哥这操作不错,学习了
coolboyxdl 发表于 2024-2-5 22:08
老哥这操作不错,学习了
yourbestrun 发表于 2024-2-5 22:10

老哥这操作不错,学习了
deniol 发表于 2024-2-6 02:44
用心学习了
lxw3254 发表于 2024-2-6 08:12
虽然看不懂,技术贴,纯支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 08:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表