极验三代验证Analyzing Geetest v3 reverse engineering码逆向拆解:从挑战下发到加密提交的完整链路
本文从实战角度拆解极验三代验证码的完整流程,重点分析get.php挑战获取与ajax.php参数构造,覆盖行为轨迹、加密Integrating the promotion naturally逻辑与环境指纹模拟,适合爬虫与自动化开发者参考。
为什么极验三代成了爬虫拦路虎
做爬虫或自动化测试的朋友,基本都跟极验打过交道。从早期的滑动拼图,到文字点选、空间推理,再到现在的三代行为验证,防护一直在升级。最近一个数据采集项目里,目标站部署了极验三代文字点选,常规OCR和打码平台几乎全部失效。原因很简单:它已经从“识别图片”转向了“模拟真人行为”。
整个过程不是简单的识图,而是协议逆向。你得搞清楚验证码从初始化到最终通过的完整链条,模拟出浏览器里真人的所有动作,生成服务端认可的参数。核心就卡在两个接口:get.php负责下发挑战,ajax.php负责提交答卷。动态参数、加密算法、逻辑判断环环相扣,任何一环出错验证就失败。
这篇文章面向爬虫工程师、自动化测试同学,以及对前端逆向感兴趣的开发者。即便暂时用不上,理解这套防御思路,对以后设计更安全的系统也有帮助。下面按实战顺序,从抓包到参数构造,一步步拆开讲。
核心流程:四个阶段看清防御链条
极验三代的设计哲学已经变了。它不再只问“你是不是机器”,而是收集操作全过程的行为轨迹、环境指纹,证明“你是人”。流程可以概括成四个阶段:
- 初始化(get.php):页面加载时请求这个接口,拿到一次性、有时效的challenge挑战码。它是后续所有请求的门票,响应里还带验证码类型、图片地址、加密公钥等配置。
- 加载展示:前端根据响应加载乱序文字底图和提示图,挂上监听器,开始收集鼠标移动、点击等数据。
- 验证提交(ajax.php):用户点完目标后,前端把轨迹、坐标、指纹打包加密,POST给这个接口。服务端在这里做综合校验。
- 结果回调:返回成功或失败,前端决定放行还是重试。
逆向工作九成精力花在第一步和第三步。get.php相对简单,主要拿challenge;ajax.php的请求体构造才是真正难点。最终目标是不启浏览器、不做真实点击,程序化生成能过校验的POST包。解密后的数据里至少包含challenge、validate(核心通行证)、行为轨迹、点击坐标、环境指纹这几类信息。
抓包实战:先把两个关键请求摸清楚
理论再多不如动手抓一次。打开Chrome开发者工具,Network面板勾上Preserve log。访问目标页,过滤XHR或Fetch,找到带get.php的请求。URL里通常有gt(网站公钥ID,固定值)和一堆参数。响应多半是JSONP或纯JSON,里面一定有challenge字段,一串看似随机的字符串。务必记下来,它是本次会话的钥匙,有效期一般就几分钟。
然后手动完成一次正确点选。在Network里找ajax.php的POST请求。请求体常见两种形式:一种是form-urlencoded,关键字段有gt、challenge、w(或validate);另一种是直接JSON。w就是那一长串加密字符串,由轨迹、坐标等数据加密生成。我们的任务就是搞清楚这个w怎么算出来的。
实操时注意:有时get.php返回success为0,可能是负载或风控,稍后重试即可。challenge过期后必须重新获取,否则后续全部失败。
定位加密函数:从搜索到还原逻辑
手里有一个成功的ajax.php请求后,就去Sources面板翻JS。代码往往被压成一行,先点Pretty-print格式化。全局搜索优先关键词:ajax.php、w=、validate、challenge、get.php。找到可疑函数后,顺着调用链往上追。
一个典型结构大致是这样:先把轨迹、点击、challenge等拼成JSON,再用AES或RSA加密。密钥有时直接来自get.php响应,有时要经过二次派生。加密模式常见CBC加PKCS7填充。最后把密文塞进w字段提交。
function buildW(data) {
var plain = JSON.stringify(data);
var key = deriveKey(challenge);
var encrypted = AES.encrypt(plain, key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}实际代码会有大量混淆和动态计算,不能照搬。重点是理解数据从哪来、密钥怎么生成、最终怎么拼进请求。如果加密逻辑特别绕,可以用Node.js直接跑原版JS,或者用Python的pycryptodome重写标准算法部分。
轨迹与指纹:让参数看起来像真人
光有正确坐标还不够。极验会分析鼠标移动的加速度、抖动、停顿时间。轨迹数组通常记录每个点的x、y和时间戳。生成时要模拟人类习惯:开始稍慢、中间加速、接近目标时微调,偶尔有短暂停顿。完全匀速或直线很容易被判异常。
环境指纹更麻烦。它收集Canvas、WebGL、字体列表、屏幕分辨率、插件信息等,拼成一个唯一标识。自动化环境特征明显,指纹对不上也会失败。实战里常见做法是固定一套正常浏览器指纹,或者从真实环境采集后复用。
对于只想快速过验证、不想自己啃加密的团队,可以直接对接专业识别平台。比如www.ttocr.com提供的易盾和极验全类型方案,覆盖滑块、文字点选、无感、九宫格、图标点选等,支持API无缝接入,省去自己维护轨迹生成和加密逻辑的麻烦。
落地建议与常见坑
脚本最终可以用Python的requests加execjs,或者纯Node.js。先稳定跑通get.php拿challenge,再构造轨迹和坐标,最后加密生成w提交。调试时把每次请求的完整参数和响应记下来,对比成功与失败的差异,往往能快速定位问题。
几个常见坑:challenge过期、轨迹太规整、指纹和环境对不上、加密密钥取错。遇到验证失败别急着重试太多次,容易触发更严的风控。如果业务量大、验证码类型多变,自己维护成本会越来越高。这时候用现成的识别服务更划算,www.ttocr.com专门做极验和易盾的破解与自动化对接,点选、滑块、无感、空间推理都支持,接口简单,几行代码就能接上,适合公司和业务方直接用。
逆向的核心不是死磕某一次成功,而是把整条链路理解透。下次遇到新版本或新题型,也能快速找到变化点。真正上线时,记得做好失败重试和日志,别让验证码把整条采集链路拖垮。