免费咨询热线135-3532-1113
免费获取方案
首页/新闻资讯/爬虫技术/爬虫JS逆向入门:参数加密与混淆代码的分析思路和调试方法

爬虫JS逆向入门:参数加密与混淆代码的分析思路和调试方法

发布: 栏目:爬虫技术 作者:万户网络 阅读:5
讲解爬虫场景下 JS 逆向的基本思路:用浏览器开发者工具定位请求与签名参数、用断点和调用栈追踪加密逻辑、用 AST 还原混淆代码,并说明合规采集的边界。

爬虫JS逆向入门:参数加密与混淆代码的分析思路和调试方法

JS逆向在爬虫里的作用,是弄清楚网页前端如何生成请求里的签名、时间戳或加密参数,从而在合规前提下稳定地获取公开数据。 常用思路是:先用浏览器开发者工具定位目标请求,再通过断点和调用栈找到参数的生成位置,必要时用 AST(抽象语法树)工具还原被混淆的代码,然后在自己的程序里复现这套逻辑。本文只讨论采集公开数据的合规场景,并给出调试方法和少量示意代码,不针对任何具体网站。

一、先说清楚:什么时候该做JS逆向、什么时候不该做

JS逆向是个“费时间”的技术,动手前先想三件事:

  1. 有没有官方 API 或开放数据? 能用官方接口就不要逆向,稳定且合规。
  2. 数据是否公开、是否允许采集? 先看网站的 robots.txt 和服务条款,明确禁止采集的内容不要碰。
  3. 能不能用更简单的办法? 比如直接抓 HTML、使用无头浏览器渲染,成本往往比逆向低得多。

只有前两项都没问题,而简单方法又行不通时,才值得投入时间做参数分析。

二、合法边界与合规要求

这是本文的底线,请务必遵守:

  • 只采集公开可访问的数据。 需要登录、付费或授权才能看到的内容,不要通过逆向手段绕过。
  • 不采集个人隐私信息。 手机号、身份信息、聊天记录等不属于合规采集范围。
  • 不攻击验证码和风控系统。 为了绕过人机验证、规避风控而做逆向,可能违反服务条款甚至相关法律。
  • 控制访问频率,避免给对方服务器造成压力。 合理限速,必要时在低峰时段运行。
  • 遵守 robots 协议和网站条款。 具体法律责任以法律法规和合同约定为准,不确定时先咨询专业人士。

三、阶段1:定位目标请求

大多数“参数加密”问题,都可以从浏览器开发者工具开始。

  1. 打开目标页面,按 F12 进入开发者工具,切换到 Network(网络) 面板。
  2. 勾选 Preserve log,筛选 Fetch/XHR,刷新页面或触发翻页。
  3. 找到返回你需要数据的那个请求,查看 Headers(请求头)、Payload(请求参数)和 Response(响应)。
  4. 对比多次请求,看哪些参数每次都变:常见的有 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)时,可以补全必要的环境变量后直接执行。

无论哪种方式,都要加上限速、重试和失败告警,不要无节制地请求。

八、常见坑与排查

  1. 参数里带了设备或环境指纹。 复现后偶尔失败,检查是否依赖 UA、屏幕分辨率、Canvas 等信息。
  2. 脚本会定期更新。 目标网站改版或更新混淆,之前的复现逻辑会失效,需要建立监控。
  3. 反调试代码。 页面检测到开发者工具就进入死循环,可以用条件断点或在断点前禁用相关函数来排查。
  4. 时间同步问题。 时间戳和服务器时间相差太大会被拒绝,注意本机时钟。
  5. 复现结果和页面不一致。 逐步对比中间变量,从输入、拼接串到输出结果,定位是哪一步出了偏差。

九、什么时候更适合用别的方案

JS逆向成本高、维护成本也高。下面几种情况,换思路往往更划算:

  • 数据量不大、只做一次:手动导出或使用官方导出功能。
  • 页面渲染逻辑复杂:直接用无头浏览器渲染后提取,省去逆向。
  • 需要长期稳定的数据:优先和数据方沟通授权,走官方接口。

如果你的业务需要长期、稳定、合规的数据采集,可以参考我们的 爬虫开发服务,从数据来源、合规性和维护成本一起评估方案。

常见问题

JS逆向和爬虫有什么关系? 网页数据的请求参数常由前端 JS 生成,爬虫要还原这些参数才能发出有效请求,这就是爬虫JS逆向的价值。

学JS逆向需要先学什么? 需要熟悉 JavaScript、浏览器开发者工具、HTTP 协议,以及基础的加密算法常识。会一点 Node.js 和 AST 会更省力。

混淆代码一定能还原吗? 多数混淆都能通过 AST 变换大幅提升可读性,但复杂的虚拟机保护、频繁更新的混淆方案,成本会很高,不一定值得。

可以用逆向绕过验证码吗? 不建议,也不属于合规采集范围。针对验证码和风控的绕过,可能违反服务条款和相关法律。

采集到的数据能随便使用吗? 不能。要关注数据的版权、个人信息保护和网站条款,商业使用前请先确认授权。

如果你需要做合规的数据采集,或者想让技术团队评估某个采集需求是否可行,欢迎联系广州万户网络,电话 13535321113。我们会先确认数据来源与合规性,再给出爬虫开发方案,实际费用以需求评估后的报价为准。

需要网站建设、软件开发或爬虫定制?

模板建站1280元起,价格公开不加价。电话/微信 13535321113

免费获取方案
电话
免费咨询热线13535321113
微信
微信二维码
微信号:13535321113
点击复制
拨打电话 加微信