webpack实战:最新QQ音乐sign参数加密分析

文章目录

  • 1. 写在前面
  • 2. 接口抓包分析
  • 3. 扣webpack代码
  • 4. 补浏览器环境
  • 5. 验证加密结果

1. 写在前面

  现在!很多的网站使用Webpack加载和处理JS文件。所以对于使用了Webpack加载的JS代码,一旦它们被打包并在浏览器中执行,通常是难以直接阅读和理解的,因为Webpack会将其压缩、混淆和优化

本文将分享最新的QQ音乐sign参数加密分析。QQ音乐的sign加密目前主要是由webpack生成并通过加载器导出!感兴趣的也可以看看我之前发布的一些关于webpack分析文章


分析目标

aHR0cHM6Ly95LnFxLmNvbS9uL3J5cXEvc2VhcmNoP3c9JUU3JTlDJTlGJUU3JTlBJTg0JUU3JTg4JUIxJUU0JUJEJUEw


在这里插入图片描述

2. 接口抓包分析

  可以看到如下请求提交了两个参数,一个时间戳一个就是加密的sign。先全局搜索一下sign,如下出现两个结果:

在这里插入图片描述
在这里插入图片描述

3. 扣webpack代码

  点击JS文件进去,找到sign的位置(可以继续在JS内搜索分析)打上断点。断点之后我们重新提交搜索请求,根据断点调试来到下图,可以看到i出来后就是sign。它是经过o函数就变为了加密内容。o()就是加密方法。而这里o又等于n(350).default

在这里插入图片描述

o = n(350).default是webpack的调用形式,n是加载器,鼠标移到n点击跳转将webpack的代码先整个扣下来:

在这里插入图片描述

上面我们找到了加载器的webpack代码,还有一个就是加载器的具体方法。这个我们也需要扣出来放到加载器中导入:

在这里插入图片描述

加载器的webpack代码一共是300多行,而需要加载的具体方法vendor.chunk的文件代码很庞大!至于有多大家可以看下图(2W+行代码),这里我把它扣下来存为qq.js,等待后续加载器的导入使用:

在这里插入图片描述

4. 补浏览器环境

  加载器跟加载方法的所有JS代码我们拿到本地编辑器。可以看到这个JS代码直接扣下来是不能用起来的,分析代码可以看到(window、location、navigator)这些都是缺失的!测试的时候自己发现缺什么就补~

在这里插入图片描述
在这里插入图片描述

上图按照浏览器的环境把location、navigator补上,另外一定自己要看代码分析,f它是加载器,这里也是用全局变量接收的,最终加载器扣下来完善后的最终代码如下所示(require(‘./qq’)这一行代码就是加载方法的所有代码):

// 补环境
window = global;
location = { "ancestorOrigins": {}, "href": "https://y.qq.com/n/ryqq/search?w=%E7%9C%9F%E7%9A%84%E7%88%B1%E4%BD%A0&t=song&remoteplace=txt.yqq.top","origin": "https://y.qq.com","protocol": "https:","host": "y.qq.com","hostname": "y.qq.com","port": "", "pathname": "/n/ryqq/search","search": "?w=%E7%9C%9F%E7%9A%84%E7%88%B1%E4%BD%A0&t=song&remoteplace=txt.yqq.top","hash": ""
}
navigator = { appCodeName: "Mozilla",appName: "Netscape",appVersion: "5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",}
var loader;
require('./qq') // 加载方法代码,需要扣出来
!function(e) {function t(t) {for (var a, n, f = t[0], d = t[1], i = t[2], l = 0, u = []; l < f.length; l++)n = f[l],Object.prototype.hasOwnProperty.call(o, n) && o[n] && u.push(o[n][0]),o[n] = 0;for (a in d)Object.prototype.hasOwnProperty.call(d, a) && (e[a] = d[a]);for (b && b(t); u.length; )u.shift()();return c.push.apply(c, i || []),r()}function r() {for (var e, t = 0; t < c.length; t++) {for (var r = c[t], a = !0, n = 1; n < r.length; n++) {var d = r[n];0 !== o[d] && (a = !1)}a && (c.splice(t--, 1),e = f(f.s = r[0]))}return e}var a = {}, n = {20: 0}, o = {20: 0}, c = [];function f(t) {if (a[t])return a[t].exports;var r = a[t] = {i: t,l: !1,exports: {}};return e[t].call(r.exports, r, r.exports, f),r.l = !0,r.exports}f.e = function(e) {var t = [];n[e] ? t.push(n[e]) : 0 !== n[e] && {1: 1,3: 1,4: 1,5: 1,6: 1,7: 1,8: 1,9: 1,10: 1,11: 1,12: 1,13: 1,14: 1,15: 1,16: 1,17: 1,18: 1,19: 1,21: 1,22: 1,23: 1,24: 1,25: 1}[e] && t.push(n[e] = new Promise((function(t, r) {for (var a = "css/" + ({1: "common",3: "album",4: "albumDetail",5: "album_mall",6: "category",7: "cmtpage",8: "index",9: "msg_center",10: "mv",11: "mvList",12: "mv_toplist",13: "notfound",14: "player",15: "player_radio",16: "playlist",17: "playlist_edit",18: "profile",19: "radio",21: "search",22: "singer",23: "singer_list",24: "songDetail",25: "toplist"}[e] || e) + "." + {1: "2e3d715e72682303d35b",3: "5cf0d69eaf29bcab23d2",4: "798353db5b0eb05d5358",5: "df4c243f917604263e58",6: "20d532d798099a44bc88",7: "e3bedf2b5810f8db0684",8: "ea0adb959fef9011fc25",9: "020422608fe8bfb1719a",10: "8bdb1df6c5436b790baa",11: "47ce9300786df1b70584",12: "4aee33230ba2d6b81dce",13: "e6f63b0cf57dd029fbd6",14: "1d2dbefbea113438324a",15: "d893492de07ce97d8048",16: "9484fde660fe93d9f9f0",17: "67fb85e7f96455763c83",18: "5e8c651e74b13244f7cf",19: "3befd83c10b19893ec66",21: "b2d11f89ea6a512a2302",22: "c7a38353c5f4ebb47491",23: "df0961952a2d3f022894",24: "4c080567e394fd45608b",25: "8edb142553f97482e00f"}[e] + ".chunk.css?max_age=2592000", o = f.p + a, c = document.getElementsByTagName("link"), d = 0; d < c.length; d++) {var i = (b = c[d]).getAttribute("data-href") || b.getAttribute("href");if ("stylesheet" === b.rel && (i === a || i === o))return t()}var l = document.getElementsByTagName("style");for (d = 0; d < l.length; d++) {var b;if ((i = (b = l[d]).getAttribute("data-href")) === a || i === o)return t()}var u = document.createElement("link");u.rel = "stylesheet",u.type = "text/css",u.onload = t,u.onerror = function(t) {var a = t && t.target && t.target.src || o, c = new Error("Loading CSS chunk " + e + " failed.\n(" + a + ")");c.code = "CSS_CHUNK_LOAD_FAILED",c.request = a,delete n[e],u.parentNode.removeChild(u),r(c)},u.href = o,0 !== u.href.indexOf(window.location.origin + "/") && (u.crossOrigin = "anonymous"),document.getElementsByTagName("head")[0].appendChild(u)})).then((function() {n[e] = 0})));var r = o[e];if (0 !== r)if (r)t.push(r[2]);else {var a = new Promise((function(t, a) {r = o[e] = [t, a]}));t.push(r[2] = a);var c, d = document.createElement("script");d.charset = "utf-8",d.timeout = 120,f.nc && d.setAttribute("nonce", f.nc),d.src = function(e) {return f.p + "js/" + ({1: "common",3: "album",4: "albumDetail",5: "album_mall",6: "category",7: "cmtpage",8: "index",9: "msg_center",10: "mv",11: "mvList",12: "mv_toplist",13: "notfound",14: "player",15: "player_radio",16: "playlist",17: "playlist_edit",18: "profile",19: "radio",21: "search",22: "singer",23: "singer_list",24: "songDetail",25: "toplist"}[e] || e) + ".chunk." + {1: "aabe67026a2f3f407781",3: "57adeab72a3ec5a6940c",4: "fb9a0df49aac1081fd8b",5: "ce88bd122dac655490ca",6: "3c9e9ce78ed1a42f485f",7: "ca787dcf6db83f6a4d11",8: "306c7ad24389b8338e1f",9: "b5cd5a77da26782764c2",10: "b9b35726ef5f56f87151",11: "c925c75c1a05b9bd0958",12: "b2bfa82b42b9bec98cca",13: "e8b9a6dad95b623cab82",14: "16f4f61d208558a7c17c",15: "7264ef7ff4b6052f4c01",16: "039db3b85d472916677b",17: "72dfb28846b85bcce963",18: "7f8ac1ee0d0077c0d960",19: "89e9600c87d40494d2a0",21: "157aa8a8c67606f0d243",22: "07c7b21c4be040114330",23: "d0f42e091f31e2cd3a85",24: "4e38573b87120e0a3b0a",25: "08f75a75f2455ab4c49f"}[e] + ".js?max_age=2592000"}(e),0 !== d.src.indexOf(window.location.origin + "/") && (d.crossOrigin = "anonymous");var i = new Error;c = function(t) {d.onerror = d.onload = null,clearTimeout(l);var r = o[e];if (0 !== r) {if (r) {var a = t && ("load" === t.type ? "missing" : t.type), n = t && t.target && t.target.src;i.message = "Loading chunk " + e + " failed.\n(" + a + ": " + n + ")",i.name = "ChunkLoadError",i.type = a,i.request = n,r[1](i)}o[e] = void 0}};var l = setTimeout((function() {c({type: "timeout",target: d})}), 12e4);d.onerror = d.onload = c,document.head.appendChild(d)}return Promise.all(t)},f.m = e,f.c = a,f.d = function(e, t, r) {f.o(e, t) || Object.defineProperty(e, t, {enumerable: !0,get: r})},f.r = function(e) {"undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {value: "Module"}),Object.defineProperty(e, "__esModule", {value: !0})},f.t = function(e, t) {if (1 & t && (e = f(e)),8 & t)return e;if (4 & t && "object" === typeof e && e && e.__esModule)return e;var r = Object.create(null);if (f.r(r),Object.defineProperty(r, "default", {enumerable: !0,value: e}),2 & t && "string" != typeof e)for (var a in e)f.d(r, a, function(t) {return e[t]}.bind(null, a));return r},f.n = function(e) {var t = e && e.__esModule ? function() {return e.default}: function() {return e};return f.d(t, "a", t),t},f.o = function(e, t) {return Object.prototype.hasOwnProperty.call(e, t)},f.p = "/ryqq/",f.oe = function(e) {throw e};var d = window.webpackJsonp = window.webpackJsonp || [], i = d.push.bind(d);d.push = t,d = d.slice();for (var l = 0; l < d.length; l++)t(d[l]);var b = i;r()loader = f;
}([]);// 加密调用函数
function get_sign(data) {let o = loader(350).default;return o(data)

5. 验证加密结果

  将webpack的加载器JS代码跟加载方法JS代码全部扣下来后,基本上整个加密的流程就出来了,现在我们编写一下脚本来验证一下效果,脚本内容如下:

# -*- coding: utf-8 -*-# 测试请换自己的cookie
cookies = {'sd_userid': '2391663752714217','pgv_pvid': '5766421817','pac_uid': '0_9a2e8dd1c0852','RK': 'jiHhTPl9aT','ptcz': '1e1eb706edac3e0c76ab95a69f550b99fcdec80366b7f8c358d56f0fc0979946','fqm_pvqid': '40c52bcd-87c7-4c72-a26c-27e8707c872c','fqm_sessionid': '8dd996ec-c839-42c8-9ca3-d6851c420d58','pgv_info': 'ssid=s1216838840','ts_uid': '1699674176','qm_keyst': 'W_X_5NTcvfg7hswI_XeeT1UL6iqZLxWEjnqblAPOLhMHc19EhzmgRaHfQcyATA3BOkNjn7mBtZxDrgTg','wxuin': '1152921504767067454','psrf_qqunionid': '','psrf_qqrefresh_token': '','wxunionid': 'oqFLxsgm67UNDPWQJrsB5zAagvAs','psrf_qqopenid': '','qqmusic_key': 'W_X_5NTcvfg7hswI_XeeT1UL6iqZLxWEjnqblAPOLhMHc19EhzmgRaHfQcyATA3BOkNjn7mBtZxDrgTg','wxopenid': 'opCFJwysEgSAIr0m0m1bcSARkUAg','tmeLoginType': '1','psrf_qqaccess_token': '','wxrefresh_token': '72_LC_VaHu3AQw7rraX_0r5Kw16fCtvHWtO5Qpli1bdCJBtkNnDeAoX6fDYGBDEpalnPYAAs8U9HTsfrleIMkK3ES25lJ1KNYhYIsRpSMK_Fj8','euin': 'oK6kowEAoK4z7eSs7ins7ivk7n**','login_type': '2','ts_last': 'y.qq.com/n/ryqq/search'
}headers = {'authority': 'u.y.qq.com','accept': 'application/json','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache','content-type': 'application/x-www-form-urlencoded','origin': 'https://y.qq.com','pragma': 'no-cache','referer': 'https://y.qq.com/','sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-site','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}# 直接浏览器拷出来
data = '{"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":"1152921504767067454","g_tk_new_20200303":451075320,"g_tk":451075320},"req_1":{"method":"DoSearchForQQMusicDesktop","module":"music.search.SearchCgiService","param":{"remoteplace":"txt.yqq.top","searchid":"65805105264064724","search_type":0,"query":"海阔天空","page_num":1,"num_per_page":10}}}'# 获取sign加密参数
with open("./加载器.js") as f: # 上面加载器的JS文件js_code = f.read()time_str = round(time.time() * 1000)
sign = execjs.compile(js_code).call("get_sign", data)
print(YELLOW % 'sign: {}'.format(sign))
params = {'_': time_str,'sign': sign,
}response = requests.post('https://u.y.qq.com/cgi-bin/musics.fcg', params=params, cookies=cookies, headers=headers,data=data.encode()).json()
print(response)

验证效果如下所示:

在这里插入图片描述

最后说一句,GPT出来后确实为我们开发者省去了很多曾经繁琐的工作,像上面的Python验证脚本就是让GPT帮我写的,真好~

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

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

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

相关文章

PMP考试注意事项有哪些?

1. PMI明确规定&#xff1a;不允许考生使用自带文具&#xff0c;包括自带的笔、削笔刀、橡皮、笔袋、计算器和草稿纸等。 2. 本次考试考场内为每位考生配备2B铅笔、橡皮、计算器(若有需要)和草稿纸。如文具有缺损或考试过程中如需更换铅芯等&#xff0c;请向监考老师举手示意。…

redis 高可用

Redis 高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…

【python零基础入门学习】python基础篇(基础结束篇)之数据结构类型-列表,元组,字典,集合(五)

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

竞赛选题 基于机器视觉的行人口罩佩戴检测

简介 2020新冠爆发以来&#xff0c;疫情牵动着全国人民的心&#xff0c;一线医护工作者在最前线抗击疫情的同时&#xff0c;我们也可以看到很多科技行业和人工智能领域的从业者&#xff0c;也在贡献着他们的力量。近些天来&#xff0c;旷视、商汤、海康、百度都多家科技公司研…

内网穿透的应用-如何搭建WordPress博客网站,并且发布至公网上?

文章目录 如何搭建WordPress博客网站&#xff0c;并且发布至公网上&#xff1f;概述前置准备1 安装数据库管理工具1.1 安装图形图数据库管理工具&#xff0c;SQL_Front 2 创建一个新数据库2.1 创建数据库2.2 为数据库创建一个用户 3 安装PHP7.44. 创建一个新站点4.1 创建站点根…

Vue面试题以及解答(持续扩展中.....)

##Vue面试题## 1.组件中通讯方式有哪些 组件中通讯有$emit&#xff0c;props&#xff0c;vuex&#xff0c;provid和inject&#xff0c;$parent/$children&#xff0c;$refs&#xff0c;全局总线时间EvenBus&#xff0c;订阅与发布模式的subscrip/publish 2.Vue2和Vue3的区别…

Talk | ICCV‘23北京通用人工智能研究院黄江勇:ARNOLD-三维场景中基于语言的机器人任务学习

本期为TechBeat人工智能社区第531期线上Talk&#xff01; 北京时间9月14日(周四)20:00&#xff0c; 北京通用人工智能研究院实习研究员—黄江勇的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “ARNOLD-三维场景中基于语言的机器人任务学习”&…

ArcGIS Pro将SHP文件转CAD并保留图层名称

相信大家应该都使用过ArcGIS将SHP文件转CAD格式&#xff0c;转换过后所有的要素都在一个图层内&#xff0c;那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢&#xff0c;答案是肯定的&#xff0c;这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…

[UE]常见数学和插值

UE常见数学和插值 参考unreal中的Transform基础FMatrix、FMatrix44f、FMatrix44dFTranslationMatrixFRotationMatrixTRotator<T>FQuatFScaleMatrixFTransform 关于旋转的几个常见示例1. 将不限范围的角度转换到[0, 360)2.A位置的actor看向B位置3.RotateVector和UnrotateV…

特斯拉的困境:增长与竞争

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; 虽然特斯拉(TSLA)股票仍有很大的上涨潜力;但从全球电动汽车市场的最新发展来看&#xff0c;特斯拉在“电动汽车统治”的道路上仍然面临着很多挑战。 在本文中&#xff0c;猛兽财经将分析我们对特斯拉&…

C语言——字符函数和字符串函数_学习笔记

本文目录 一、字符函数1.1 字符分类函数常见的字符分类函数介绍应用举例 1.2 字符转换函数函数介绍toupper 函数举例 二、字符串函数2.1 常用的字符串函数介绍2.2 应用举例① strlen② strcpy③ strcat④ strcmp⑤ strncpy⑥ strncat⑦ strncmp⑧ strstr⑨ strtok 关于一些字符…

2023Web前端面试题及答案(一)

答案仅供参考&#xff0c;每人的理解不一样。 文章目录 1、简单说一说事件流原理 事件流: &#xff08;1&#xff09;事件流是指页面 接收事件的顺序; &#xff08;2&#xff09;假设页面中的元素都具备相同的事件,并且这些个元素之间是相互嵌套的 关系. &#xff08;3&#xf…

Postman使用_接口导入导出

文章目录 Postman导入数据Collections导出数据Environments导出数据Postman导出所有数据 Postman导入数据 可以导入collections&#xff08;接口集&#xff09;、Environments&#xff08;环境配置&#xff09;通过分享的链接或导出的JSON文件导入数据&#xff08;还可以从第三…

视频监控/安防监控/AI视频分析/边缘计算/TSINGSEE青犀AI算法智慧仓储解决方案

随着全球经济与科学技术的双重推动&#xff0c;我国的仓储管理已经进入了高速发展时期&#xff0c;物流仓储也由简单的储藏仓库向智能化仓储转变。TSINGSEE青犀AI智慧仓储解决方案是利用先进的信息技术和物联网技术来提高仓储管理效率、降低成本的一种仓储管理模式。 方案功能 …

家政服务预约小程序,推拿spa上门预约系统

家政服务预约小程序&#xff0c;用户直接发布需求下单&#xff0c;师傅入驻抢单派单&#xff0c;多商家入驻&#xff0c;上门预约服务流程清晰&#xff0c;适合家政公司或需要预约场景的团队公司使用&#xff0c;支持多种行业上门预约服务场景&#xff1a;家政保洁维修上门服务…

代码随想录--链表-反转链表

题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双指针 public class Main {public static class ListNode {int val;ListNode next;ListNode(int x) {val x;}}public ListNode reverseList(L…

Docker从认识到实践再到底层原理(五)|Docker镜像

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

VisualStudio Code 支持C++11插件配置

问题 Visual Studio Code中的插件: Code Runner 支持运行C、C、Java、JS、PHP、Python等多种语言。 但是它不支持C11特性的一些使用&#xff0c;比如类似错误&#xff1a; binarySearch.cpp:26:17: error: non-aggregate type ‘vector’ cannot be initialized with an ini…

Qt For OpenHarmony

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第29期 | Qt For OpenHarmony 》 演讲嘉宾 | 蔡万苍 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 蔡万苍&#xff0c;13 年 C/Qt 开发相关工作经验&#xff0c;曾任职 Qt 公司&#xff0c;担任技术支持、Qt 咨询师…

windows系统docker中将vue项目网站部署在nginx上

一、首先在windows系统上下载并安装docker&#xff0c;要下载windows版本 https://www.docker.com/products/docker-desktop/ PS&#xff1a;安装过程中需要WSL&#xff0c;我的是win11系统&#xff0c;直接提示了我安装就可以下一步了。其他windows系统版本我不知道是否需要单…