【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)

1.目标

网址:https://y.qq.com/n/ryqq/toplist/26


我们知道了 sign= P(n.data),其中n.data明文的请求参数

2.webpack生成data加密参数

那么 L(n.data)就是密文的请求参数。返回一个Promise {<pending>},所以L(n.data) 是一个异步函数。

javascript 复制代码
L(n.data).then(result => {
    console.log('结果是:', result);
}).catch(error => {
    console.error('发生错误:', error);
});
javascript 复制代码
window.shark(0).cgiEncrypt(data).then(result => {
    console.log('结果是:', result);
}).catch(error => {
    console.error('发生错误:', error);
});

运行之后报错

javascript 复制代码
p[r[++h]] = p[r[++h]].call(p[r[++h]], p[r[++h]]);
TypeError: Cannot read properties of undefined (reading 'call')

因为请求参数是用了AES-GCM加密,且使用了随机iv

AES-GCM 是一种高级加密标准(AES)与伽罗瓦 / 计数器模式(GCM)结合的加密方式

在浏览器环境中,window.crypto 对象是 Web Crypto API 的入口,用于实现加密相关的功能。window.crypto.subtleSubtleCrypto 接口的实例,它提供了更底层、更强大的加密功能。
SubtleCrypto 的所有方法均返回 Promise,需通过 then/catchasync/await 处理异步结果(例如密钥生成、加密解密等操作)。

所以我们只需要导入

javascript 复制代码
window = globalThis;;
window.crypto = require('crypto');

就可以正常生成结果

3.逆向还原data加密参数

密钥就是vTBfEND/dLbvVNq4NbXhzw==

这样生成的结果长度为448,而网页长度是464,少了16位,而这16位正是iv

AES-GCM 通常需要将 IV 和密文一起传输,接收方才能正确解密

这样就没有问题

4.响应数据解密

返回的数据是二进制

数据解密是用j.__cgiDecrypt,当然也是AES-GCM解密

JSON.parse(N(可快速定位

5.绕过加密验证

我们请求携带了"encoding": "ag-1",正是告诉QQ音乐服务器要采用某种加密方式

请求不要携带这个,同时data参数保持明文传输

python 复制代码
import requests
import json

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36",
    "Accept": "application/octet-stream",
    "accept-language": "zh-CN,zh;q=0.9",
    "cache-control": "no-cache",
    "content-type": "text/plain",
    "origin": "https://y.qq.com",
    "pragma": "no-cache",
    "priority": "u=1, i",
    "referer": "https://y.qq.com/",
    "sec-ch-ua": "\"Chromium\";v=\"136\", \"Google Chrome\";v=\"136\", \"Not.A/Brand\";v=\"99\"",
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site"
}

url = "https://u6.y.qq.com/cgi-bin/musics.fcg"
params = {
    "sign": "zzc308f0fefeuogbgecps0gpzosg6fnvxujyw0474ee6d"
}
data = {
    "comm": {
        "cv": 4747474,
        "ct": 24,
        "format": "json",
        "inCharset": "utf-8",
        "outCharset": "utf-8",
        "notice": 0,
        "platform": "yqq.json",
        "needNewCode": 1,
        "uin": 0,
        "g_tk_new_20200303": 5381,
        "g_tk": 5381
    },
    "req_1": {
        "module": "musicToplist.ToplistInfoServer",
        "method": "GetDetail",
        "param": {
            "topid": 27,
            "offset": 0,
            "num": 20,
            "period": "2025-05-29"
        }
    }
}
data = json.dumps(data, separators=(',', ':'))
response = requests.post(url, headers=headers, params=params, data=data)

print(response)
print(response.text)

也就是说只需要分析sign即可

相关推荐
毕设源码-郭学长42 分钟前
【开题答辩全过程】以 Python基于大数据的四川旅游景点数据分析与可视化为例,包含答辩的问题和答案
大数据·python·数据分析
Lin_Aries_04211 小时前
容器化 Flask 应用程序
linux·后端·python·docker·容器·flask
MediaTea1 小时前
Jupyter Notebook:基于 Web 的交互式编程环境
前端·ide·人工智能·python·jupyter
阿_旭1 小时前
基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·肝脏肿瘤分割
奶糖 肥晨1 小时前
Uniapp 开发中遭遇「可选链赋值」语法陷阱:一次编译错误排查实录
javascript·vue.js·uni-app
个人看法2 小时前
h5实现一个吸附在键盘上的工具栏
前端·javascript·vue
belldeep2 小时前
python:Django 和 Vue.js 技术栈解析
vue.js·python·django
知识分享小能手2 小时前
微信小程序入门学习教程,从入门到精通,微信小程序页面制作(2)
前端·javascript·学习·微信小程序·小程序·前端框架·notepad++
jason_yang2 小时前
JavaScript 风格指南 精选版
前端·javascript·代码规范
蓝桉~MLGT3 小时前
Python学习历程——基础语法(print打印、变量、运算)
开发语言·python·学习