【JS逆向百例】某点数据逆向分析,多方法详解
字数 1275 2025-08-19 12:40:45
某点数据逆向分析教学文档
前言
本文详细分析某点数据排行榜接口的逆向过程,提供3种解决方案:手动Webpack+补环境、自动扣Webpack模块和算法还原。目标接口为aHR0cHM6Ly9hcHAuZGlhbmRpYW4uY29tL3JhbmsvaW9zLw==(Base64解码后为某点数据排行榜地址)。
逆向目标
- 接口:
/pc/app/v1/rank - 关键参数:
k参数(动态生成) - 其他参数:
time、country_id等(固定或简单参数)
逆向过程
1. 抓包分析
- 打开开发者工具,访问排行榜页面
- 在Network中抓取
/pc/app/v1/rank接口 - 观察请求参数,发现
k参数每次请求都会变化
2. XHR断点分析
- 在Sources面板下XHR断点:
api.diandian.com/pc/app/v1/rank - 刷新页面,断点触发后通过调用堆栈找到
m.request - 在
m变量中查找回调方法,重点关注onRequest - 发现
k参数在t函数中生成
3. k参数生成逻辑
var r = h()(t.params, !1);
o = Object(y.a)(r, path, {
s: n.s,
k: n.k,
l: n.l,
d: n.d,
sort: n.sort,
num: n.num
}, "get");
t.params.k = o
y.a函数来自Webpack模块2294,其内部逻辑:
- 使用
Object(l.b)进行加密(AES) - 通过
t.from方法编码为Base64
解决方案
方案1:手动Webpack+补环境
步骤1:获取分发器
- 在
y=n(2294)处下断点 - 获取runtime.js(Webpack分发器)
- 将分发器导出:
window.kk=r
步骤2:查找模块
// 控制台查找模块
n.m[模块名]
// 示例调用
a = window.kk(2294)
r = { "start_time": 1717776000, "end_time": 1718345618 }
n = {
"proxy": "/app",
"target": "",
"sort": "dd",
"num": 10,
"s": "d044bec62c1c9f9eee1ebd567e501719",
"k": "93086c0e7c41cf46",
"l": "091043cf5d1393af",
"d": 0
}
path = "/v2/user/monitor/msg"
o = Object(a.a)(r, path, {
s: n.s,
k: n.k,
l: n.l,
d: n.d,
sort: n.sort,
num: n.num
}, "get");
console.log(o)
步骤3:补环境
- 根据报错信息补全缺失模块
- 补全常见环境如
document、navigator - 最终代码量约6万行
方案2:自动扣Webpack模块
步骤1:重写分发器
window.code = '';
r = function (e) {
if (r[e]) return r[e].exports;
var d = r[e] = { i: e, l: !1, exports: {} };
console.log(e)
window.code += e + ':' + o[e] + ',\r\n'
return o[e].call(d.exports, d, d.exports, r), d.l = !0, d.exports
}
步骤2:导出模块
- 刷新页面并操作排行榜
- 控制台执行
copy(window.code)导出模块 - 将导出的模块放入本地分发器
方案3:算法还原
关键函数分析
Object(l.b):AES加密t.from:UTF8编码
算法实现
// UTF8编码实现
t = []
t.from = function (hexString, encoding) {
if (encoding !== "utf8") {
throw new Error("Unsupported encoding");
}
let byteArray = new Uint8Array(hexString.split('').map(char => char.charCodeAt(0)));
return byteArray;
}
// AES加密实现(Node.js)
const crypto = require('crypto');
var c = crypto.createDecipheriv("aes-128-cbc", n, o);
return d += c.update(e, "hex", "utf8"), d += c.final("utf8");
// 辅助函数
function c(a) {
return function(t) {
return t;
};
}
var n = c()(t);
function _(n) {
return typeof n === 'object' && n !== null;
}
完整实现
约70行代码即可完成k参数生成,相比Webpack方案更简洁。
八爪鱼采集方案(无代码方案)
使用步骤
- 下载安装八爪鱼采集器
- 新建任务,输入目标网址
- 使用"自动识别"功能生成采集模板
- 调整识别结果,删除多余字段或添加需要的字段
- 设置代理(推荐快代理的私密代理或独享代理)
- 保存并开始采集
进阶功能
- 自动打码
- 点击翻页
- 定时采集
总结
| 方案 | 难度 | 代码量 | 适用场景 |
|---|---|---|---|
| 手动Webpack+补环境 | 高 | ~6万行 | 需要完整环境 |
| 自动扣Webpack模块 | 中 | ~6万行 | 多JS文件模块 |
| 算法还原 | 高 | ~70行 | 追求简洁 |
| 八爪鱼采集 | 低 | 无 | 无编程基础 |
选择方案时应根据自身技术水平和需求场景决定。对于初学者推荐从算法还原开始尝试,有经验者可选择Webpack方案获取更完整的功能。