某音乐平台歌曲信息逆向之参数寻找

如何逆向加密参数:某音乐平台歌曲信息逆向之webpack扣取-CSDN博客

参数构建

{
	"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": "vkey.GetVkeyServer",
		"method": "CgiGetVkey",
		"param": {
			"guid": "7146813132",
			"songmid": ["002dw4gv1ZmiGt"],
			"songtype": [0],
			"uin": "0",
			"loginflag": 1,
			"platform": "20"
		}
	},
	"req_2": {
		"module": "music.musicasset.SongFavRead",
		"method": "IsSongFanByMid",
		"param": {
			"v_songMid": ["002dw4gv1ZmiGt"]
		}
	},
	"req_3": {
		"module": "music.musichallSong.PlayLyricInfo",
		"method": "GetPlayLyricInfo",
		"param": {
			"songMID": "002dw4gv1ZmiGt",
			"songID": 372639235
		}
	},
	"req_4": {
		"method": "GetCommentCount",
		"module": "music.globalComment.GlobalCommentRead",
		"param": {
			"request_list": [{
				"biz_type": 1,
				"biz_id": "372639235",
				"biz_sub_type": 0
			}]
		}
	},
	"req_5": {
		"module": "music.musichallAlbum.AlbumInfoServer",
		"method": "GetAlbumDetail",
		"param": {
			"albumMid": "003QIVDT3UB8zG"
		}
	},
	"req_6": {
		"module": "vkey.GetVkeyServer",
		"method": "CgiGetVkey",
		"param": {
			"guid": "9868485411",
			"songmid": ["002dw4gv1ZmiGt"],
			"songtype": [0],
			"uin": "0",
			"loginflag": 1,
			"platform": "20"
		}
	}
}

分析参数

  • req_1 中参数  【guid】,【songmid】,
  • req_2中参数【v_songMid】,
  • req_3中参数【songMID】,【songID】
  • req_4中参数【biz_id】
  • req_5 中参数【albumMid】
  • req_6中参数【guid】,【songmid】

由请求参数中可看出:

songmid == v_songMid ==  songMID == biz_id

那么这几个可以根据歌曲详情页链接后缀得到

问题参数

guid   

songID   歌曲编号

albumMid  专辑短链

guid 参数逆向

调试跟栈可定位到giud生成位置

function getGuid() {
    a = (new Date).getUTCMilliseconds()

    return String(Math.round(2147483647 * Math.random()) * a % 1e10);
}

那么其余参数如何获取呢 ??? 带着这个问题开始寻找之路

寻找接口

来到歌曲详情页面开始各种搜索发现前文章中提到得接口被反复请求,仔细观察之下发现有需要得结果。

请求参数

{
	"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": "music.musicsearch.HotkeyService",
		"method": "GetHotkeyForQQMusicMobile",
		"param": {
			"searchid": "26594278617551874",
			"remoteplace": "txt.yqq.top",
			"from": "yqqweb"
		}
	},
	"req_2": {
		"method": "get_song_detail_yqq",
		"module": "music.pf_song_detail_svr",
		"param": {
			"song_mid": "002dw4gv1ZmiGt"
		}
	},
	"req_3": {
		"module": "music.paycenterapi.LoginStateVerificationApi",
		"method": "GetChargeAccount",
		"param": {
			"appid": "mlive"
		}
	}
}

参数刨析

  • req_1 中参数  【searchid】
  • req_2中参数【song_mid】,

由首次分析可知  song_mid  为歌曲得短链,可有歌曲详情页中链接提取到

调试取参

【searchid】26594278617551874

断点跟栈

如上方式跟栈大概到  k.request  处发现关键位置

this.request = function(t) {
    var n = t instanceof Array ? t : [t];
    e.wait || (e.wait = e.sendRequest());
    var r = {};
    return n.forEach((function(t) {
        e.index += 1,
        t.param || (t.param = {}),
            r["req_" + e.index] = t
        }
        )),
        e.reqData = Object.assign(Object.assign({}, e.reqData), r),
        e.wait.then((function(t) {
            var e = Object.keys(r);
            return 0 === e.length ? [] : e.map((function(e) {
                return t[e]
        }
        ))
    }
    ))
}

e.reqData = Object.assign(Object.assign({}, e.reqData), r),

 此处打上断点看变量 r 值结果

存在需要得变量   【searchid】

进一步跟栈可跟踪到我们需要得位置: searchid: Object(_.a)(1)

扣取代码
, function(e, t, n) {
    "use strict";
    n.d(t, "a", (function() {
        return i
    }
    ));
    var a = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = [], i = n.length, o = a.length, c = 0, s = i + o - 1; c <= s; c++)
            r[c] = 0;
        for (var l = 0; l < o; l++)
            for (var u = 0; u < i; u++)
                r[u + l] += parseInt(n[u], 10) * parseInt(a[l], 10),
                r[u + 1 + l] += Math.floor(r[u + l] / 10),
                r[u + l] = r[u + l] % 10;
        return r.reverse(),
        0 == r[0] && r.shift(),
        r.join("")
    }
      , r = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = n.length, i = a.length, o = 0, c = 0, s = 0, l = 0, u = 0, m = Math.max(r, i); u < m; u++)
            c = u < r ? parseInt(n[u], 10) : 0,
            s = u < i ? parseInt(a[u], 10) : 0,
            l = Math.round(c) + Math.round(s) + o,
            n[u] = "".concat(l % 10),
            o = l >= 10 ? 1 : 0;
        return 1 == o && n.push("1"),
        n.reverse().join("")
    }
      , i = function(e) {
        var t = a(e, "18014398509481984")
          , n = a(Math.round(Math.random() * parseInt("4194304", 10)), "4294967296")
          , i = new Date
          , o = 1e3 * (3600 * i.getHours() + 60 * i.getMinutes() + i.getSeconds()) + i.getMilliseconds();
        return r(r(t, n), o)
    }
}

通看下来 没有进行其余操作, 我们可以将该内容加入到前文webpack加载器中,也可自行更改函数,

方式二实现

function getSearchId( e ){
     var a = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = [], i = n.length, o = a.length, c = 0, s = i + o - 1; c <= s; c++)
            r[c] = 0;
        for (var l = 0; l < o; l++)
            for (var u = 0; u < i; u++)
                r[u + l] += parseInt(n[u], 10) * parseInt(a[l], 10),
                r[u + 1 + l] += Math.floor(r[u + l] / 10),
                r[u + l] = r[u + l] % 10;
        return r.reverse(),
        0 == r[0] && r.shift(),
        r.join("")
    }
      , r = function(e, t) {
        for (var n = "".concat(e).split("").reverse(), a = "".concat(t).split("").reverse(), r = n.length, i = a.length, o = 0, c = 0, s = 0, l = 0, u = 0, m = Math.max(r, i); u < m; u++)
            c = u < r ? parseInt(n[u], 10) : 0,
            s = u < i ? parseInt(a[u], 10) : 0,
            l = Math.round(c) + Math.round(s) + o,
            n[u] = "".concat(l % 10),
            o = l >= 10 ? 1 : 0;
        return 1 == o && n.push("1"),
        n.reverse().join("")
    };

    var t = a(e, "18014398509481984")
      , n = a(Math.round(Math.random() * parseInt("4194304", 10)), "4294967296")
      , i = new Date
      , o = 1e3 * (3600 * i.getHours() + 60 * i.getMinutes() + i.getSeconds()) + i.getMilliseconds();
    return r(r(t, n), o)

}
调用方式

 

整合调试

详情接口

组建参数

【searchid】,【song_mid】

发起请求
_ 为时间戳, sign 值为前文逆向出来将请求参数传递进入可得到加密后得结果
歌曲id = result['req_2'][ 'data' ][ 'track_info' ][ 'id' ]
专辑短链 = result['req_2'][ 'data' ][ 'track_info' ][ 'album' ][ 'mid' ]

播放接口

将上述拿到得信息写入对应参数位置后,则可发起请求

songID   result['req_2'][ 'data' ][ 'track_info' ][ 'id' ]

albumMid  result['req_2'][ 'data' ][ 'track_info' ][ 'album' ][ 'mid' ]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从0到1实现RPC | 04 负载均衡和静态注册中心

一、Router的定义 Router路由用于预筛选&#xff0c;Dubbo有这样的设计&#xff0c;SpringCloud没有。 二、LoadBanlancer定义 负载均衡器&#xff1a;默认取第一个 当前支持随机和轮询两种负载均衡器。 随机&#xff1a;从所有provider中随机选择一个。 轮询&#xff1a;每…

ctf奇淫巧计

%00截断&#xff1a; %00在urldecode后就是0x00&#xff0c;一些函数诸如preg_match遇到0x00会直接停止。 String tartget_url req.getParameter("url");String pri tartget_url.substring(0, tartget_url.indexOf(":"));System.out.println(pri);if (p…

使用Python转换图片中的颜色

说明&#xff1a;最近在看梵高的画册&#xff0c;我手上的这本画册&#xff08;《文森特梵高》杨建飞 主编&#xff09;书中说&#xff0c;梵高用的颜料里有不耐久的合成颜料&#xff0c;原本的紫色褪成了我们现在所看到的灰蓝色。于是我想&#xff0c;能不能用程序将画中的颜色…

备战蓝桥杯---贡献法刷题

话不多说&#xff0c;直接看题&#xff1a; 什么是贡献法&#xff1f;这是一种数学思想&#xff0c;就是看每一个元素对总和的贡献。 1. 我们可以先枚举区间再统计次数&#xff0c;但这显然TLE。我们可以发现&#xff0c;每一个孤独的区间对应一个孤独的牛&#xff0c;因此我…

计组第三版书例题

基础知识过一下 存储器与CPU的连接主要通过数据总线、地址总线和控制总线实现。CPU首先向存储器发送地址信号&#xff0c;然后发出读写控制信号&#xff0c;最后在数据总线上进行数据的读写操作 。这种连接方式确保了CPU能够正确地访问和控制存储器中的数据。 https://blog.cs…

2024免费Mac电脑用户的系统清理和优化软件CleanMyMac

作为产品营销专家&#xff0c;对于各类产品的特性与优势有着深入的了解。CleanMyMac是一款针对Mac电脑用户的系统清理和优化软件&#xff0c;旨在帮助用户轻松管理、优化和保护Mac电脑。以下是关于CleanMyMac的详细介绍&#xff1a; CleanMyMac X2024全新版下载如下: https://…

蓝桥-时间显示

目录 题目链接 代码 题目链接 1.时间显示 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std;int main() {long long x;cin>>x;int h,m,s;x x / 1000 % (3600*24); // 毫秒化秒&#xff0c;并且保留最后一天的时间h x / 3600; //求得…

使用pip install替代conda install将packet下载到anaconda虚拟环境

问题描述 使用conda install 下载 stable_baseline3出现问题 一番搜索下是Anaconda.org缺少源 解决方法 首先使用管理员权限打开 anaconda prompt 然后激活目标环境&#xff1a;conda activate env_name 接着使用&#xff1a;conda env list查看目标env的位置 如D:\anacon…

C语言进阶课程学习记录-第23课 - #error 和 #line 使用分析

C语言进阶课程学习记录-第23课 - #error 和 #line 使用分析 实验-#errer的使用演示cmd窗口实验-缺少#error实验-#line 1的使用实验-#line 1用于标记代码小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记…

MySQL介绍和安装

MySQL介绍和安装 文章目录 MySQL介绍和安装1.MySQL介绍2.MySQL安装2.1 主机初始化2.1.1 设置网卡名和ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 设置时区 2.2 包安装2.2.1 Rocky和CentOS 安装 MySQL2.2.2 Ubuntu 安装 MySQL 2.3 二进制安装安装MySQL2.3.1…

基于SpringBoot+微信小程序的防诈骗平台

一、项目背景介绍&#xff1a; 社会背景随着互联网的高速发展&#xff0c;网络和手机的普及率也大大提高&#xff0c;这也衍生出一系列问题&#xff1a;用户信息泄露、不法分子电话诈骗等…现越来越多的老年人甚至年轻人经历过电信诈骗并被骗了大量金额。该产品正是基于这样的社…

CMOS漏极开路门

线与 通常CMOS门电路都有反相器作为输出缓冲电路。在实际工程中&#xff0c;为了方便常将两个门的输入端直接并联来实现与逻辑功能&#xff08;称为线与&#xff09;。如下图所示&#xff1a; 线与的弊端&#xff1a;当与电源VDD直接相连的PMOS管导通时&#xff0c;由于MOS管导…

arm开发板移植工具mkfs.ext4

文章目录 一、前言二、手动安装e2fsprogs1、下载源码包2、解压源码3、配置4、编译5、安装 三、移植四、验证五、总结 一、前言 在buildroot菜单中&#xff0c;可以通过勾选e2fsprogs工具来安装mkfs.ext4工具&#xff1a; Target packages -> Filesystem and flash utilit…

发布自己的github项目

git下载 git关网&#xff1a;https://git-scm.com/ 下载后是exe文件 git安装 除了选安装地址&#xff0c;其他都是下一步下一步傻瓜式安装 安装好之后随便一个地方右键多了两个东西 git gui here 和git bash here git测试配置及创建github项目 右键git bash here 测试…

C语言操作SQL数据库

1.打开/创建数据库的C语言接口 int sqlite3_open(const char *filename, sqlite3 **ppDb) 该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。 int sqlite3_close(sqlite3*) 该例程关闭之前调用 sqlite3_open() 打开的数据…

java(7)之跳转语句

1、break跳转语句 说到break其实也不是跳转&#xff0c;它更像是一个终结语句&#xff0c;常用于在循环语句需要停止出现例如 while&#xff08;&#xff09;{ if&#xff08;&#xff09;{ break&#xff1b; }} 这样的形式或者 switch&#xff08;&#xff09;{ case…

水离子雾化壁炉如何实现火焰的虚实变化?

水离子雾化壁炉通过调节水雾的密度和电子控制器的设置来实现火焰的虚实变化。具体实现方法如下&#xff1a; 调节水雾密度&#xff1a; 超声波振动器可以调节水分子的雾化效果&#xff0c;从而控制水雾的密度。增加水雾的密度会使火焰看起来更实&#xff0c;而减少水雾的密度则…

Pytoch安装记录

使用pycharm 1、CUDA的安装 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 选择对应的版本 选择对应的版本进行下载&#xff1a; 有3个多G cuda的安装需要注意&#xff0c;如果没有安装vs&#xff0c;则需要选择自定义安装&#xff0c;在自定义的安装中取消 安…

HTML常用标签-最基础的标签

从本篇开始&#xff0c;我们围绕HTML原生标签开始&#xff0c;围绕整个前端三剑客进行&#xff0c;将进行一个大致的介绍和案例展示&#xff0c;没有啥技术含量&#xff0c;只是把学习前端的时候&#xff0c;案例全部展示出来&#xff0c;作为一个实时记录&#xff0c;或者说回…

《QT实用小工具·十三》FlatUI辅助类之各种炫酷的控件集合

1、概述 源码放在文章末尾 FlatUI辅助类之各种炫酷的控件集合 按钮样式设置。文本框样式设置。进度条样式。滑块条样式。单选框样式。滚动条样式。可自由设置对象的高度宽度大小等。自带默认参数值。 下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifnd…