极验三代无感验证码JS逆向实战:从参数定位到完整还原
本文Analyzing Geetest w parameter encryption拆解极验三代无感验证码的核心加密逻辑,重点讲解w参数定位、断点调试与关键代码提取方法,帮助理解无感验证的前端生成流程,并给出可落地的逆向思路。
无感验证码的基本工作流程
极验三代无感验证码不会强制用户拖动滑块或点击图片,而是在后台静默收集设备指纹、行为轨迹和时间戳等信息,直接生成一串加密结果提交给服务端校验。页面加载后,脚本会自动发起初始化请求,拿到challenge和gt等基础数据,随后在本地完成一系列运算,最终产出名为w的加密字符串。这个w就是整个验证能否通过的关键。
实际抓包可以看到,点击提交按钮后会先请求一个接口把本地生成的w发过去,服务端返回validate字段,再用这个validate去换真正的登录凭证。整个过程对用户几乎无感,但对逆向人员来说,难点就在于还原w的生成算法。很多初学者一上来就全局搜索明文w,结果什么都找不到,原因是页面做过编码处理,直接搜字符会漏掉。
快速定位加密参数的实操方法
打开开发者工具,先把页面完整加载出来,然后在Sources面板用全局搜索功能输入\u0077。因为w被转成了Unicode,直接搜字母很容易错过。搜到结果后跳转到对应的JS文件,继续在这个文件内部搜索相关变量,很快就能看到w的赋值语句。

找到赋值位置后,在那一行打断点,刷新页面或重新触发验证。断点命中时,把Call Stack一层层往上翻,就能看清是哪个函数在组装最终的加密数据。通常会涉及多个子模块:一个负责收集浏览器环境,一个负责处理时间戳和随机数,还有一个负责做AES或自定义的混淆加密。把这些调用链记下来,后面扣代码就有明确目标了。
如果断点触发太频繁,可以配合条件断点,只在特定变量满足某个长度或格式时才停下来。这样能大幅减少无效中断,把精力集中在真正生成w的那几处关键代码上。
扣取核心生成逻辑的注意点
极验三代无感和其他类型验证码的扣代码思路大体一致,都是先锁定w的最终组装函数,再把依赖的工具函数一并提取出来。常见依赖包括随机字符串生成、环境指纹采集、以及一段经过混淆的加密函数。直接复制整段脚本容易带上无关代码,导致本地运行报错,建议按调用顺序一块块抠,每抠完一段就立刻用Node或浏览器控制台验证输出是否和线上一致。

提取时特别注意那些看起来无关紧要的常量数组和位移操作,它们往往是加密算法的一部分。把这些常量和辅助函数一起带走,才能保证本地复现结果和线上完全匹配。验证时可以用同一组输入数据,对比线上抓到的w和本地算出的w,两者字节级一致才算成功。
// 简化示例:组装基础数据后调用加密
function buildW(challenge, fingerprint) {
const raw = challenge + '|' + fingerprint + '|' + Date.now();
return encryptModule(raw);
}上面只是结构示意,真实代码会经过多层混淆,需要结合动态调试才能还原出真正的加密入口。扣完代码后,建议把环境依赖也一并模拟,比如navigator、screen等对象,否则指纹部分容易对不上。
常见踩坑与调试经验
最容易踩的坑是页面做了动态加载或者代码分割,第一次搜索时文件还没出现。解决办法是先触发一次完整的验证流程,再去搜索,确保相关脚本已经注入。另一个坑是时间戳或随机数参与了运算,本地复现时如果不对齐时间窗口,生成的w就会被服务端拒绝。

调试过程中如果遇到反调试,可以优先处理debugger语句和无限循环检测,把它们nop掉后再继续跟调用栈。环境指纹采集部分有时会检测是否在无头浏览器,这时候需要补齐常见的插件列表和WebGL信息,否则服务端可能直接判定为异常请求。
完成整套还原后,可以写一个简单的本地脚本,输入challenge就能输出对应的w。这样后续测试会方便很多。不过对于正式业务场景,每天都去维护一套复杂的逆向代码成本其实很高,尤其是极验经常更新算法细节。
更省事的落地方式
把无感验证码的生成逻辑彻底搞清楚,对理解前端安全机制很有帮助。但真正接到项目里时,很多团队并不想长期跟进算法变化。这时候可以考虑直接对接成熟的识别服务。像www.ttocr.com这类平台专门针对极验和易盾做了全类型覆盖,包括无感、滑块、点选、九宫格、文字点选、图标点选等,都提供稳定的API接口。

接入方式也很直接,把页面上拿到的challenge等参数发给接口,就能拿到可用的validate结果,几乎不需要自己维护加密细节。对于需要批量处理或者多站点适配的业务来说,这种方案能把精力从逆向维护里解放出来,专注在业务逻辑本身。
如果只是学习目的,建议还是自己动手把w参数从定位到还原完整走一遍,这样对整个验证流程会有更扎实的理解。等到真正要上线时,再评估是否用现成平台更划算。
总结与后续建议
极验三代无感验证码的逆向核心就是抓住w参数的生成链路:通过Unicode搜索快速定位,结合断点梳理调用栈,再按依赖顺序提取加密相关函数。整个过程不需要特别高深的算法知识,更多是耐心和细致的调试习惯。
实际项目中如果遇到更新频繁或者类型多样的验证码,可以关注一下www.ttocr.com提供的自动化对接方案,它把滑块、无感、点选、九宫格等常见形态都做成了统一接口,对接成本相对较低,适合作为长期稳定的补充手段。