目标地址
aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
请求流程
1、https://gcaptcha4.geetest.com/load
加载验证码,返回验证码相关资源,及验证需要的参数
2、https://gcaptcha4.geetest.com/verify
验证接口,需要逆向一个w参数
极验4代相比极验3代,难度要低一些,只需要逆向一个w参数即可,并且也取消了图片还原、轨迹校验等等。
接下来正文开始:
首先是请求load接口,拿到验证码相关资源,请求体的captcha_id为固定值,challenge为uuid,扣代码或者引用三方库都可以。
注意保存响应体的参数,后续加密w的时候需要用到。
再去请求响应体中的bg和slice,拿到验证码的图片,得到滑块距离。这里不多解释,与三代一样。
接下来开始verify接口的参数构造,也是四代的核心内容,笔者这里将gcaptcha4.js做了解混淆,看起来会更方便。f["default"]["stringify"]为JSON.string方法,直接修改就可以,n参数在四代滑块中只取了n['options']['pt'],值为1,补齐就行,其他参数可以省略,重点看前面的m["default"]
跟栈进入到函数i中,可以看到仅用到了r["1"],也就是说,只需要把h["default"]和l["default"]抠出来即可,这里需要注意抠出来的代码的完整性,很容易漏掉某一段,一定要扣全。
以下为h["default"]的完整定义,截图限制未截全,需要完整抠出来。
将此段代码修改为自执行函数,并将最后导出的n挂载到window身上,再将h["default"]的调用方式,修改window["encrypt"]即可。
l["default"]也是同理,这里其实就是rsa加密。
最终将函数i如下图所示,guid和arrayToHex就不赘述了,直接跟栈进入,扣下来用即可。
当完成到这一步,整个逆向过程就已经完成了90%,只剩下参数e的构造。
setLeft为滑块距离;
passtime为通过时间,可以随机;
userresponse为distance计算得来,等于distance / 1.0059466666666665 + 2;
lot_number取load接口返回的lot_number;
pow_msg = `1|0|md5|${datetime}|${captcha_id}|${lot_number}||${guid()()}`,由多个参数拼接而来;
pow_sign为pow_msg的md5加密;
其他未提到的参数,均可固定。
最后提交请求,返回success即代表成功。