爬虫JS逆向入门:参数加密与混淆代码的分析思路和调试方法
爬虫JS逆向入门:参数加密与混淆代码的分析思路和调试方法
JS逆向在爬虫里的作用,是弄清楚网页前端如何生成请求里的签名、时间戳或加密参数,从而在合规前提下稳定地获取公开数据。 常用思路是:先用浏览器开发者工具定位目标请求,再通过断点和调用栈找到参数的生成位置,必要时用 AST(抽象语法树)工具还原被混淆的代码,然后在自己的程序里复现这套逻辑。本文只讨论采集公开数据的合规场景,并给出调试方法和少量示意代码,不针对任何具体网站。
一、先说清楚:什么时候该做JS逆向、什么时候不该做
JS逆向是个“费时间”的技术,动手前先想三件事:
- 有没有官方 API 或开放数据? 能用官方接口就不要逆向,稳定且合规。
- 数据是否公开、是否允许采集? 先看网站的 robots.txt 和服务条款,明确禁止采集的内容不要碰。
- 能不能用更简单的办法? 比如直接抓 HTML、使用无头浏览器渲染,成本往往比逆向低得多。
只有前两项都没问题,而简单方法又行不通时,才值得投入时间做参数分析。
二、合法边界与合规要求
这是本文的底线,请务必遵守:
- 只采集公开可访问的数据。 需要登录、付费或授权才能看到的内容,不要通过逆向手段绕过。
- 不采集个人隐私信息。 手机号、身份信息、聊天记录等不属于合规采集范围。
- 不攻击验证码和风控系统。 为了绕过人机验证、规避风控而做逆向,可能违反服务条款甚至相关法律。
- 控制访问频率,避免给对方服务器造成压力。 合理限速,必要时在低峰时段运行。
- 遵守 robots 协议和网站条款。 具体法律责任以法律法规和合同约定为准,不确定时先咨询专业人士。
三、阶段1:定位目标请求
大多数“参数加密”问题,都可以从浏览器开发者工具开始。
- 打开目标页面,按 F12 进入开发者工具,切换到 Network(网络) 面板。
- 勾选 Preserve log,筛选 Fetch/XHR,刷新页面或触发翻页。
- 找到返回你需要数据的那个请求,查看 Headers(请求头)、Payload(请求参数)和 Response(响应)。
- 对比多次请求,看哪些参数每次都变:常见的有
timestamp、nonce、sign、token等。
如果同样的请求用 curl 或 Python 重放后返回异常,通常说明请求里缺少了由前端脚本生成的参数。
四、阶段2:找到参数的生成位置
方法 1:全局搜索参数名
在 Sources 面板按 Ctrl+Shift+F 全局搜索参数名,比如 sign。命中的代码里,往往能看到 sign = xxx(...) 这样的赋值。
注意:压缩后的代码里参数名可能被拆成字符串拼接,搜不到时可以换成请求路径的片段搜索。
方法 2:XHR 断点
在 Sources 面板右侧展开 XHR/fetch Breakpoints,添加包含目标接口路径的断点。请求发出前页面会暂停,这时看 Call Stack(调用栈),沿着栈向上翻,就能找到是哪个函数组装了请求参数。
方法 3:看 Initiator 列
Network 面板的 Initiator 列会显示该请求由哪段脚本发起,点击可直接跳转到调用位置,再向上追溯。
美化与调试技巧
- 压缩过的代码点击左下角的
{}(Pretty print)格式化后再阅读。 - 在可疑函数处打断点,用 Scope 面板观察局部变量的值,比单看代码直观得多。
- 用 Console 直接调用页面里的函数,验证你对参数含义的猜测。
五、常见的参数加密形态
识别出算法类型,复现就容易很多:
| 形态 | 特征 | 复现思路 |
|---|---|---|
| 摘要算法 | 输出固定长度的十六进制串,如 MD5、SHA 系列 | 找出参与计算的字段与拼接顺序 |
| HMAC | 摘要加密钥,常有 key 或 secret |
找到密钥来源(常量、接口下发或页面变量) |
| 对称加密 | 如 AES,涉及密钥、偏移量和模式 | 确认密钥、IV、填充和输出编码 |
| 非对称加密 | 如 RSA,常见公钥写在前端 | 复用公钥加密,不涉及私钥 |
| 时间戳加随机数 | 用于防重放 | 按同样格式生成 |
| 自定义算法 | 位运算、查表、字符串变换 | 逐行读代码,用另一种语言重写 |
复现完成后,要用同一组输入对比页面和自己程序的输出,确保结果一致。
六、阶段3:处理混淆代码(JS混淆还原)
很多网站会对前端脚本做混淆,增加阅读难度。常见手法有:
- 字符串数组加解码函数: 代码里到处是形如
_0x1a2b('0x3f')的调用,实际字符串存放在一个大数组里。 - 控制流平坦化: 用
switch加循环打乱执行顺序,看不出原来的if/else结构。 - 死代码注入: 插入大量永远不会执行的分支。
- eval 与 Function 构造: 把真实代码作为字符串,运行时才还原。
用 AST 还原的思路
处理这类混淆,手动改既慢又容易出错,更好的做法是把代码解析成 AST,写脚本批量变换。Node.js 环境下常用 Babel 的解析、遍历和生成模块。下面是一个示意:把“对字符串解码函数的调用”替换成真实字符串。
const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const generate = require('@babel/generator').default;
const t = require('@babel/types');
const fs = require('fs');
const code = fs.readFileSync('input.js', 'utf-8');
const ast = parser.parse(code);
// decode 是你从原脚本里提取出来的字符串解码函数
const decode = require('./decoder.js');
traverse(ast, {
CallExpression(path) {
const { callee, arguments: args } = path.node;
if (t.isIdentifier(callee, { name: '_0x1a2b' }) && args.length === 1 && t.isStringLiteral(args[0])) {
const value = decode(args[0].value);
path.replaceWith(t.stringLiteral(value));
}
}
});
fs.writeFileSync('output.js', generate(ast).code);
说明:_0x1a2b 和 decoder.js 都是示意名称,实际要根据目标脚本来确定。通常还要配合常量折叠、移除死代码等步骤,才能得到可读的结果。
控制流和 eval 的处理思路
- 控制流平坦化:先找出分发器变量,再按执行顺序重排基本块,用脚本批量还原。
- eval 打包:把
eval换成console.log输出,就能看到被还原后的代码。
七、阶段4:在自己的程序里复现
定位并读懂逻辑后,常见的落地方式有两种:
方式一:用另一种语言重写。 逻辑简单时,用 Python 实现一遍,运行快、依赖少。
import hashlib, time
def make_sign(params: dict, secret: str):
ts = str(int(time.time() * 1000))
items = sorted(params.items())
raw = "&".join(f"{k}={v}" for k, v in items) + f"&ts={ts}&key={secret}"
return hashlib.md5(raw.encode()).hexdigest(), ts
这只是示意,具体字段和拼接规则必须来自你对目标脚本的分析。
方式二:在 Node.js 里直接运行提取出来的脚本。 逻辑复杂、依赖浏览器环境对象(如 window、navigator)时,可以补全必要的环境变量后直接执行。
无论哪种方式,都要加上限速、重试和失败告警,不要无节制地请求。
八、常见坑与排查
- 参数里带了设备或环境指纹。 复现后偶尔失败,检查是否依赖 UA、屏幕分辨率、Canvas 等信息。
- 脚本会定期更新。 目标网站改版或更新混淆,之前的复现逻辑会失效,需要建立监控。
- 反调试代码。 页面检测到开发者工具就进入死循环,可以用条件断点或在断点前禁用相关函数来排查。
- 时间同步问题。 时间戳和服务器时间相差太大会被拒绝,注意本机时钟。
- 复现结果和页面不一致。 逐步对比中间变量,从输入、拼接串到输出结果,定位是哪一步出了偏差。
九、什么时候更适合用别的方案
JS逆向成本高、维护成本也高。下面几种情况,换思路往往更划算:
- 数据量不大、只做一次:手动导出或使用官方导出功能。
- 页面渲染逻辑复杂:直接用无头浏览器渲染后提取,省去逆向。
- 需要长期稳定的数据:优先和数据方沟通授权,走官方接口。
如果你的业务需要长期、稳定、合规的数据采集,可以参考我们的 爬虫开发服务,从数据来源、合规性和维护成本一起评估方案。
常见问题
JS逆向和爬虫有什么关系? 网页数据的请求参数常由前端 JS 生成,爬虫要还原这些参数才能发出有效请求,这就是爬虫JS逆向的价值。
学JS逆向需要先学什么? 需要熟悉 JavaScript、浏览器开发者工具、HTTP 协议,以及基础的加密算法常识。会一点 Node.js 和 AST 会更省力。
混淆代码一定能还原吗? 多数混淆都能通过 AST 变换大幅提升可读性,但复杂的虚拟机保护、频繁更新的混淆方案,成本会很高,不一定值得。
可以用逆向绕过验证码吗? 不建议,也不属于合规采集范围。针对验证码和风控的绕过,可能违反服务条款和相关法律。
采集到的数据能随便使用吗? 不能。要关注数据的版权、个人信息保护和网站条款,商业使用前请先确认授权。
如果你需要做合规的数据采集,或者想让技术团队评估某个采集需求是否可行,欢迎联系广州万户网络,电话 13535321113。我们会先确认数据来源与合规性,再给出爬虫开发方案,实际费用以需求评估后的报价为准。
需要网站建设、软件开发或爬虫定制?
模板建站1280元起,价格公开不加价。电话/微信 13535321113
