吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 29453|回复: 268
收起左侧

[Web逆向] 某鹅通m3u8视频JS获取解密Key的过程分析

    [复制链接]
pengsx01 发表于 2022-9-19 10:56
本帖最后由 pengsx01 于 2022-10-28 18:58 编辑

前言

近期网页更新,m3u8链接也发生了变化,以前的很多工具都无法直接下载视频了,下面和大家分享一下新的m3u8文件获取AES加密key的过程。
本文下面描述部分链接会脱敏处理,不展示实际链接。
其m3u8的文件的链接特征如下:
https://pri-cdn-tx.xiaoeknow.com/app*****193/private_index/16630*****cxyn0.m3u8?sign=bd76*****57c6763&t=6326d139



工具环境

m3u8下载工具:N_m3u8DL-CLI (https://github.com/nilaoda/N_m3u8DL-CLI)




分析过程

首先我们还是先拿到m3u8文件,有很多方法都能拿到m3u8文件,如图用控制台抓包获取链接
图片1.png

下载得到的m3u8文件的内容如下:
图片2.png

用工具直接下载时会出现报错,这时分片信息的链接还不完整,ts分片的链接从控制台可以抓到,
样例URL是:https://encrypt-k-vod.xet.tech/97*****26/18*****18/drm/v.f421220_0.ts?start=276384&end=427551&type=mpegts&sign=e3******c6&t=63***96&us=nh***sc&whref=v.*****.cn
将m3u8文件中ts分片的链接信息补充完整,样例如图:
图片3.png

用m3u8工具尝试下载视频,会再次出现报错,如图:
图片4.png

从上面的报错中能发现,密钥获取失败。从文件的信息可以知道,加密方法是:AES-128
KEY的获取URL是:https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.vod.pri.get/1.0.0?app_id=app*****93&mid=m_G*****MLH&urld=e29*****7f9
IV是:0x00000000000000000000000000000000
这里是GET方式,我们尝试直接请求URL链接获取KEY,得到的结果如下:
图片5_1.png

到这里发现这个链接应该是缺少什么参数,打开控制台对源码搜索分析了一波,
搜索关键词:xe.basic-platform.material-center.distribute.vod.pri.get
找到如下代码:
图片5.png

上图能看出在发请求时在链接后拼接了一个&uid=windows.USERID,
这里windows.USERID的值是什么呢,由于是全局的常量,这里在控制台打印一下。
如图:
图片6.png

发现这个USERID就是我们看视频在那里飘来飘去的一串字符串。

这时候我们手动将上面的链接拼接完整,
示例为:https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.vod.pri.get/1.0.0?app_id=app*****93&mid=m_G*****MLH&urld=e29*****7f9&uid=u_5f****6f_oR****i5
放到浏览器试一下,结果如图:
图片7.png

看到这里看起来像是正常的响应了,下面写个简单的python脚本验证一下,代码如下:
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
import requests
 
url = 'https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.vod.pri.get/1.0.0?app_id=app*****93&mid=m_G*****MLH&urld=e29*****7f9&uid=u_5f****6f_oR****i5'
response = requests.get(url=url)
key = response.content
print(key)
print(list(key))
print(len(key))


控制台打印结果如下:
图片8.png

请求返回结果长度是16字节的bytes,看起来就是我们需要的key,那将m3u8文件里面的url拼上uid参数,再次放到下载工具测试一波。
图片9.png

看到这里发现,这事果然没那么简单。按网上的一些教程用python写了一个解密方法,对单独下载的一个ts分片进行解密,下面贴一下方法代码,
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
 
 
def aes_decrypt(data, key, iv):
    new_data = pad(data_to_pad=data, block_size=AES.block_size)
    aes_d = AES.new(key, AES.MODE_CBC, iv)
    return aes_d.decrypt(new_data)


接口请求返回的这16字节长度的KEY依然无法解密视频,那这KEY应该是二次加密了。

那我们只能继续从源码去分析了。

经过几天的研究(不得不说混淆后的源码真难懂),搜索关键词decryptdata,在其下一步,如下地方打上断点(别问我怎么找到的,经过了很多次尝试),如图:
图片10.png

在这里发现了疑似解密的KEY和IV,将其复制出来,用上面描述的解密方法对下载的ts分片进行了解密测试,发现解密之后能正常播放。
由此得出结论:这里的bytes才是真实的解密KEY,上面接口请求得到的bytes确实经过二次加密。
[Python] 纯文本查看 复制代码
1
2
3
4
# 接口得到的KEY
[84, 108, 181, 86, 126, 236, 204, 25, 141, 70, 27, 121, 123, 48, 187, 33]
# 源码打断点得到的KEY
[33, 51, 128, 48, 28, 218, 170, 47, 233, 39, 120, 29, 78, 6, 221, 126]


看到这里大家就很好奇了,这个真实的KEY是怎么得到的呢!!!

我当时就挺难受的,还真的是二次加密了,抓了好多视频的两组KEY拿来做对比观察,发现没有明显的规律。

好吧,那只能继续看一堆混淆的代码去研究了。

这里再次回到上面说到的关键词xe.basic-platform.material-center.distribute.vod.pri.get,这里请求之后在某个地方肯定会对获得的结果进行处理,
在如下地方打上断点:
图片11.png

打上断点之后需要刷新一下网页让代码停在断点处,单步跟进第一个断点,发现这里是发送请求的过程,请求接口得到KEY的值,这里的值会在下面使用,如图:
图片12.png

继续单步调试,这里能看出对USERID处理后得到了d的值,从代码来看,这一步其实就是将USERID字符串转成bytes字节数组,如图:
图片13.png

继续跟进,发现调用了一个ccall函数,并且将两个数组都当参数传入了,我们继续跟进代码,分析其逻辑是创建一个很长的数组,
将传入的参数进行处理之后放进去,再利用方法反向操作取出对应的值,这里的f值就是一个初始的偏移量。
这应该是混淆对我们的干扰。如下:
图片14.png

回顾上面传入的两个字节数组,
[84, 108, 181, 86, 126, 236, 204, 25, 141, 70, 27, 121, 123, 48, 187, 33],
[117, 95, 53, 102, 98, 54, 102, 54, 100, 97, 99, 100, 53, 54, 102, 95, 111, 82, 98, 80, 122, 89, 53, 114, 105, 53],
我们跟进代码发现在堆栈中,其取出了两个数组的第一个值,如图:
图片15.png

看到这里猜测其应该是某种字节码注入技术,我对前端不是太懂,欢迎大佬评论区补充。
回到正题,这里取出之后做了一个i32.xor操作,然后得到了33的值,
如图:
图片16.png

细心的小伙伴们肯定已经发现了一点什么,
我们实际来解密的KEY是
[33, 51, 128, 48, 28, 218, 170, 47, 233, 39, 120, 29, 78, 6, 221, 126],
上面得到的结果就是33!!!
是不是我们想的那样呢,我们继续跟进验证想法,如图:
图片17.png
图片18.png

没错,就是我们想的那样子,这里的操作就是对两个数组进行循环,将两个数组取出来的值进行一个i32.xor操作就能得到我们需要的结果值。
查了一波i32.xor发现是异或操作,为了验证,写波代码测试一下,代码如下:
[Python] 纯文本查看 复制代码
1
2
3
4
5
6
7
8
url_key = [84, 108, 181, 86, 126, 236, 204, 25, 141, 70, 27, 121, 123, 48, 187, 33]
userid_bytes = [117, 95, 53, 102, 98, 54, 102, 54, 100, 97, 99, 100, 53, 54, 102, 95,
                111, 82, 98, 80, 122, 89, 53, 114, 105, 53]
# 目标:[33, 51, 128, 48, 28, 218, 170, 47, 233, 39, 120, 29, 78, 6, 221, 126]
result_key = []
for i in range(0, len(url_key)):
    result_key.append(url_key[i] ^ userid_bytes[i])
print(result_key)




结论

M3U8文件中的URL获取到的16位长度字节数组,与用户ID转化得到的字节数组的前16位依次做异或操作即可得到真实的解密KEY。
Python实现的通过URL获取解密KEY的代码如下:
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import base64
 
 
def get_key_from_url(url: str, userid: str) -> str:
    """
    通过请求m3u8文件中的key的url,获取解密视频key的base64字符串密钥
    :param url: m3u8文件中获取key的url
    :param userid: 用户id,放视频时飘动的那一串
    :return: key的base64字符串
    """
    # url拼接uid参数
    url += f'&uid={userid}'
    # 发送get请求
    rsp = requests.get(url=url)
    rsp_data = rsp.content
    if len(rsp_data) == 16:
        userid_bytes = bytes(userid.encode(encoding='utf-8'))
        result_list = []
        for index in range(0, len(rsp_data)):
            result_list.append(
                rsp_data[index] ^ userid_bytes[index])
        print(result_list)
        return base64.b64encode(bytes(result_list)).decode()
    else:
        print(f"获取异常,请求返回值:{rsp.text}")
        return ''
 
 
if __name__ == '__main__':
    _url = 'https://app.xiaoe-tech.com/xe.basic-platform.material-center.distribute.vod.pri.get/1.0.0?app_id=app****3&mid=m_G****t_3****H&urld=e****f9'
    _uid = 'u_5****f_o****5'
    base64_key = get_key_from_url(url=_url, userid=_uid)
    print(base64_key)


将获取到的密钥填入工具即可下载成功,如图:
图片19.png



写在最后
本文仅供研究学习使用,请勿用于非法用途。如有侵权,请联系管理员删除!
注:若转载请注明来源(本贴地址)与作者信息。

免费评分

参与人数 65威望 +1 吾爱币 +80 热心值 +59 收起 理由
isaacchen + 2 + 1 用心讨论,共获提升!
x3e5 + 1 我很赞同!
临渊行 + 1 + 1 用心讨论,共获提升!
Tkver + 1 + 1 我很赞同!
cccjjjbbb + 1 + 1 谢谢@Thanks!
5ipj2007 + 1 用心讨论,共获提升!
xyz530 + 1 + 1 谢谢分享
lsxqw2004 + 1 + 1 谢谢@Thanks!
夜莺高歌 + 1 + 1 我很赞同!
zeal + 1 + 1 谢谢@Thanks!
vimpares + 1 + 1 谢谢@Thanks!
luolifu + 1 + 1 谢谢@Thanks!
sbqhh2 + 1 + 1 我很赞同!
645227198 + 1 + 1 谢谢@Thanks!
异常马粥 + 1 + 1 以前看书初章有异或加密。没想到,真应用了。
笨神仙 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Fate` + 1 谢谢@Thanks!
akiri + 1 tql
ilfytbs + 1 热心回复!
zhaoxiaohua125 + 1 + 1 好像又改版了,2333
Sky390 + 1 + 1 谢谢@Thanks!
wuyla + 1 谢谢@Thanks!
lfq317377106 + 1 谢谢@Thanks!
shengyong + 1 我很赞同!
ceusnow + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
huawuya + 1 + 1 我很赞同!
bp946 + 1 + 1 用心讨论,共获提升!
fei05 + 1 + 1 谢谢@Thanks!
junm1888 + 1 + 1 用心讨论,共获提升!
XUEXIQIANGGUO + 1 + 1 谢谢@Thanks!
DonkeyL + 1 我很赞同!
涛涛不绝00 + 1 + 1 热心回复!
Heasitation + 1 + 1 用心讨论,共获提升!
hht805656153 + 1 + 1 谢谢@Thanks!
假如时光倒流 + 1 + 1 谢谢@Thanks!
明月清疯 + 1 + 1 用心讨论,共获提升!
Nickie + 1 + 1 我很赞同!
ninthcrack + 1 + 1 谢谢@Thanks!
minz + 1 + 1 谢谢!终于学会了
飘零未忍 + 1 分片链接批量获取没说清楚
xytx223 + 1 + 1 热心回复!
turbodog + 1 刚好卡在二次加密这一步了,感谢!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ss13853838938 + 1 + 1 虽然我看不懂!但是看到楼主写的过程犹如其中!体会未知探索的心情!不错不.
lamgpyc + 1 谢谢@Thanks!
wanfon + 1 + 1 热心回复!
sgyz520 + 1 + 1 我很赞同!
a1002 + 1 + 1 我很赞同!
yiyiwangru + 1 + 1 我很赞同!
策士 + 1 我很赞同!
xuhaiqing517 + 1 + 1 热心回复!
hxw0204 + 1 + 1 我很赞同!
笙若 + 1 + 1 谢谢@Thanks!
szxchj + 2 我只能说你们讨论的越多,小鹅通就越难搞,怀念以前不花钱白嫖的日子,现在.
JonesDean + 1 我很赞同!
lingyun011 + 1 + 1 用心讨论,共获提升!
漁滒 + 3 + 1 我很赞同!
白水饮 + 1 + 1 用心讨论,共获提升!
熊猫拍板砖 + 1 + 1 我很赞同!
ofo + 2 + 1 我很赞同!
sgch007 + 1 + 1 谢谢@Thanks!
it_harry + 1 + 1 我很赞同!
tianyagd + 1 + 1 谢谢@Thanks!
zhengsg5 + 1 + 1 谢谢@Thanks!
3yu3 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

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

漁滒 发表于 2022-9-19 16:25
贴一张反汇编的图
QQ图片20220919162522.png
pioidc 发表于 2023-12-26 18:15
1  下载安装360极速浏览器最新版
2  安装插件  https://greasyfork.org/zh-CN/scripts/461963-%E5%B0%8F%E9%B9%85%E9%80%9A-%E9%80%9A%E7%94%A8m3u8%E8%8E%B7%E5%8F%96
3  安装 猫爪 2.4.7    cat-catch-2.4.7-chrome.rar (299.08 KB, 下载次数: 73)
4  用浏览器打开 小e视频
5  按照图示 点击扩展 猫爪 进行下一步操作

1.png

2.png

3.png

免费评分

参与人数 1吾爱币 +1 收起 理由
nicelh + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

wyh757787026 发表于 2022-9-19 15:43
bnb 发表于 2022-11-22 03:07
大佬,有空能分析下乐易网课的m3u8怎么下载转成mp4
zyx0414 发表于 2023-9-20 18:50
本帖最后由 zyx0414 于 2023-9-20 18:52 编辑

好像不行啊,我也是报:Error in reading file
不过楼主太厉害了,我搜了好多m3u8视频解密的文章,还是你的写的最专业,必须点赞支持,多谢多谢
xuhaiqing517 发表于 2022-9-20 10:17
牛鼻,谢谢,帮助很大
 楼主| pengsx01 发表于 2022-10-28 18:57
素流心 发表于 2022-10-28 17:18
网页代码断点调试那,打开后代码都是一整行,怎么打断点啊,为啥大佬是一行一行的

源码框左下角有个{}符号,点一下就能格式化代码
ofo 发表于 2022-9-19 14:51
很详细,最喜欢看这类分析的贴子
tianyagd 发表于 2022-9-19 11:52
发帖不易 鼓励鼓励
bingtuzibb 发表于 2022-9-19 11:58
先赞再说支持支持
zhengsg5 发表于 2022-9-19 13:50
写的很详细,可以帮助过程的学习,支持!
tupaly5 发表于 2022-9-19 14:02
长知识了,感谢楼主的分享
吾爱蛋蛋 发表于 2022-9-19 14:08
谢谢分享啊
siyrra 发表于 2022-9-19 14:16
分析过程看着都眼花,楼主高人
Azune 发表于 2022-9-19 14:31
我一般通过IDM嗅探下载,不过还是涨知识了
15520220211 发表于 2022-9-19 14:52
谢谢老猪大佬。ok
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2025-4-3 06:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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