惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
小众软件
小众软件
美团技术团队
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
D
Docker
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
B
Blog
雷峰网
雷峰网
The Cloudflare Blog

乌帮图

七麦数据 analysis 加密参数 | 乌帮图 2021 年 8 月跑步记录:配速很低 | 乌帮图 GitHub 已停止支持 Git 密码验证 | 乌帮图 2021 年 6 月&7 月跑步记录 使用 OpenArk 查找系统全局快捷键 | 乌帮图 2021 年 5 月跑步记录:状态不错 | 乌帮图 腾讯体育直播源调试 | 乌帮图 PP体育直播源调试摘要 | 乌帮图 2021 年 4 月跑步记录:重新启航 | 乌帮图
央视频移动网页版 ckey | 乌帮图
作者是 乌帮图。 · 2021-05-03 · via 乌帮图

CCTV 的直播各种平台都有,不过目前大部分直播源都已经加密了,这个央视频是其中之一,移动网页版域名即 https://m.yangshipin.cn/,今天尝试找到加密过程。

以 CCTV-1 为例:https://m.yangshipin.cn/video?type=1&vid=2000210103&pid=600001859

首先,需要登陆。登陆后点击播放按钮,找到请求地址和参数如下,刷新几次,发现变化的只有 fnticktmcKeyflowid。很明显 fnticktm 都是十位时间戳。flowid 类似 md5,找到 flowid 由函数 createGUID 生成,是随机 32 位字符串。cKey 不明。

Request URL: https://liveinfo.yangshipin.cn/
Parameters:
cmd: 2
cnlid: 2000210103
pla: 0
stream: 2
system: 1
appVer: 3.0.37
encryptVer: 8.1
qq: 0
device: PC
guid: ko8kj04y_icl8j8a2feo
defn: auto
host: yangshipin.cn
livepid: 600001859
logintype: 1
vip_status: 1
livequeue: 1
fntick: 1620044931
tm: 1620044931
sdtfrom: 113
platform: 4330701
cKey: --012D0DFAFF8DE025EE57A91F386CFB0EE42BA857B80ED2EF7A38F51048B1BF740B2E85759CF091A6153093B345BB1D1B1FE02E0878BACF2D8C7CC21CF29F97562166DCF12737C5A7DD3A00B81FE447E0A6BDB2BB6E580EAECEF347696CEE2BD6D2304FA94C9683B1024866394EA3C4DDDA9A9F06F011C62626FED2F982F83DBD327C100A38EA3BEF5DA41F925911FC343E62D3D532F86C05CCDEF9DE05152C615CFFB580B5B6400121EC8096346E9B68721F52A4BDD2BF05CC5E7E1BBA0D70895E
queueStatus: 0
uhd_flag: 4
flowid: 7cad376441f5f0f7a8c41a34265e3e07
sphttps: 1
callback: txvlive_videoinfoget_1044130832

全局搜索 `cKey`,在 `txvlive.js` 中找到相关代码,往函数 `o` 中传入 5 个参数,其中 f 即链接中的 vid,p 是时间戳,其他三个参数都是可以固定的:`TxvLive.pubConfig.version = "3.0.37" ,t.guid= "ko8kj04y_icl8j8a2feo" ,u= 4330701`。

{
    key: "getLiveVideoUrl",
    value: function (t, e, n, i, r) {
        var u = t.platform,
        f = t.vid,
        d = t.defn || "",
        h = l(u),
        p = a.getTimeStampStr({
                time: this.svrtick
            }),
        v = "";
        try {
            v = o(f, p, TxvLive.pubConfig.version, t.guid, u)
        } catch (g) {}
        var m = this;
        !function () {
            var o = {
                // ...
                sdtfrom: h,
                platform: u,
                cKey: v,
                queueStatus: 0,
                uhd_flag: t.uhdFlag || 4,
                flowid: t.flowid
            };

单步进入函数,看见函数中有很多代码混肴,直接找到 return 处下断点,再执行,最后拼接出一个 AES 加密函数,CBC 模式, Pkcs7 填充,key 是 Su 值为固定的4E2918885FD98109869D14E0231A0BF4,偏移 iv 同样固定 16B17E519DDD0CE5B79D7A63A4DD801C

央视频ckey加密方法

待加密的字符串 xu = sc + bu + yu,sc 是个分隔符,yu 由前面提到的各种参数拼接,类似 "|2000210103|1620045667|mg3c3b04ba|3.0.37|ko8kj04y_icl8j8a2feo|4330701|https://m.yangshipin.cn/|mozilla/5.0 (iphone; cpu|https://m.yangshipin.cn/|Mozilla|Netscape|Win32|",除了时间戳也都是固定的。

bu 每次都变化,在上面被赋值 _u,再次下断点可以看到 _u 初始为 0,之后循环依次取 yu 每个字符进行两次位运算即可。

其实这个央视频 cKey 用的是腾讯视频某一个版本的加密方法,比较简单。Python 版本就不贴这里了,放在 Github,其中有几点要注意的是:

1、AES 加密返回值没有进行 base64,直接是十六进制字符串,同时 key 和 vi 也一样,不能直接 encode,需 a2b_hex 转换。

2、_u 进行位运算最后是字符串拿去拼接,不管有无符号。在 JavaScript 中可能出现负数,而 Python 整数不分类型,上面在位运算时不会溢出,也不会出现形式上的负数了,得用 ctypes 模块来处理下。

最后,虽然算出 cKey,能成功获取到央视频的直播源,但感觉用处不大:

1、央视频移动网页版的直播需要登陆,且播放链接有效期很短,可能为引导用户到 app 上观看。

2、每个 IP 每天有试看次数限制,超出后无返回。

3、央视频 app 抓到的链接有效期很长,且请求时无需带 cookie,但 cKey 不知怎么生成的,需要反编译。