js逆向:某Q音乐平台请求数据模拟生成

news/2025/9/21 16:09:11/文章来源:https://www.cnblogs.com/liuze-2/p/19103772

@

目录
  • 1. 加密原理
  • 2. 参考代码

内容仅供学习使用,不能用于商业活动,且不能在该网站高用户访问时频繁访问,以免对对应服务器造成影响。

1. 加密原理

该音乐平台加密数据为如下图片这个:
PixPin_2025-09-21_16-05-10
所加密的数据data和这篇文章里的数据一样,具体请看:js逆向:某音乐平台请求参数sign签名模拟生成。

加密后的数据会随着data字符串(json数据)的长度而变化,因此加密数据的长度是不固定的。另外,最好学习一下这几个涉及到加密的类或函数,如下:

crypto
TextEncoder
crypto.subtle.encrypt

具体可以参考官方文档,链接为:SubtleCrypto.importKey()方法的使用。另外,因为涉及到加密操作的函数或类需要异步操作,读者最好有一定的异步操作的基础。基本加密原理就是利用方法crypto.getRandomValues()生成一个长度为12的加密密钥数组arr12(说的称呼可能不怎么对吧,不过总之这里会和后续加密操作联系就行。)吧!这个arr12会和上述的data数据进行一系列操作,最终结果会得到一个数组arr2,得到arr2后会再和arr12进行拼接或组合操作吧,变为一个数组arr3,如果用Python代码描述就是arr3 = arr12.extend(arr2)。(这里使用的列表类型),最后把这个arr3根据其值进行一些操作得到一个下标index,通过这个index得到字符c(str1 = ''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'',c=str1[index]),最后拼接所有的c即可(这里涉及到arr3中3个元素得到4个字符,因为data长度不固定,因此,arr3的长度也是不固定,所以可能会存在最后依次遍历时arr3中只有1个元素或2个元素,这里需要额外讨论一下)。这里是我的一个猜测,上述代码中提到的那些函数或类我其实也并不是很了解,在上述理解中arr3 =arr12.extend(arr2)这里为什么要进行这一步呢?我想因为传到后端之后,后端进行解密操作,才能直到你具体data是什么,因为arr12初始是随机生成的,不固定的,不传到到后端,后端根本无法解密。后端解密之后然后进行sign签名参数的验证,然后辨别你的sign参数是否正确。

2. 参考代码

async function getImportKey(){const arr1 = ["raw",new Uint8Array([189, 48, 95, 16, 208, 255, 116, 182, 239, 84, 218, 184, 53, 181, 225, 207]),{name: "AES-GCM",length: 128},false,["encrypt"]]const subtle_2 = crypto.subtle;const importKey_2 = subtle_2.importKey;return await importKey_2.apply(subtle_2, arr1);
}async function getArr(str1,uint8Arr12){const cryptoKey_2 = await getImportKey();// CryptoKey 类型对象const textEncoder_2 = new TextEncoder();const encode = textEncoder_2.encode;const arr2 = encode.call(textEncoder_2,str1);// Uint8Array类型的数组const subtleCrypto_2 = crypto.subtle;const encrypt_2 = subtleCrypto_2.encrypt;const obj_2 = {'name':'AES-GCM',"iv":uint8Arr12};return await encrypt_2.call(subtleCrypto_2,obj_2,cryptoKey_2,arr2);
}async function main1(str1){const uint8Array8_2 = new Uint8Array(12); // 长度为12// const uint8Arr12 = crypto.getRandomValues(uint8Array8_2);// 每次结果都不一样的,长度为12的Uint8Array类型的数组const uint8Arr12 = new Uint8Array([211, 252, 76, 150, 99, 43, 95, 77, 49, 242, 104, 169]); // 测试使用const res = await getArr(str1,uint8Arr12);// ArrayBuffer 类型的数据const normalArr = Array.from(new Uint8Array(res));const normalArr2 = Array.from(uint8Arr12);const arr = normalArr2.concat(normalArr);let ans = '';const str2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';for(let i = 0;i < arr.length;i += 3){// 每三个元素值最后拼成4个字符let a = arr[i],b = arr[i+1],c = arr[i+2];let a1 = a << 16,b1 = b << 8,d = a1 | b1,e = d | c,f = e >> 18,g = f & 63,f1 = e >> 12,g1 = f1 & 63,f2 = e >> 6,g2 = f2 & 63,g3 = e & 63;ans += str2[g] + str2[g1];if(b === undefined){ans += "==";}else if(c === undefined){ans += str2[g2] + '=';}else{ans += str2[g2] + str2[g3];}}console.log(ans)return ans;
}const str1 = 
// console.log(main1(JSON.stringify(str1)));
console.log(main1(str1));

参考代码中str1中有一个数据涉及隐私问题,因此没有粘贴上去了,可以直接去小编这篇文章里去复制就行。js逆向:某音乐平台请求参数sign签名模拟生成。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十一届中国大学生程序设计竞赛网络预选赛(CCPC Online 2025)

Preface最近因为队友要准备预推免,很久没有一起训练过了;我个人也是把大部分精力都放在科研方面,算是挺久没写代码了 同时因为这场撞了本校预推免的原因,导致学校很多队伍被迫重组,但好在我们队没受影响堪堪凑齐了…

完整教程:数据结构 栈和队列、树

完整教程:数据结构 栈和队列、树pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

深入解析:【ubuntu】ubuntu中找不到串口设备问题排查

深入解析:【ubuntu】ubuntu中找不到串口设备问题排查pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

酵母双杂交技术:高通量筛选的突破与不可忽视的三大局限性

在后基因组时代,解析蛋白质相互作用网络已成为理解生命活动机制、挖掘疾病靶点的核心任务。酵母双杂交技术通过不断革新,已从 “一对一” 的简单互作验证,升级为 “组学水平” 的高通量筛选工具 —— 不仅能覆盖全基…

ubuntu20.04测试cuda

import torch# 1. 检查 PyTorch 版本 print("PyTorch 版本:", torch.__version__) # 应为 2.4.0# 2. 检查 CUDA 是否可用 print("CUDA 可用:", torch.cuda.is_available()) # 应为 True# 3. 检查…

Python lambda

Python lambda 漫思

Android Studio 配置国内源

腾讯:https://mirrors.cloud.tencent.com/AndroidSDK/ 阿里:https://mirrors.aliyun.com/android.googlesource.com/

PyCharm项目上传GitHub仓库(笔记) - 教程

PyCharm项目上传GitHub仓库(笔记) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

从RAG出发

从RAG出发 1. RAG的概念和背景 1.1 什么是RAG RAG(Retrieval-Augmented Generation,检索增强生成)是一种将 信息检索 与 大语言模型生成 融合的技术架构。 其核心思想是:在模型生成前,通过检索外部知识库获取相关…

软件工程第二次作业——第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience/homework/13468这个作业的目标 实…

【树状数组】codeforce 1288 E. Messenger Simulator

View Post【树状数组】codeforce 1288 E. Messenger Simulator题目 https://codeforces.com/problemset/problem/1288/E 题解 用以下测试用例进行讲解: 4 2 3 2上述测试用例的执行过程如图所示:初始状态下,第 \(i\)…

exsi 6.7 打补丁

exsi 6.7 打补丁exsi 6.7 打补丁esxi 6.7 打补丁WARNING:All commands run on the ESXi shell are logged and may be included insupport bundles. Do not provide passwords directly on the command line.Most tool…

Ubuntu 24.04 安装 DaVinci Resolve

Ubuntu 24.04 安装 DaVinci Resolve Step1: 下载并安装 chmod +x DaVinci_Resolve_Studio_19.0_Linux.run sudo ./DaVinci_Resolve_Studio_19.0_Linux.run -i可能会遇到依赖的问题, 需要先安装以下的几个库, 再以跳过检…

Promise中处理请求超时问题

1. 使用 Promise.race() 处理超时Promise<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://code.jquery.com/jquery-3.6.0.min.js">&l…

图解26:老生常谈的OSI网络模型

哈哈,之前画的不能在老的图了,重新拿出来让AI加个码看看效果,没有一点失真还不错,

【C++】指针

内存 程序中最重要的一件事,就是内存。当启动一个程序的时候,所有的代码都被载入到内存当中,内存中的所有的二进制指令都在告诉计算机你的代码需要做什么。 没有内存,计算机什么都做不了,而指针对于管理和操纵内存…

Quart

Quart📌 在软件/编程里 Quart 是一个 Python 异步 Web 框架,API 和 Flask 几乎完全兼容,但基于 asyncio,所以可以用 async/await 写异步代码。你可以把它理解为 “异步版 Flask”。典型用途:写高并发 Web 服务、…

AI驱动建筑行业数字化转型

AI驱动建筑行业数字化转型精细化管理为目标的数字化转型是建筑产业发展的必然趋势 建筑业当前面临着行业增速下降、劳动力成本上升、单个项目投标家数增加、资源环境约束加剧等挑战,且随着时代发展,建筑项目的规…

详细介绍:前端学习——CSS

详细介绍:前端学习——CSSpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

VSCode 把代码发送到激活状态下的终端

VSCode 把代码发送到激活状态下的终端 你有没有遇到过这样的情况:在VSCode里写Python代码时,经常需要打开好几个终端。但问题是,Shift+Enter快捷键只能把选中的代码发送到第一个终端。有时候,如果VSCode意外重启,…