基于AI的某防水墙滑块验证码自动化全链路实现
前言
在 AI 还没有如今这么强大的时候,当我们遇到了防水墙滑块的时候,可能最常用的方案就是 Selenium 方案,甚至在早期的时候有人曾言只有 自动化 可以通过滑块验证码。
那么为什么会有这种说法呢?其实原因很简单,因为某些大厂的验证码确实很难,对于小白和经验不是很丰富的人来说,通过逆向的方式实现,这完全是一个不可能完成的挑战。
以防水墙为例来说,其中包含了 VMP、Webpack、高度代码混淆、控制流平坦化、僵尸代码 等,这些技术的处理对于一个经验丰富的人员来说也需要很长的一个周期才能解决。
现在 AI 飞速发展,对于那些经验不是很丰富的人,只要对逆向有了解,也可以在 AI 的辅助 下逆向出验证码。
一、挑战:某防水墙滑块验证码
1.1 什么是 JSVMP
JSVMP(JavaScript Virtual Machine Protection,JS 代码虚拟化保护)是 一种企业级的 JavaScript 代码高强度加密混淆技术。
它通过 将原始 JS 代码转换为一种特定的、自定义的字节码,并在浏览器或 Node.js 中运行私有的解析器,使代码反编译和逆向分析极度困难,常用于保护 Web 应用的关键算法。
某防水墙滑块验证码对 JSVMP 的应用:
__TENCENT_CHAOS_STACK:自定义的字节码解释器- 字节码以大数组形式内联(数万个数字)
- 所有的 collect 和 eks 加密逻辑都在 VM 内部执行
- 逆向难度极高,需要还原整个 VM 指令集
1.2 Webpack 打包 + 变量混淆
- Webpack 打包:模块化混淆,函数调用链难以追踪
- 变量混淆:单字母变量名(a, b, c),无语义
1.3 随机变量名
window.KcYVdONjSbHEDgmXanKNEdRPYPMTPdOh 存储 eks,每次加载变化
二、使用 AI 辅助分析
2.1 准备工作
在正式进行分析时可以让 AI 写一个 design.md、tasks.md、requirements.md 文件,这样可以使得你的项目更加的有层次感:
requirements.md:需求文档,可以根据你自己的需要来进行进一步改进design.md:设计文档,AI 根据需求设计出一个方案tasks.md:任务文档,AI 会根据设计文档列出下面它需要做的事

2.2 分析启动
1)抓包预览
通过 Chrome DevTools 抓包,核心只有 2 步:
1 | |
这里面的 Chrome DevTools 大家可能都不陌生,AI 能自己调度浏览器抓包主要是基于 Chrome DevTools MCP。
2)prehandle 请求分析
| 参数 | 说明 | 示例 |
|---|---|---|
| aid | 应用 ID | 199999861 |
| ua | Base64 编码的 User-Agent | TW96aWxsYS81LjA… |
| lang | 语言 | zh-cn |
| entry_url | 来源页面 | https://cloud.tencent.com/… |
| subsid | 子会话 ID(递增) | 1 |
| callback | JSONP 回调名 | _aq_191730 |
3)verify 请求分析
| 参数 | 说明 |
|---|---|
| collect | TDC 加密的设备指纹 + 轨迹数据 |
| tlg | collect 字符串长度 |
| eks | TDC 生成的加密密钥信息 |
| sess | 会话标识 |
| ans | 滑块答案 JSON |
| pow_answer | PoW 计算结果 |
| pow_calc_time | PoW 计算耗时(毫秒) |
2.3 跟进分析 JS 文件
1)核心 JS 文件清单
| 文件 | 大小 | 作用 | 混淆程度 |
|---|---|---|---|
| TCaptcha.js | 入口 | 加载器 | 低 |
| tcaptcha-frame.js | 207KB | 主框架逻辑 | 中(Webpack) |
| dy-ele.js | 209KB | 滑块核心逻辑 | 中(Webpack) |
| tdc.js | 78KB | 设备指纹采集 | 极高(JSVMP) |
2)混淆技术分析
dy-ele.js 混淆特征:
- Webpack 打包,模块化结构
- 变量名混淆(单字母变量)
- 部分字符串 Base64 编码
- 可通过断点调试还原
tdc.js 混淆特征(重点):
- 腾讯自研
__TENCENT_CHAOS_STACK虚拟机 - 自定义字节码解释器
- 字节码以数万个数字的大数组形式内联
- 核心加密逻辑全部在 VM 内执行
- 逆向难度:极高
1 | |
说实话,分析完都有哪些核心文件和对抗技术之后,如果是我自己手搓的话可能需要很长的一段时间才能搞定,但是有了 AI 之后,工作量就可以减轻很多了,每天花几个小时,在一两天的时间内就能搞定。
2.4 算法分析
1)PoW (Proof of Work) 算法
就是一个暴力搜索的 MD5:
1 | |
2)ft (浏览器特征指纹) 生成
在 dy-ele.js 中收集环境信息。
ft 是一个编码后的浏览器特征字符串,包含 50+ 项检测:
1 | |
3)TDC 接口
TDC (Tencent Data Collection) 是腾讯的设备指纹采集模块,暴露以下接口:
1 | |
数据流:
1 | |
- collect 和 eks 的加密算法在 JSVMP 内部
- 无法直接还原,只能通过补环境方式调用
三、补环境复现 collect 和 eks 的加密算法
3.1 先看一下都收集了哪些环境
| 技术 | 具体表现 |
|---|---|
| 浏览器指纹 | 50+ 项特征检测(ft) |
| Node.js 检测 | 检测 process、require、module 等 |
| DOM API 行为检测 | 检测 API 返回值是否符合真实浏览器 |
| performance.timing | 采集页面加载时序数据 |
| WebGL 指纹 | 显卡信息采集 |
| Canvas 指纹 | 绘图指纹采集 |
| AudioContext 指纹 | 音频指纹采集 |
3.2 AI 辅助补环境
可能大家也或多或少的通过补环境的方案解决过 JS 代码中加密算法的调用,但是这里面其实有一个小坑:在补环境的时候补少了肯定是不行的,但是补多了有时候也会导致算法调用失败。
自己手动挂代理去补环境的话,第一是费时费力;第二是补环境基本上都是凭借经验去补,但是具体都检测了哪些环境,又有哪些环境一定要补、哪些环境不用补、哪些环境补了反而会导致算法复现失败, 这些东西要确定的话最好的办法就是在 JS 源码中一点点调试,但是这样的话工作量很大不说还很浪费时间成本。
使用 AI 进行补环境的好处是什么?
- AI 可以在 Chrome 中模拟执行 JS 代码,同时收集检测的环境
- AI 在 JS 代码本地运行报错或与页面结果差异很大时,通过对比本地环境和 Chrome 环境来更新本地环境并进行测试
- AI 可以通过 Chrome 中的轨迹模拟滑块的轨迹采集样点及轨迹算法
模拟事件监听器:
1 | |
3.3 实现自动化流程
让 AI 将整个流程都写成代码,整个流程如下:
1 | |
四、总结
4.1 AI 辅助的优势
- 处理大量的环境采集工作:浏览器特征字符串,包含 50+ 项检测
- 调用链追踪:AI 可以快速定位各调用栈间的联系
- 代码还原:AI 可以根据你需要的语言自动生成代码
4.2 AI 存在的局限性
- 在模拟滑块进行滑动时,可能因为页面元素定位等限制导致无法实现模拟滑动,需要人工滑动,AI 来抓包
- AI 存在幻觉现象,同时 AI 也可能会因为复杂的逻辑分析陷入死循环,这个时候需要人工指引方向
五、展望
AI 正在飞速的发展,利用 AI 进行辅助逆向分析慢慢会变成趋势,让 AI 伴我们通行,顶峰相见!