酷我音乐逆向 请求头 参数解密(js逆向)

news2025/1/13 0:18:55

免责声明:
    本篇博文的初衷是分享自己学习逆向分析时的个人感悟,所涉及的内容仅供学习、交流,请勿将其用于非法用途!!!任何由此引发的法律纠纷均与作者本人无关,请自行负责!!!

分析

直接抓包进行分析,我们可以直接找到这个歌曲对应的url所在的包中的内容

记录下来参数,刷新几次页面,观察参数的变化,发现只有reqld是发生变化的

观察请求头变化,存在一个加密的参数变化,这个参数的变化是连续的。

所以先进行Secret加密的获取,再进行请求参数中的reqid的获取

Secret加密参数的获取

获取这个加密参数我们可以通过搜索关键字,XHR断点根栈分析,hook查找等方法,这边我们直接搜索这个内容

找到位置直接进行打断点调试

发现参数需要e,我们直接拷贝下来

var e = Object(d.c)(f);
o.a.defaults.headers.Secret = h(e, f)

搜索e的加密

替换f的数值。

我们注意到这里面有一个document,cookie所以我们直接输出观察改变值

刷新网页记录cookie

可以发现只有最后面的使得一个Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324这个是改变的。所以把前面的都给拷贝下来替换document.cookie

继续开始查找h,搜索,复制。

运行出来结果但是并不符合,注意我们有一个数值没有填写 res

我们填写一个正确的数值,看一下这个结果

完美获取,而这个数值,是通过请求之后服务器返回的一个cookie,那么这个加密参数Secret已经查找结束,我们补全这个函数

function getSecret(coo){
    function h(t, e) {
        if (null == e || e.length <= 0)
            return console.log("Please enter a password with which to encrypt the message."),
            null;
        for (var n = "", i = 0; i < e.length; i++)
            n += e.charCodeAt(i).toString();
        var r = Math.floor(n.length / 5)
          , o = parseInt(n.charAt(r) + n.charAt(2 * r) + n.charAt(3 * r) + n.charAt(4 * r) + n.charAt(5 * r))
          , l = Math.ceil(e.length / 2)
          , c = Math.pow(2, 31) - 1;
        if (o < 2)
            return console.log("Algorithm cannot find a suitable hash. Please choose a different password. \nPossible considerations are to choose a more complex or longer password."),
            null;
        var d = Math.round(1e9 * Math.random()) % 1e8;
        for (n += d; n.length > 10; )
            n = (parseInt(n.substring(0, 10)) + parseInt(n.substring(10, n.length))).toString();
        n = (o * n + l) % c;
        var h = ""
          , f = "";
        for (i = 0; i < t.length; i++)
            f += (h = parseInt(t.charCodeAt(i) ^ Math.floor(n / c * 255))) < 16 ? "0" + h.toString(16) : h.toString(16),
            n = (o * n + l) % c;
        for (d = d.toString(16); d.length < 8; )
            d = "0" + d;
        return f += d
    }
    v = function(t) {
        res = "FTDFBA8TkwNG4eQpzAPM7QxN5thPsDrD"
        var e = `_ga=GA1.2.1617862873.1703732461; _gid=GA1.2.1291582354.1703732461; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1703725476; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1703734897; _ga_ETPBRPM9ML=GS1.2.1703732461.1.1.1703734896.33.0.0; Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324=${res}`
          , n = e.indexOf(t + "=");
        if (-1 != n) {
            n = n + t.length + 1;
            var r = e.indexOf(";", n);
            return -1 == r && (r = e.length),
            unescape(e.substring(n, r))
        }
        return null
    }
    
    var e = v("Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324");
    Secret = h(e, "Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324")
    return Secret
}

reqId加密参数的查询

直接搜索

观察结果直接获取这个n的值即可。

我们搜索c是一个什么,发现他是一个函数

替换下来,直接复制粘贴

修改一下

找不到r,开始检索

找不到o

调试到这个位置,直接悬浮之后进行定位

把这段内容也拷贝下来

查找n(204)  n(205)我们直接控制台输出

这个内容必须要先定位到这个位置,然后进行控制台输出

直接复制下来这个内容

避免出现环境问题,我们直接获取n的值,多试几次看看是不是定值,我们发现n是一个加密函数,这个加密再js中是有对应的加密库,所以直接替换即可

var CryptoJS = require("crypto-js");

// 使用 CryptoJS 生成随机数
function getRandomValuesCryptoJS(array) {
    for (var i = 0; i < array.length; i++) {
        array[i] = Math.floor(Math.random() * 256); // 在 0 到 255 之间生成随机数填充数组
    }
}
var getRandomValues = "undefined" != typeof crypto && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || "undefined" != typeof msCrypto && "function" == typeof window.msCrypto.getRandomValues && msCrypto.getRandomValues.bind(msCrypto);
if (!getRandomValues) {
    getRandomValues = getRandomValuesCryptoJS; // 如果原始代码中的 getRandomValues 不存在,就使用 CryptoJS 代替
}
var r = new Uint8Array(16);
ArrayS = function () {
    return getRandomValues(r), r;
};

同理找到n(205)直接替换中间的值t,找到内容刷新几次观察是否存在变化

直接复制进去然后整合代码

var CryptoJS = require("crypto-js");

// 使用 CryptoJS 生成随机数
function getRandomValuesCryptoJS(array) {
    for (var i = 0; i < array.length; i++) {
        array[i] = Math.floor(Math.random() * 256); // 在 0 到 255 之间生成随机数填充数组
    }
}
var getRandomValues = "undefined" != typeof crypto && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || "undefined" != typeof msCrypto && "function" == typeof window.msCrypto.getRandomValues && msCrypto.getRandomValues.bind(msCrypto);
if (!getRandomValues) {
    getRandomValues = getRandomValuesCryptoJS; // 如果原始代码中的 getRandomValues 不存在,就使用 CryptoJS 代替
}
var r = new Uint8Array(16);
ArrayS = function () {
    return getRandomValues(r), r;
};


for (var n = [], i = 0; i < 256; ++i)
    n[i] = (i + 256).toString(16).substr(1);
DDD = function () {

    var t = [
        45,
        118,
        133,
        112,
        165,
        33,
        17,
        238,
        140,
        170,
        189,
        11,
        98,
        119,
        132,
        45
    ]
    var i = 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("")
}

var r, o, l = ArrayS, c = DDD, d = 0, h = 0;
function A(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 _ = y / 4294967296 * 1e4 & 268435455;
    b[i++] = _ >>> 8 & 255,
        b[i++] = 255 & _,
        b[i++] = _ >>> 24 & 15 | 16,
        b[i++] = _ >>> 16 & 255,
        b[i++] = v >>> 8 | 128,
        b[i++] = 255 & v;
    for (var A = 0; A < 6; ++A)
        b[i + A] = f[A];
    return e || c(b)
}
function main(){
    m = A();
    return m;
}




function getSecret(coo){
    function h(t, e) {
        if (null == e || e.length <= 0)
            return console.log("Please enter a password with which to encrypt the message."),
            null;
        for (var n = "", i = 0; i < e.length; i++)
            n += e.charCodeAt(i).toString();
        var r = Math.floor(n.length / 5)
          , o = parseInt(n.charAt(r) + n.charAt(2 * r) + n.charAt(3 * r) + n.charAt(4 * r) + n.charAt(5 * r))
          , l = Math.ceil(e.length / 2)
          , c = Math.pow(2, 31) - 1;
        if (o < 2)
            return console.log("Algorithm cannot find a suitable hash. Please choose a different password. \nPossible considerations are to choose a more complex or longer password."),
            null;
        var d = Math.round(1e9 * Math.random()) % 1e8;
        for (n += d; n.length > 10; )
            n = (parseInt(n.substring(0, 10)) + parseInt(n.substring(10, n.length))).toString();
        n = (o * n + l) % c;
        var h = ""
          , f = "";
        for (i = 0; i < t.length; i++)
            f += (h = parseInt(t.charCodeAt(i) ^ Math.floor(n / c * 255))) < 16 ? "0" + h.toString(16) : h.toString(16),
            n = (o * n + l) % c;
        for (d = d.toString(16); d.length < 8; )
            d = "0" + d;
        return f += d
    }
    function AD(t) {
        let currentTime = Date.now();
        // let replacedString = `_ga=GA1.2.26371751.${currentTime}; _gid=GA1.2.747646009.${currentTime}; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=${currentTime}; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=${currentTime+1000}; _ga_ETPBRPM9ML=GS1.2.${currentTime+1}.1.1.${currentTime+1000}.42.0.0; Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324=tFnXWXriYFBkmeMjRHep7mzaxHz8pwbT`;

        // var e = "_ga=GA1.2.26371751.1703725476; _gid=GA1.2.747646009.1703725476; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1703725476; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1703728234; _ga_ETPBRPM9ML=GS1.2.1703725477.1.1.1703728234.42.0.0; Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324=tFnXWXriYFBkmeMjRHep7mzaxHz8pwbT"
        // var e = replacedString  
        var result = coo
        var e = `_ga=GA1.2.26371751.1703725476; _gid=GA1.2.747646009.1703725476; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1703725476; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1703729334; _ga_ETPBRPM9ML=GS1.2.1703725477.1.1.1703729335.60.0.0; Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324=${result}`
        , n = e.indexOf(t + "=");
        console.log(e)
        if (-1 != n) {
            n = n + t.length + 1;
            var r = e.indexOf(";", n);
            return -1 == r && (r = e.length),
            unescape(e.substring(n, r))
        }
        return null
    }
    var e = AD("Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324");
    console.log(e)
    return h(e,"Hm_Iuvt_cdb524f42f0cer9b268e4v7y735ewrq2324")
}
console.log(getSecret())

即可获取到需要的内容

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

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

相关文章

使用Rust发送邮件

SMTP协议与MIME协议 SMTP&#xff08;简单邮件传输协议,Simple Mail Transfer Protocol&#xff09;是一种用于发送和接收电子邮件的互联网标准通信协议。它定义了电子邮件服务器如何相互发送、接收和中继邮件。SMTP 通常用于发送邮件&#xff0c;而邮件的接收通常由 POP&#…

通过C++程序实现光驱的自动化刻录和读取

文章目录 ISO文件格式光盘的基本概念光盘种类特点DVDR光盘使用windows调用Linux调用Linux平台下用到的C库:读取设备驱动列表向光驱中写文件 数字存储媒体快速发展的今天&#xff0c;光驱的使用已经不像以前那样普及了。但是在数据备份、安装软件和操作系统、旧设备兼容等领域还…

redis的搭建及应用(三)-Redis主从配置

Redis主从配置 为提升Redis的高可用性&#xff0c;需要搭建多个Redis集群以保证高可用性。常见搭建方式有&#xff1a;主从&#xff0c;哨兵集群等&#xff0c;本节我们搭建一主二从的多Redis架构。 redis主从安装1主2从的方式配置&#xff0c;以端口号为redis的主从文件夹。 主…

Elasticsearch8.x结合OpenAI CLIP模型实现图搜图及文搜图功能

前言 在当今大数据时代&#xff0c;搜索引擎已经是许多应用的核心组件之一&#xff0c;近年随着大模型以及AI技术&#xff08;如&#xff1a;自然语言处理NLP&#xff09;的流行&#xff0c;这些技术的结合将会创造出更多的应用场景&#xff0c;比如&#xff1a;电商商品搜索、…

实习知识整理12:点击购物车渲染出购物车中的商品并实现在购物车界面对商品价格和数量的相关操作

1. 点击购物车渲染出购物车商品界面 通过userId从购物车表中查找商品的相关信息 前端&#xff1a;需要向后端传递userId 后端&#xff1a; CartMapper.java CartMapper.xml CartService.java 接口 CartServiceImpl.java 实现类 CartController.java cartIndex.html页面 …

第二十一章Java网络通信

网络通信这一章 基本分为三个部分 网络基础概念和TCP,UDP这三个部分主要如下&#xff1a; 计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#x…

【Unity动画系统】Unity动画系统Animation详解,参数细节你是否弄清?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

电子学会C/C++编程等级考试2023年03月(七级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:走出迷宫 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。 时间限制:1000 内存限制…

docker学习笔记03-持久化存储

1.docker架构 2.docker持续化存储-数据卷 //以后台方式运行容器 (推荐) docker run -d -v 宿主机目录/文件的绝对路径:容器内目录/文件的绝对路径[:rw/ro] -p 主机端口:容器端口 --name容器名称 镜像ID/镜像名称[:版本号]执行下面命令 docker run -p 1122:3306 --name mysql99…

脆皮大学生“拯救”方案——智慧高校智能视频监控系统的建设

随着“脆皮大学生”的网络热梗爆火&#xff0c;大学生日常监管问题也浮出水面。虽然高校大学生作为成年人&#xff0c;可以对自己的日常行为进行自我约束&#xff0c;但由于大学生涉世未深&#xff0c;缺乏独立生活经验&#xff0c;社会关系简单&#xff0c;在校期间&#xff0…

嵌入式Linux:提升VMware虚拟机运行速度的方法

使用虚拟机运行Linux操作系统通常会比在物理机上直接安装系统的运行效率更低&#xff0c;本篇博文将介绍如何优化虚拟机的设置&#xff0c;进而提升虚拟机性能体验。 第1步&#xff1a;选择VMware菜单&#xff1a;编辑–>首选项–>更新&#xff0c;将”启动时检查产品更新…

为什么IDEA建议去掉StringBuilder,而要使用“+”拼接字符串

在字符串拼接时应该都见过下面这种提示&#xff1a; 大家普遍认知中&#xff0c;字符串拼接要用StringBuilder&#xff0c;那为什么idea会建议你是用呢&#xff0c;那到底StringBuilder和有什么具体区别呢&#xff0c;我们一起来探究一下。 普通拼接 普通的几个字符串拼接成一…

积极拥抱信创,思迈特软件与麒麟软件NeoCertify完成认证

近日&#xff0c;思迈特软件与麒麟软件有限公司进行了联合测试&#xff0c;并顺利完成产品兼容性测试。经评测&#xff0c;思迈特软件一站式大数据分析平台&#xff08;Smartbi Insight V11&#xff09;与银河麒麟高级服务器操作系统&#xff08;飞腾版&#xff09;V10、&#…

代码随想录算法训练营第三十天|332.重新安排行程、51. N皇后 、37. 解数独

332.重新安排行程 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文档讲解&#xff1a;代码随想录 C代码&#xff1a; class Solution { public: unordered_map<string, map<string, int>> targets;bool backtrack…

【Seata源码学习 】篇四 TM事务管理器是如何开启全局事务

TM发送 单个或批量 消息 以发送GlobalBeginRequest消息为例 TM在执行拦截器链路前将向TC发送GlobalBeginRequest 消息 io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String) Overridepublic String begin(String applicationId, String transactionServi…

一款降压型开关模式转换器解决方案

一、基本概述 TX4145 是一款降压型开关模式转换器。TX4145 在 6-60V 宽输入电源范围内实现不同峰值输出电流&#xff0c;并且具有出色的线电压和负载调整率。 TX4145 采用 PWM 电流模工作模式&#xff0c;环路易于稳定并提供快速的瞬态响应。 TX4145 外部提供 FS 脚&#xf…

[每周一更]-(第44期):GIT版本控制之忽略文件

基础概念 在 Git 中&#xff0c;可以通过 .gitignore 文件来指定不需要纳入版本控制的文件或文件夹&#xff0c;这些被忽略的文件或文件夹不会被提交到仓库中。 在项目根目录下创建一个名为 .gitignore 的文件&#xff0c;并在其中列出需要忽略的文件或文件夹。一些常见的示例…

java设计模式学习之【中介者模式】

文章目录 引言中介者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用聊天室示例代码地址 引言 想象一下一座忙碌的机场&#xff0c;各种飞机需要起飞、降落&#xff0c;而不同的飞行活动之间必须互不干扰。如果没有一个统一的控制系统&#xff0c;这将是一…

Vue ThreeJs实现银河系行星运动

预览 可通过右上角调整参数&#xff0c;进行光影练习 代码 <template><div id"body"></div> </template> <script>import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import …

FontsTest.java

package fonts;import java.awt.Font; import java.awt.GraphicsEnvironment;/*** Font测试* * 不同字体在不同操作系统是不一样的&#xff0c;更新* * linux&#xff1a; https://blog.csdn.net/spencer_tseng/article/details/135232675windows&#xff1a; https://blog.cs…