吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 26994|回复: 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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
# 接口得到的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] 纯文本查看 复制代码
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] 纯文本查看 复制代码
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
wyh757787026 发表于 2022-9-19 15:43
bnb 发表于 2022-11-22 03:07
大佬,有空能分析下乐易网课的m3u8怎么下载转成mp4
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, 下载次数: 49)
4  用浏览器打开 小e视频
5  按照图示 点击扩展 猫爪 进行下一步操作

1.png

2.png

3.png

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, 2024-11-22 11:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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