KW音乐搜索参数

声明:
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

逆向目标:

主页:aHR0cDovL3d3dy5rdXdvLmNuLw==

接口:aHR0cDovL3d3dy5rdXdvLmNuL2FwaS93d3cvc2VhcmNoL3NlYXJjaE11c2ljQnlrZXlXb3Jk

逆向参数:Query String Parameters:

reqId:b403c080-e7ac-11ee-8dd0-01e74a911a00

本次的逆向目标是搜索接口的一个参数 reqId,注意这个参数并不是必须的,本文的主要目的是介绍分离式 webpack,即模块加载器与各个模块不在同一个 JS 文件里时,该如何改写 webpack

逆向过程:

抓包分析:来到搜索页面,随便搜索一搜歌曲,抓包到接口类为 aHR0cDovL3d3dy5rdXdvLmNuL2FwaS93d3cvc2VhcmNoL3NlYXJjaE11c2ljQnlrZXlXb3Jk,GET 请求,Query String Parameters 里有个 reqId 加密参数,如下图所示:

参数逆向:

直接全局搜索 reqId,仅在 app.7726bf6.js 文件里面有 4 个结果,如下图所示:

很明显 t.data.reqId = r 和 t.data.reqId = n 是比较可疑的,尝试在这两个地方埋下断点,会发现刷新网页或者重新搜索无法断下,我们观察一下这两个地方,r 和 n 的定义语句 var r = c()();var n = c()(); 都是 由 c()() 得到的,我们尝试在这两个位置埋下断点,重新搜索,可以发现成功断下,而 c()() 的值正是 reqId 的值,如下图所示:

继续往上找,看看 c 是怎么来的,可以看到一下逻辑:

l = n(110), 
c = n.n(l), 
var n = c()();

埋下断点进行调试,可以看到 n 其实是 runtime.971d560.js 里面的一个方法,如下图所示:

观察这个 function c(n){}return 语句用到了 .call 语法,里面还有 exports 关键字,很容易知道这是一个 webpack 的模块加载器,那么 e 就包含了所有模块,如下图所示:

我们再观察一下 n(110),点击进入这个函数,可以发现和前后函数用逗号分隔,划到这个文件的结尾,可以看到有 ] 符号,这说明 webpack 的所有模块都封装在一个数组里面,那么这个 110就代表这个函数是第 110个函数,如下图所示:

再看看 c = n.n(l) 语句,选中 n.n 点击会发现同样来到模块加载器这里,那么到时候扣代码的时候把 c.n 也扣下来即可。

那么总结一下逻辑,语句 l = n(110),利用模块加载器,加载了第 110个函数,返回值赋值给 l,然后 c = n.n(l) 调用模块加载器的 n 方法,返回值赋值给 c,然后执行 c()() 就得到 reqId 的值了。

webpack 改写

通过前面的分析,我们知道模块加载器里用到了 c.n,实际调试还用到了 c.d 和 c.o,所以都要一起扣下来。

模块部分,我们已经知道调用了 110这个模块,而观察 110的代码, 发现还调用了 145 和 146 模块,所以需要将这三个模块都 copy 下来,copy 的时候,我们首先断点运行到模块加载器,由于 e 储存了所有模块,所以我们可以直接在 Console 里调用 e[110]e[145 ]e[146 ] 输出一下,然后点击就可以跳到原函数的位置,然后再 copy 下来即可,如下图所示:IIFE 传数组

根据IIFE 的改写方法,同样的,我们首先定义一个全局变量,比如 var jzq;,然后导出模块加载器 jzq= c,然后将 110、145、146 这三个模块组成的数组传入 IIFE,那么这里不再是第 110、145、146个模块,而是第 0、1、2 个模块,所以在调用模块的时候也要将对应的 110、145、146改为 0、1、2,完整代码如下所示:

var jzq;
!function(e) {var t = {};function c(n) {if (t[n])return t[n].exports;var r = t[n] = {i: n,l: !1,exports: {}};return e[n].call(r.exports, r, r.exports, c),r.l = !0,r.exports}c.n = function(e) {var n = e && e.__esModule ? function() {return e.default}: function() {return e};return c.d(n, "a", n),n}c.d = function(e, n, r) {c.o(e, n) || Object.defineProperty(e, n, {enumerable: !0,get: r})}c.o = function(object, e) {return Object.prototype.hasOwnProperty.call(object, e)}jzq=c
}([function(t, e, n) {var r, o, l = n(1), c = n(2), d = 0, h = 0;t.exports = function(t, e, n) {var i = e && n || 0, b = e || [], f = (t = t || {}).node || r, v = void 0 !== t.clockseq ? t.clockseq : o;if (null == f || null == v) {var m = l();null == f && (f = r = [1 | m[0], m[1], m[2], m[3], m[4], m[5]]),null == v && (v = o = 16383 & (m[6] << 8 | m[7]))}var y = void 0 !== t.msecs ? t.msecs : (new Date).getTime(), w = void 0 !== t.nsecs ? t.nsecs : h + 1, dt = y - d + (w - h) / 1e4;if (dt < 0 && void 0 === t.clockseq && (v = v + 1 & 16383),(dt < 0 || y > d) && void 0 === t.nsecs && (w = 0),w >= 1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");d = y,h = w,o = v;var x = (1e4 * (268435455 & (y += 122192928e5)) + w) % 4294967296;b[i++] = x >>> 24 & 255,b[i++] = x >>> 16 & 255,b[i++] = x >>> 8 & 255,b[i++] = 255 & x;var A = y / 4294967296 * 1e4 & 268435455;b[i++] = A >>> 8 & 255,b[i++] = 255 & A,b[i++] = A >>> 24 & 15 | 16,b[i++] = A >>> 16 & 255,b[i++] = v >>> 8 | 128,b[i++] = 255 & v;for (var _ = 0; _ < 6; ++_)b[i + _] = f[_];return e || c(b)}
},function(t, e) {var n = "undefined" != typeof crypto && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || "undefined" != typeof msCrypto && "function" == typeof window.msCrypto.getRandomValues && msCrypto.getRandomValues.bind(msCrypto);if (n) {var r = new Uint8Array(16);t.exports = function() {return n(r),r}} else {var o = new Array(16);t.exports = function() {for (var t, i = 0; i < 16; i++)0 == (3 & i) && (t = 4294967296 * Math.random()),o[i] = t >>> ((3 & i) << 3) & 255;return o}}
}, function(t, e) {for (var n = [], i = 0; i < 256; ++i)n[i] = (i + 256).toString(16).substr(1);t.exports = function(t, e) {var i = e || 0, r = n;return [r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], "-", r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]], r[t[i++]]].join("")}
}]
)function getReqId() {var l = jzq(0),c = jzq.n(l),r = c()()return r
}
console.log(getReqId())

参考文章:https://blog.csdn.net/kdl_csdn/article/details/121135203

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

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

相关文章

Pytorch之Dataset和DataLoader的注意事项

1、数据集的保存形式&#xff1a;一行一行的。 比如说预测两个值的加法&#xff1a;abc&#xff0c;那么传进Dataset的形式应该是 a1,b1,c1 a2,b2,c2 ... an,bn,cn 2、代码 import numpy as np import pandas as pd import torch from torch.utils.data import DataLoader, D…

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…

【leetcode热题】轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

Linux配置bond(网卡绑定)

Linux配置bond&#xff08;网卡绑定&#xff09; 最近需要搭建测试环境&#xff0c;为了保证带宽不成为瓶颈&#xff0c;就需要使用bond来提升网络带宽 1 概念、原理、工作模式 1.1 概念&#xff1a;网卡捆绑 网卡绑定,也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一…

Leetcode 200. 岛屿数量

心路历程&#xff1a; 在没有看图论这一章之前看这道题没什么直接的思路&#xff0c;在看完图论之后&#xff0c;学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅&#xff0c;但是需要处理的细节第一次没怎么处理好&#xff0c;花了很多…

[C语言]手动实现strcat strcmp strcpy strstr strtok(静态全局指针初始化方式)代码

strcat strcmp strcpy strstr strtok这些代码均存储在c语言的头文件<string.h>中&#xff0c;如果要使用的话直接调用即可&#xff0c;但是为了增加我们对代码的理解&#xff0c;我们看一下如何手动实现这些代码吧&#xff01; strcat strcat是在字符串后面增加上自己想…

Postgresql数据库入门简介

Postgresql入门 1.Postgresql数据库简介 PostgresQL是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进&#xff0c;PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSql可以运行在所有主流操作系统上&#xff0c;包括Linux…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展&#xff0c;地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素&#xff0c;并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要&#xff0c;但不能很直观的…

分布式锁简单实现

分布式锁 Redis分布式锁最简单的实现 想要实现分布式锁&#xff0c;必须要求 Redis 有「互斥」的能力&#xff0c;我们可以使用 SETNX 命令&#xff0c;这个命令表示SET if Not Exists&#xff0c;即如果 key 不存在&#xff0c;才会设置它的值&#xff0c;否则什么也不做。 …

mpyboard开发板使用REPL

文章目录 WindowsMacOS XLinux使用REPL提示符重启开发板 REPL是指交互式解释器&#xff08;Read Evaluate Print Loop&#xff09;&#xff0c;就是一种命令输入交互模式&#xff0c;可以使用命令行的方式与pyboard进行交互。REPL是测试代码和运行命令最简单的方式之一&#xf…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

【爬虫】Selenium打开新tab页截图并关闭

如果说 你曾苦过我的甜 我愿活成你的愿 愿不枉啊 愿勇往啊 这盛世每一天 山河无恙 烟火寻常 可是你如愿的眺望 孩子们啊 安睡梦乡 像你深爱的那样 &#x1f3b5; 王菲《如愿》 在自动化测试和网页抓取中&#xff0c;Selenium WebDriver 是一个强大的工具&…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

【RH134问答题】第十三章 运行容器(下)

系列文章 第一章 提高命令行生产效率 第二章 计划将来的任务 第三章 调优系统性能 第四章 使用ACL控制对文件的访问 第五章 管理SELinux安全性 第六章 管理基本存储 第七章 管理逻辑卷 第八章 实施高级存储功能 第九章 访问网络附加存储 第十章 控制启动过程 第十一章 管理网络…

每天学习一个Linux命令之passwd

每天学习一个Linux命令之passwd 简介 passwd是Linux下用于修改用户密码的命令。它允许系统管理员或用户修改自己的密码&#xff0c;提供了很多选项以满足不同的需求。 命令选项 passwd命令有以下可用选项&#xff1a; -a&#xff1a;显示密码的更改时间和上一次更改密码的…

画图软件diawio

Draw.io | 一款强大且支持在线编辑和导出的流程图绘制神器-CSDN博客 draw.io 免费 好用的流程图绘制软件 - 知乎 (zhihu.com) draw.io (drawio.com)

复试专业前沿问题问答合集7-2——神经网络与强化学习

复试专业前沿问题问答合集7-2——神经网络与强化学习 神经网络与强化学习相关的基础知识问答 Q1: 什么是人工神经网络(Artificial Neural Networks, ANN)? A1: 人工神经网络是一种模仿生物神经网络行为的计算模型,由大量相互连接的人工神经元组成。每个神经元接收输入,…

26. 删除有序数组中的重复项 (Swift版本)

题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你删除重复出现的元素&#xff0c;使每个元素只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0…

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-B…

ENISA 2023年威胁态势报告:主要发现和建议

欧盟网络安全局(ENISA)最近发布了其年度2023年威胁态势报告。该报告确定了预计在未来几年塑造网络安全格局的主要威胁、主要趋势、威胁参与者和攻击技术。在本文中&#xff0c;我们将总结报告的主要发现&#xff0c;并提供可操作的建议来缓解这些威胁。 介绍 ENISA 威胁态势报告…