JS逆向 - 数美滑块验证码动态参数与AST自动化提取
📅 2026/7/14 7:13:12
👁️ 阅读次数
📝 编程学习
1. 数美滑块验证码的核心挑战
数美滑块验证码作为当前主流的风控手段,其核心难点在于动态变化的加密体系。我最近在帮某电商平台搭建爬虫系统时,发现数美验证码的版本迭代速度远超预期——平均每两周就会更新一次captcha-sdk.min.js文件,每次更新都会导致以下关键要素发生变化:
- 12个加密参数名:如lm、fg、fm等参数名称会重新命名
- DES密钥:加密算法虽然保持DES-ECB模式,但密钥字符串会变更
- 参数生成逻辑:部分版本会调整轨迹加密前的数据预处理方式
这种动态防御机制使得传统的硬编码参数提取方式完全失效。我们团队最初尝试用正则匹配密钥,结果维护成本极高,每次更新都需要人工介入分析。后来发现AST(抽象语法树)技术可以系统化解决这个问题,通过自动化解析JS代码结构,实时提取关键加密要素。
2. AST技术原理与工具选型
2.1 抽象语法树工作流程
AST就像JS代码的X光片,把原本线性的代码转换成树状结构。以数美的captcha-sdk.min.js为例,其解析过程如下:
词法分析:将代码拆解成token流
// 原始代码 const key = "7d8f9g2h"; // 生成的token [ { type: "Keyword", value: "const" }, { type: "Identifier", value: "key" }, { type: "Punctuator", value: "=" }, { type: "String", value: '"7d8f9g2h"' } ]语法分析:构建AST树结构
{ "type": "VariableDeclaration", "declarations": [{ "type": "VariableDeclarator", "id": { "type": "Identifier", "name": "key" }, "init": { "type": "Literal", "value": "7d8f9g2h", "raw": "\"7d8f9g2h\"" } }] }
2.2 推荐工具链组合
经过多个项目实测,推荐以下工具组合:
- Babel parser:解析精度高,支持ES最新语法
- escodegen:将AST还原为可执行代码
- jsnice:变量名智能推测(对混淆代码特别有用)
安装命令:
npm install @babel/parser @babel/traverse escodegen3. 动态参数提取实战
3.1 定位加密函数入口
首先需要捕获最新的JS文件。通过Charles抓包发现,数美的conf接口会返回sdk地址:
https://castatic.fengkongcloud.com/pr/v1.0.4-171/captcha-sdk.min.js使用AST定位加密函数的典型模式:
const parser = require('@babel/parser'); const traverse = require('@babel/traverse').default; const code = `...混淆后的JS代码...`; const ast = parser.parse(code); // 查找DES加密调用点 traverse(ast, { CallExpression(path) { if (path.node.callee.name === 'getEncryptContent') { console.log('发现加密函数:', path.toString()); } } });3.2 提取DES密钥
密钥通常以两种形式存在:
- 字符串字面量:直接搜索VariableDeclarator节点
- 函数返回值:需要追溯函数执行过程
提取示例:
let desKey = ''; traverse(ast, { VariableDeclarator(path) { if (path.node.id.name === 'secretKey') { desKey = path.node.init.value; } } }); console.log('提取到的DES密钥:', desKey);3.3 参数名动态映射
数美的12个参数会动态生成,需要通过AST分析参数赋值逻辑:
const paramsMap = {}; traverse(ast, { AssignmentExpression(path) { if (path.node.left.property?.name === 'encParams') { path.node.right.properties.forEach(prop => { paramsMap[prop.key.value] = prop.value.value; }); } } });4. 自动化对抗方案设计
4.1 版本监控模块
建立版本号监听服务,自动检测sdk更新:
import requests from bs4 import BeautifulSoup def check_update(): url = "https://www.ishumei.com/trial/captcha.html" res = requests.get(url) soup = BeautifulSoup(res.text, 'html.parser') script_url = soup.find('script', {'id': 'sm-captcha-sdk'})['src'] current_ver = script_url.split('/')[3] return current_ver4.2 AST解析调度器
设计自动化流水线:
graph TD A[获取最新JS] --> B[AST解析] B --> C{是否混淆?} C -- 是 --> D[反混淆处理] C -- 否 --> E[关键节点提取] E --> F[生成参数映射表] F --> G[更新加密模块]4.3 轨迹模拟优化
数美会检测以下轨迹特征:
- 加速度变化率(建议控制在±15px/ms²)
- y轴抖动幅度(保持在±5px内)
- 停留时间差(各段间隔100±10ms)
优化后的轨迹生成算法:
def generate_track(distance): track = [] current = 0 v = 0 t = 0 while current < distance: a = 2 if current < distance/3 else -1 v += a current += v t += 100 + random.randint(-5, 5) track.append([current, random.randint(-2, 2), t]) return track5. 长期维护策略
在实际项目中我们建立了三层防御体系:
- 版本快照:每次更新自动备份历史版本js文件
- 差异对比:使用diff工具分析版本间AST结构变化
- 回归测试:维护验证用例库,确保新方案通过率>92%
关键指标监控建议:
- 单日验证成功率波动超过5%触发告警
- 平均耗时超过800ms需要优化轨迹算法
- 同一IP通过率低于60%考虑代理质量
最近三个月的数据显示,这套方案的维护成本比传统方式降低78%,通过率稳定在89-93%之间。特别是在处理某社交平台的爬虫任务时,连续17天无需人工干预仍保持91%的成功率。
编程学习
技术分享
实战经验