【验证码逆向专栏】某验三代、四代一键通过模式逆向分析
字数 1582 2025-08-11 08:36:22
某验三代、四代一键通过模式逆向分析教学文档
一、目标与声明
逆向目标
- 某验三代无感验证主页:
aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9mdWxscGFnZS5odG1s - 某验四代无感验证主页:
aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
免责声明
- 所有内容仅供学习交流
- 抓包内容、敏感网址、数据接口已做脱敏处理
- 严禁用于商业用途和非法用途
- 未经许可禁止转载和二次传播
二、三代无感验证逆向分析
通讯流程与关键接口
-
register-fullpage:
- 返回
challenge和gt值,后续会使用
- 返回
-
get.php:
- 返回
c和s值 - 必须包含
w值,否则验证会失败 - 不带
w请求可能返回假的s值
- 返回
-
ajax.php:
- 验证是否成功,需要
w值 - 成功返回
validate
- 验证是否成功,需要
第一个w值逆向分析
-
定位方法:
- 搜索
"\u0077"(即"w") - w值为
i + r
- 搜索
-
关键代码:
var r = t[$_CFAGw(1326)]() var o = $_BFx()[$_CFAGw(1367)](pe[$_CFAFP(416)](t[$_CFAGw(353)]), t[$_CFAGw(1393)]()) var i = O[$_CFAGw(1375)](o) -
r值分析:
- 是RSA加密结果
- 可直接扣代码或使用加密库
-
o值分析:
- AES加密
t[$_CFAGw(1393)]()是随机字符串(整个验证过程中不变)
-
i值分析:
- 将o值转换为大字符串
- 可以写死或置空
第二个w值逆向分析
-
定位方法:
- 查找
var n = {}; t[$_CGABi(1436)]就是w值
- 查找
-
关键代码:
t[$_CGAAX(1462)]() // 生成w值的关键调用 -
环境值计算:
- 涉及浏览器环境值和鼠标移动数据
- 实际测试中e、t、n、r四个值可置空
-
数据结构:
{ "gt": "...", "challenge": "...", "ep": { "ven": "显卡信息", "ren": "显卡信息", "fp": "鼠标位置", "lp": "鼠标位置", "tm": "window.performance.timing数据" }, "captcha_token": "..." } -
最终加密:
- 使用随机字符串作为key
- 对上述数据结构进行AES加密得到w值
三、四代无感验证逆向分析
通讯流程与关键接口
-
load接口:
- 返回:
captcha_type: "ai"(无感验证)gct_path: gct4文件路径lot_number: 生成pow_msg、w的关键参数payload: verify请求参数datetime: ISO 8601格式日期process_token: verify请求参数
- 返回:
-
verify接口:
- 返回:
captcha_idcaptcha_output: login请求参数gen_time: login请求参数lot_number: login请求参数pass_token: login请求参数
- 返回:
-
login接口:
- 验证登录是否成功
w参数逆向分析
-
定位方法:
- 搜索
"\u0077" - r为w参数的值
- 搜索
-
r值生成:
(0,d[$_CBHHO(84)])(f[$_CBHIE(84)][$_CBHHO(562)](e), i) // 等同于 d["default"])(f["default"]["stringify"](e), i) -
加密过程:
- 将i参数和字符串化的e参数加密得到r
- 加密函数定义在11669行
-
c值生成:
var c = s[a][$_DIEIq(1403)][$_DIEHS(1498)](e, i); // 等同于 var c = s[1]["symmetrical"]["encrypt"](e, i);- e为加密内容,i为16位随机字符串
-
e参数内容:
device_id: load接口返回lot_number: load接口返回pow_msg:"1|0|md5|" + datetime + "|" + captcha_id + "|" + lot_number + 16位随机数pow_sign: pow_msg的MD5值"l0zs":"53502544": 动态变化的键值对
-
u值生成:
u = new l[($_DIEHS(84))]()[$_DIEIq(1498)](i); // 等同于 u = new l["default"]()["encrypt"](i);- 是RSA加密,可直接扣代码或使用加密库
四、关键点总结
三代关键点
- 两个w值生成逻辑不同
- 第一个w值由RSA和AES组合生成
- 第二个w值包含浏览器环境信息
- 随机字符串在整个验证过程中保持不变
四代关键点
- pow_msg的构造方式
- 动态键值对"l0zs":"53502544"的作用
- 16位随机字符串的生成和使用
- 多层加密(RSA+AES)的组合使用
通用技巧
- 使用
"\u0077"定位w值 - 环境值可以适当简化或置空
- 加密函数可直接扣代码或使用成熟加密库
- 注意随机字符串的生成和保持一致性