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

news/2024/10/11 16:03:58/

如何逆向加密参数:某音乐平台歌曲信息逆向之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' ]


http://www.ppmy.cn/news/1404981.html

相关文章

续-开发组件更新-提效工具分享

前言 小一个月没更新了&#xff0c;有各种各样的事啦&#xff0c;这一篇有点水吧。围绕两方面&#xff0c;开发组件更新以及IDEA插件的分享&#xff0c;题目和我一样水&#xff0c;有点像是日本轻小说取名了&#xff0c;整这么长。本篇的触动来源于&#xff0c;我今天偶然发现…

#设计模式#3.1用做松鼠桂鱼来理解抽象工厂(对象创建型模式)

概念&#xff1a;xx工厂&#xff0c;xx产品 区分 工厂是动作&#xff0c;产品是结果&#xff08;菜品&#xff09; 概念&#xff1a;抽象xx&#xff0c;具体xx 区分 抽象产品&#xff1a;“中式菜品” 具体产品&#xff1a;“麻婆豆腐”、“宫保鸡丁” 抽象工厂&#xff1a;“…

AWS相关服务说明

互联网网关 官网 # 官网 https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/VPC_Internet_Gateway.htmlInternet 网关是一种横向扩展、冗余且高度可用的 VPC 组件&#xff0c;支持在 VPC 和 Internet 之间进行通信。它支持 IPv4 和 IPv6 流量。它不会对您的网络流量造…

[Linux]基础IO(中)---理解重定向与系统调用dup2的使用、缓冲区的意义

重定向理解 在Linux下&#xff0c;当打开一个文件时&#xff0c;进程会遍历文件描述符表&#xff0c;找到当前没有被使用的 最小的一个下标&#xff0c;作为新的文件描述符。 代码验证&#xff1a; ①&#xff1a;先关闭下标为0的文件&#xff0c;在打开一个文件&#xff0c;…

合并两个单链表

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 但行前路&#xff0c;不负韶华&#…

探析Drools规则引擎的工作机制

目录 一、工作原理 二、工作流程 2.1 初始化环境 2.2 添加规则文件 2.3 编译规则文件 2.4 插入到工作内存 2.5 规则匹配与激活 2.6 规则执行 三、Drools 其他特性 3.1 符合事实 3.2 决策表 3.3 规则生命周期管理 3.4 规则流 四、Rete 算法 一、工作原理 Drools 规则引擎的工…

谷歌(Google)技术面试——在线评估问题(一)

谷歌&#xff08;Google&#xff09;面试过程的第一步&#xff0c;你可能会收到一个在线评估链接。 评估有效期为 7 天&#xff0c;包含两个编码问题&#xff0c;需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处&#xff0c;还提供了有关 Google 面试不…

最新AI工具系统ChatGPT网站运营源码SparkAi系统V6.0版本,GPTs应用、AI绘画、AI换脸、垫图混图、Suno-v3-AI音乐生成大模型全支持

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…