极验的版本差异:不只是界面变了
极验(geetest)是国内占有率最高的验证码服务,三代和四代是完全不同的协议体系:
- 三代:
gt、challenge双参数体系,验证流程是"初始化 → 拿图 → 提交轨迹 → 二次校验" - 四代:
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 → 提交加密结果关键变化:
- 参数全面加密:load 和 verify 的请求体都是加密的(
payload参数),加密 key 由 JS 动态生成 - 设备指纹前置:四代在 load 阶段就采集设备指纹(
gct文件),指纹异常直接不出图或出高难度题 - 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:轨迹收集数组
// 极验把轨迹存在内部数组,找到后可以直接注入伪造轨迹精髓:极验对抗的三个现实
- 纯协议模拟极验四代的成本极高。它的加密链和行为校验是持续对抗更新的(极验有专门团队干这个),自己维护协议代码会陷入"每周修一次"的泥潭。现实方案:浏览器自动化 + 轨迹模拟,把加密交给页面自己的 JS 跑
- geetest 的"无感验证"模式。很多站点配置的是无感模式——行为分够高直接过,不出滑块。这意味着养设备/账号的行为分比研究滑块更重要:正常浏览、点击、停留,把分养高,验证码根本不出现
- 打码平台对极验的支持最成熟。极验是打码平台的主战场,识别率和协议更新都最快。业务量不大时,别自己逆,直接对接
总结
- 三代双参数(gt/challenge)+ w 加密;四代单参数 + 全链路加密
- w 参数 = RSA(AES(轨迹+耗时+设备信息)),key 动态生成
- 四代设备指纹前置,指纹异常直接高难度
- 工程现实:浏览器自动化 > 纯协议模拟,无感模式靠养行为分
交流微信:run1255