极验滑动验证码6.0破解复盘 - 知乎

https://zhuanlan.zhihu.com/p/107786616python


【文章恢复,首次发表时间 2017-11-09】

0. GeeTest.6.0.0

GeeTest极验验证码悄悄在这一两个月更新了js代码,从5.X到了6.0,破解的难度比以前稍微复杂了一些,破解已成功,就来复盘一下吧。算法


1. 总体思路

拿这个《国家企业信用信息公示系统》为例,查询时会先须要经过滑动验证码。打开f12刷新网页,完成一次失败的滑动,查看加载项。数组

请求时提交一些参数完成验证。函数

passtime应该就是滑动的时间。imgload多是图片加载时间优化

先记下这个参数,继续看加载项。编码

gt和challenge的值在这里。记为1号包,接着看下一个加密

这里返回的是一些参数,记为2号包,这里的返回值是后面3号包的请求的参数。url

3号包:这个返回值也有challenge和gt,但gt的值没有变化是一个固定的值,challenge每次请求都发生了变化。但这个结果的返回值和提交时的challenge一致,这就找到了两个参数。spa

同时还有fullbg和bg两个参数,获得乱排序后的图片,经过排序以后能够计算滑动偏移量。.net

fullbg bg

(图片还原能够参照以GeeTest为例的滑动验证码破解 - 图片还原2)!!!

另外的userresponse 和aa值是经过后面的geetest.6.0.0.js加密算法算出

那下一步则是解析这个js文件

2. userresponse和aa

镜头来到Source中找到这个js。一顿查找,终于发现:

只想说在这一堆混淆的js写得真不容易,编码也下了功夫。可真很差找!!!!

r1Y中就是咱们须要的各个参数,其中的aa和userresponse加密算法也在。

  • userresponse

这里userresponse须要的参数是滑动轨迹数组的长度和上文3号包的challenge,这里和5.x版本很像,可是发现加密算法改了.

看着真蛋疼,不过还好解决了,改写成了python

  • aa

aa就是对轨迹的加密也是和上一版本很大区别,看完6.0,以为上一版本简直不能再简单了。

aa从这里开始,找到这个函数,须要的参数就是提交的轨迹,这里放到后面

接着返回一串加密的字符串,可是还不够,还要加密一次,也找到了

找到函数:

这里返回也是一串加密字符串,最后通过encodeURIComponent处理便可

到这里全部参数出处和算法搞定了。最后就是看看轨迹

3. 轨迹

这里先完成一次滑动,查看结果

结果是轨迹用一组数组表示,数组里每一个小数组表明每个微小滑动的数据:

[滑动距离, 上下偏移量, 累计时间]

(上文中的passtime就是这里的累计时间)

  • 累计时间能够每次变化加上一个限定范围内的随机值。
  • 上下偏移量设定有小小范围的(例如[-5, 5]内)的偏移。
  • 滑动距离采用了一个sigmoid函数(相似下面),还能够优化,成功率会更高。
# b偏移量
def sigmoid(x, b):
    return (1 / (1 + exp(-x + 4))) * b

获得结果,恩能够了。

4. 最后

不提供代码, 毕竟人家工程师不容易,本文仅提供一个思路。

相关文章
相关标签/搜索