1. 极验三代验证码的技术背景文字点选验证码作为人机验证的重要手段在各类网站和APP中广泛应用。极验作为国内领先的验证码服务商其三代产品在安全性和用户体验上做了大量优化。我花了三周时间逆向分析这套系统发现它在加密逻辑和交互流程上确实比二代复杂不少。验证码的核心作用是区分人类和机器操作。极验三代通过文字点选方式要求用户在图片中按顺序点击指定文字。看似简单的交互背后其实隐藏着多层加密和风控机制。从技术角度看这套系统主要解决两个问题如何安全传输验证数据以及如何防止自动化脚本模拟人类操作。在实际分析过程中我发现极验三代采用了混合加密方案。前端使用RSA加密关键参数后端通过AES处理会话数据。这种设计既保证了传输安全又提高了破解难度。特别值得注意的是w参数它是整个验证过程中的关键加密字段包含了时间戳、用户操作轨迹等多种信息。2. 通讯流程全解析2.1 初始请求阶段整个验证流程从register-click-official接口开始。这个接口会返回两个重要参数challenge和gt。实测发现这两个值每次请求都会变化有效防止了重放攻击。在Python中我们可以用requests库模拟这个请求import requests init_url https://api.geetest.com/register-click-official response requests.get(init_url) challenge response.json()[challenge] gt response.json()[gt]接下来需要调用get.php接口。这里有个坑我踩过虽然文档说w值可以置空但在某些版本中缺少这个参数会导致后续步骤失败。建议始终带上一个空字符串作为w值。2.2 验证码交互阶段点击验证按钮后系统会加载文字点选界面。这时前端会发起第一个ajax.php请求虽然返回内容看似无关紧要但缺少这个请求会导致后续验证失败。第二个ajax.php请求才是重点它包含了用户点击位置的加密数据。通过抓包分析我发现验证结果主要通过validate参数返回。这个参数的值会用于最终的登录验证。有趣的是系统对鼠标移动轨迹的检测非常严格直线移动的操作很容易被判定为机器行为。3. w参数逆向工程3.1 参数定位方法w参数是整个逆向过程中最复杂的部分。通过搜索特征码\u0077可以快速定位到click.3.0.7.js文件的第5839行。这里有个技巧不要直接分析混淆后的代码先用AST解析工具对代码进行反混淆处理。w参数由三部分组成p l 其他数据。其中l参数是通过RSA加密生成的公钥和模数可以在原型链中找到。以下是关键的加密逻辑function generateL() { const randomStr generateRandomString(16); const encrypted RSA.encrypt(randomStr, publicKey); return encrypted; }3.2 加密算法分析h参数采用了AES加密初始向量iv固定为0000000000000000。这个设计让我很意外因为静态IV会降低安全性。加密前的原始数据包含多个关键字段passtime图片加载时间a用户点击位置坐标pic背景图片URLrpgt、challenge和passtime的MD5哈希在实际破解时我发现tt字段的生成逻辑最复杂。它融合了c、s参数和鼠标轨迹数据采用了自定义的加密算法。建议直接扣取原代码中的加密函数而不是尝试重写。4. 文字识别方案选型4.1 开源模型对比解决了参数加密问题后还需要处理文字识别。测试过多个方案后我发现ddddocr虽然准确率只有30%左右但部署简单适合快速验证。对于更高要求的场景基于PyTorch的自训练模型是更好的选择。这里分享一个实际案例在识别繁体字时ddddocr的准确率会进一步下降。解决方法是对样本图片进行预处理包括灰度化、二值化和降噪。以下是用OpenCV处理的示例代码import cv2 def preprocess(image): gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) denoised cv2.fastNlMeansDenoising(binary, h10) return denoised4.2 模型优化技巧要提高识别率数据增强是关键。我常用的方法包括添加随机噪点模拟不同光照条件应用透视变换调整字体渲染效果在模型结构上CRNN卷积循环神经网络表现最好。它能同时处理图像特征和序列信息特别适合验证码中的文字识别。训练时注意控制学习率过大的学习率会导致模型难以收敛。5. 完整破解方案实现5.1 自动化流程设计将上述技术点组合起来就能构建完整的破解方案。整体流程分为四个步骤初始化获取challenge和gt加载并识别验证码图片生成加密参数提交验证请求在实现时要注意请求间隔。太快的操作会被识别为机器人行为。建议在每个步骤间加入随机延迟模拟人类操作节奏。5.2 反检测策略极验的风控系统会检测多种特征WebGL渲染结果Canvas指纹浏览器API支持情况鼠标移动轨迹要绕过检测需要完整模拟浏览器环境。Puppeteer等无头浏览器工具是不错的选择但要注意完善各种细节。比如记得设置合理的viewport和user-agent并注入常见的浏览器插件信息。6. 实战经验与坑点在实际项目中我遇到过几个典型问题。首先是环境依赖极验的JS代码对浏览器特性有严格检测。在Node.js环境中运行时需要补全缺失的DOM和BOM对象。另一个坑是加密算法的时区问题。服务器会检查时间戳的合理性时区设置不正确会导致验证失败。解决方法是在生成参数时统一使用UTC时间。最后提醒一点极验会定期更新算法。我遇到过一个版本突然改变了w参数的生成逻辑导致原有方案失效。建议在代码中加入版本检测机制及时发现这类变更。