【js逆向学习】酷我音乐排行榜 python+nodejs(webpack)

逆向目标

  • 目标网址: https://www.kuwo.cn/rankList
  • 目标接口: https://www.kuwo.cn/api/www/bang/bang/musicList
    • 加密参数:
      • 参数一:secret
      • 参数二:reqId

逆向过程

老规矩先分析网络请求,我们可以分析到网络请求是通过ajax进行的,并且主要涉及两个加密参数,即secret和reqId。根据分析网络请求的结果,我们可以初步得出结论:这两个加密参数secret和reqId分别用于请求的加密和请求的唯一标识。

逆向分析

我们先来分析 Secret,直接搜索这个字符串

如上图只有一个搜索结果,我们跟进去分析一下代码,打个断点然后刷新网页,发现断住了

关键代码如下

javascript 复制代码
	"/api/www" === t.url.substring(0, 8) || "/api/v1" === t.url.substring(0, 7)) {
	    var e = Object(d.c)(m);
	    r.a.defaults.headers[v] = f(e, m)
	}

其中 m 是个固定值 m = "Hm_Iuvt_cdb524f42f23cer9b268564v7y735ewrq2324",我们看下参数 eObject(d.c)(m) 得来的,我们跟进去

javascript 复制代码
f = function(t) {
        var e = document.cookie
          , n = e.indexOf(t + "=");
        if (-1 != n) {
            n = n + t.length + 1;
            var o = e.indexOf(";", n);
            return -1 == o && (o = e.length),
            unescape(e.substring(n, o))
        }
        return null
    }

代码逻辑很简单, e 是取的包含所传字符串的 cookie

至此两个用于加密的参数我们都拿到了,再看下加密的方法

javascript 复制代码
    function f(t, e) {
        if (null == e || e.length <= 0)
            return null;
        for (var n = "", i = 0; i < e.length; i++)
            n += e.charCodeAt(i).toString();
        var o = Math.floor(n.length / 5)
          , r = parseInt(n.charAt(o) + n.charAt(2 * o) + n.charAt(3 * o) + n.charAt(4 * o) + n.charAt(5 * o))
          , c = Math.ceil(e.length / 2)
          , l = Math.pow(2, 31) - 1;
        if (r < 2)
            return 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 = (r * n + c) % l;
        var f = ""
          , h = "";
        for (i = 0; i < t.length; i++)
            h += (f = parseInt(t.charCodeAt(i) ^ Math.floor(n / l * 255))) < 16 ? "0" + f.toString(16) : f.toString(16),
            n = (r * n + c) % l;
        for (d = d.toString(16); d.length < 8; )
            d = "0" + d;
        return h += d
    }

f 方法看下来可以直接拿出来用,到这里 Secret 参数我们已经拿到了,接下来我们来分析 reqId,关键词搜索,然后在搜索结果处都打上断点,刷新下网页,发现断住了

直接跟进去单步调试

返回了一个函数,跟进去这个函数可以发现是个 webpack 文件

跟进 l() 源码,熟悉 webpack 的兄弟们应该很清楚

我们直接跟 n 进去,就是加载函数了,如果点不进去说明失效了,直接刷新一下网页再进就行了

接下来要做的就简单了,我们先把加载的代码扣下来,把加载函数导出一下,导出可以用 exports 也可以用 window ,这几个看个人习惯,接下来就要扣具体的执行逻辑了

可以看到 112模块 内部又调用了键值为 147、148 对应的函数,直接把这几个函数扣出来,放到加载器里,扣完之后本地执行一下

把环境简单补一下再执行

可以看到有结果了

至此两个加密参数我们都分析结束了

逆向总结

整个分析走下来,发现稍微有点难度的就是 webpack,当然也可以硬扣,大家感兴趣的可以尝试一下,需要源码的后台私信我

原创声明:未经许可,不得转载。
如有侵权,请联系作者删除删除

相关推荐
剑亦未配妥1 小时前
移动端触摸事件与鼠标事件的触发机制详解
前端·javascript
Hello_Embed7 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中7 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h8 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡9 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
前端君9 小时前
实现最大异步并发执行队列
javascript
limengshi13839210 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手10 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
蚂蚁RichLab前端团队11 小时前
🚀🚀🚀 RichLab - 花呗前端团队招贤纳士 - 【转岗/内推/社招】
前端·javascript·人工智能
周周记笔记11 小时前
学习笔记:第一个Python程序
笔记·学习