百趣云 百趣云的博客

极验 geetest 三代与四代的参数体系分析

极验的版本差异:不只是界面变了

极验(geetest)是国内占有率最高的验证码服务,三代和四代是完全不同的协议体系

  • 三代gtchallenge 双参数体系,验证流程是"初始化 → 拿图 → 提交轨迹 → 二次校验"
  • 四代captcha_id 单参数,流程合并为"加载 → 验证 → 结果",参数全面加密升级

很多站点还在用三代,新接入的基本是四代。逆向前先确认版本:看页面加载的 JS 是 gt.js(三代)还是 gcaptcha4.js(四代)。

三代协议流程拆解

1. GET /register?gt=xxx                    → 拿 challenge
2. GET /gettype?gt=xxx&callback=xxx        → 验证码类型(slide/click/icon)
3. GET /get.php?gt=xxx&challenge=xxx       → 拿图(背景图/滑块图地址)
4. POST /ajax.php                          → 提交轨迹加密结果 w 参数
5. 业务方服务端二次校验                     → validate

核心是第 4 步的 w 参数——它是轨迹、耗时、设备信息的加密打包:

w = RSA加密( AES加密(轨迹数据 + passtime + 缺口距离 + 设备信息) )

逆向 w 的要点:

  • 轨迹编码格式:自定义的数组编码(不是 json),在 geetest.js 里搜轨迹收集函数
  • AES key 每次会话随机生成,RSA 公钥从接口动态下发
  • passtime(耗时)和 imgload(图片加载耗时)参与校验,别填 0

四代协议的变化

四代把流程压缩了,但加密强度上去了:

1. POST /load?captcha_id=xxx        → 拿验证码配置和图
2. POST /verify                     → 提交加密结果

关键变化:

  1. 参数全面加密:load 和 verify 的请求体都是加密的(payload 参数),加密 key 由 JS 动态生成
  2. 设备指纹前置:四代在 load 阶段就采集设备指纹(gct 文件),指纹异常直接不出图或出高难度题
  3. w 参数结构变化:四代的加密结果字段更多,包含行为序列的统计特征(不只是原始轨迹点)

逆向方法论:从加密入口倒推

无论三代四代,逆向的切入点都是找"轨迹收集 → 加密 → 上传"这条链:

// hook 点1:找加密函数(搜特征)
// 极验的 RSA 实现在 JS 里,搜 "RSA" 或公钥特征串

//  hook 点2:hook XHR 看提交内容
const _send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(body) {
    if (body && body.includes('w=')) debugger;
    return _send.apply(this, arguments);
};

// hook 点3:轨迹收集数组
// 极验把轨迹存在内部数组,找到后可以直接注入伪造轨迹

精髓:极验对抗的三个现实

  1. 纯协议模拟极验四代的成本极高。它的加密链和行为校验是持续对抗更新的(极验有专门团队干这个),自己维护协议代码会陷入"每周修一次"的泥潭。现实方案:浏览器自动化 + 轨迹模拟,把加密交给页面自己的 JS 跑
  2. geetest 的"无感验证"模式。很多站点配置的是无感模式——行为分够高直接过,不出滑块。这意味着养设备/账号的行为分比研究滑块更重要:正常浏览、点击、停留,把分养高,验证码根本不出现
  3. 打码平台对极验的支持最成熟。极验是打码平台的主战场,识别率和协议更新都最快。业务量不大时,别自己逆,直接对接

总结

  1. 三代双参数(gt/challenge)+ w 加密;四代单参数 + 全链路加密
  2. w 参数 = RSA(AES(轨迹+耗时+设备信息)),key 动态生成
  3. 四代设备指纹前置,指纹异常直接高难度
  4. 工程现实:浏览器自动化 > 纯协议模拟,无感模式靠养行为分

交流微信:run1255

By 百趣云 阅读量:2 On