我是不会改名的 发表于 2022-7-21 21:38

某hukem3u8解密简单分析

本帖最后由 我是不会改名的 于 2022-7-22 20:56 编辑

# 某huke解密简单分析

## 相关地址

(https://cloud.tencent.com/document/product/266/73874)

(https://www.52pojie.cn/thread-1631141-1-1.html)

(https://www.52pojie.cn/thread-1660378-1-1.html)
(https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1216587&pid=32815551)

[自研播放器指引.md](https://github.com/tencentyun/qcloud-documents/blob/a251af31fafce4262b1a1cfaff61d287e97faec1/product/%E8%A7%86%E9%A2%91%E6%9C%8D%E5%8A%A1/%E7%82%B9%E6%92%AD/%E5%BC%80%E5%8F%91%E8%80%85%E6%8C%87%E5%8D%97/%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE/%E8%87%AA%E7%A0%94%E6%92%AD%E6%94%BE%E5%99%A8%E6%8C%87%E5%BC%95.md)

## 正文部分

先随便打开一个地址,获取m3u8地址,发现直接下不了,但是key确实只有16位,换成ecb解密,同样不行,说明key可能加密了。

注意到key链接,很明显人家都提示了,腾讯云的,aes加密,后面token是看开头eyjh,直接base64解码

![](https://img01-xusong.91q.com/FB196563-8BDB-4A99-822F-2BF820F8F445.png)

解码过后,发现有几个可以的参数

![](https://img01-xusong.91q.com/110F959F-FA0C-41FB-9CCE-9FBCC61F937B.png)

先百度搜一下,最终在腾讯云点播api文档中发现有部分描述

![](https://img01-xusong.91q.com/CC81721F-F651-442B-A5E5-38E1A6A64B29.png)

但很奇怪啊,key链接中的overlayKey是空的,反而还多了个cipheredOverlayKey,百度一下

![](https://img01-xusong.91q.com/5F112268-F603-47C7-B489-14ABE9DF2B8D.png)

很明显加密了,分析下cipheredOverlayKey,看这种字符串没有符号,多半就是hex值,编码一下看看

![](https://img01-xusong.91q.com/C2621BFD-FC2E-4E94-89F1-3F794C09E0C0.png)

256字节的,而且发现每次都不一样,估计就是rsa加密了,但很奇怪啊,并没有找到解密的地方,只有公钥,同时发现在请求m3u8地址的时候也发送了cipheredOverlayKey,说明很可能服务端是根据客户端来返回相关地址。

![](https://img01-xusong.91q.com/24FC849A-0446-44F9-9295-9484D5432087.png)

直接搜索overlayKey,在相关位置打上断点,刷新,再次播放视频。发现会在这里断下

![](https://img01-xusong.91q.com/8A5C364C-B780-408E-8386-5C4D5042178A.png)

单步跟进去,发现有Math.random(),很明显了,overlayKey和overlayIv都是随机生成的,那么后面批量下载的时候可以考虑直接写死'00000000000000000000000000000000'(我已经验证了,没问题可以解密)

```javascript
                        function r() {
                            var t = ""
                              , e = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"];
                            for (i = 0; i < 32; i++) {
                              t += e
                            }
                            return t
                        }
                        function o(t, e) {
                            return Math.floor(Math.random() * (e - t + 1) + t)
                        }
```



继续走下去,或者看下图

![](https://img01-xusong.91q.com/0ADA526A-6F64-45BD-8B1C-81755929A999.png)

在这里反复横跳了好多次,最终发现在这里面的i = this.enModule.generatePlayCgiUrl(i))方法中,i也就是url地址发生了变化,多了个cipheredOverlayKey,

```javascript
            u && (i += (~i.indexOf("?") ? "&" : "?") + u,
            i = i.replace("?&", "?"),
            Hls$1 && Hls$1.isSupported() && !IS_ANY_SAFARI && (this.enModule = new Enc,
            i = this.enModule.generatePlayCgiUrl(i))),
            this.getInfoRetryTimes = 0,
            this.getInfoRequest = function(t) {
                t && (i = i.replace(SERVER_PATH_V4, SERVER_PATH_BACKUP)),
                IE_VERSION && IE_VERSION < 10 ? jsonp(i, {
                  param: l,
                  timeout: 3e3,
                  prefix: "TcCallBack"
                }, bind(this, this.onResultV4)) : xhr({
                  url: i,
                  timeout: 3e3
                }, bind(this, this.onResultV4))
            }
```

![](https://img01-xusong.91q.com/D02639BC-78E3-4D76-8DC6-C9DE0B1CB89B.png)

跟进这个方法,同时前面提到了可能是ras,搜索PublicKey,下断点,继续跟进,过程很艰难,直接说结果大概这个位置,已经获取公钥,准备设置公钥。

![](https://img01-xusong.91q.com/3ABB7012-152F-4F7A-9EED-18EB6C10B435.png)

然后加密并完善地址,

![](https://img01-xusong.91q.com/955B294A-4102-46F0-870C-906DEC05A989.png)

![](https://img01-xusong.91q.com/B78A7C35-581F-46D4-9FD1-59DD9FCCB3AF.png)

然后发送数据返回请求,继续跟进,

![](https://img01-xusong.91q.com/F09E9239-1BEB-4D72-9422-2B534F6701BA.png)

在这里就很明显了,a就是解密后的key,解密的key和iv就是overlayKey和overlayIv,解密内容是n,即返回的key。控制台打印一下key

![](https://img01-xusong.91q.com/4C4F5491-522D-4DBD-94C8-3171DB580716.png)

复制key和m3u8,用下载器下载,没问题,到此基本结束了。

![](https://img01-xusong.91q.com/F69C3B4C-7B3D-49A2-93B9-09CECF05B95C.png)

## 总结

大致流程,就是,先获取课程id,去获取psign

![](https://img01-xusong.91q.com/5E4C2622-F041-41B4-9243-A7ADF91BC149.png)

然后生成overlayKey和overlayIv,并加密

![](https://img01-xusong.91q.com/38FACC09-A255-43F0-B769-BAEE2CFD3456.png)

再去请求获取,m3u8地址(返回的是多码流,推荐使用逍遥大仙的下载器下载)

![](https://img01-xusong.91q.com/9BF2A909-7A7D-477A-8C93-512A246D29F8.png)

再获取某个清晰度m3u8地址

![](https://img01-xusong.91q.com/E1A4BF33-546A-4F2C-AB3D-3A05CAAE5B46.png)

获取key链接,解密key

![](https://img01-xusong.91q.com/45E72AAF-1D22-40DE-9890-8B3F1DB816FE.png)

下载视频

(https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1216587&pid=32815551)

![](https://attach.52pojie.cn//forum/202207/22/142627oo528iv0xl2o05dp.gif?l)



![](https://img01-xusong.91q.com/8A2940D3-C366-4F71-B68A-420C07BAD8B8.png)

## 后记

研究过程中发现h5以及app均未使用改加密方式,全为key未加密的m3u8地址,闲麻烦的可以去看看app或者改ua。

人家huke很良心了,每天可以免费看一个,就别去搞人家了。

本文仅供学习交流

我今天是大佬 发表于 2023-6-14 13:50

本帖最后由 我今天是大佬 于 2023-6-14 13:53 编辑

lavyw 发表于 2023-6-13 18:15
目前阶段拿到了drmToken,cipheredOverlayKey ,cipheredOverlayIv,后面F12 白屏了,不能 js 调试,拿 ...
结论就是这个网页请求一段代码, 这段代码不准你按F12. 那么只要直接把这段代码屏蔽掉就行了

需要屏蔽的请求地址为
https://www.zlketang.com/wwwstatic/common/console-ban.min.js

具体流程如下:

https://codehere.top/static/tutorial/1.png
https://codehere.top/static/tutorial/2.png
https://codehere.top/static/tutorial/3.png
https://codehere.top/static/tutorial/4.png

lavyw 发表于 2023-6-13 18:15

lavyw 发表于 2023-6-13 18:06
https://www.zlketang.com/vplay/play.html?course_id=6369&subject_id=57&web_auth_id=6399&year=2023
...

目前阶段拿到了drmToken,cipheredOverlayKey ,cipheredOverlayIv,后面F12 白屏了,不能 js 调试,拿不到公钥, 所以卡住了

漁滒 发表于 2022-7-21 22:05

我好像看到有jsvmp了

ZhuanZhuYuIT 发表于 2022-7-21 22:28

膜拜大佬

sakei 发表于 2022-7-21 22:42

确实是大牛啊等还是看不懂

Airey 发表于 2022-7-21 23:32

火钳刘明{:1_893:}学习了

Noren 发表于 2022-7-21 23:50

感谢分享

xianjing0630 发表于 2022-7-22 00:02

虽然看不懂   但是也要支持一下。。

leong 发表于 2022-7-22 00:06

火钳刘明

louischeung004 发表于 2022-7-22 03:33

看不懂就是看不懂,但是也要支持一下

china08 发表于 2022-7-22 05:19

为什么不直接用F12,那样不是更简单吗
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 某hukem3u8解密简单分析