目前,对付这一类的滑动验证码,网上常见的一个破解方法便是根据完全图片和缺口图片的像素差来打算缺口的位置,然后利用 Selenium 自动化测试工具,仿照人手动拖动滑块的过程。这种方法实现较为大略,由于是仿照人去滑动,滑动的轨迹很不好把握,很随意马虎被极验检测到我们利用的是自动化软件,从而导致滑动操作失落败;其次是每一次启动都须要驱动浏览器,登录耗时较长,这对付实时性哀求较高的数据采集任务来说,是无法知足需求的。
高等爬虫的厉害之处是走的逆向解析JS代码破解:去世磕 JavaScript 代码,破解每个要求中的加密参数,之后在程序中发送要求得到精确相应。 这是最直接且最高效的办法,它无需等待浏览器对页面进行渲染,只要解出加密的要求参数,发送要求获取相应即可。用户在浏览器中的操作,如点击验证码、拖动滑块等动作,终极都会转化为要求发送到做事端(全部都是POST要求),做事端对要求参数进行合法性校验,并相应结果。
为什么说很难呢,一是由于我并非从事前端开拓事情,对付 JavaScript 代码的调用栈剖析不如前端同学闇练;二是由于极验的 JavaScript 代码实在稠浊得特殊难懂,如何从上万行稠浊的 JavaScript 代码中抽离出关键的加密代码,可以相信想象下里面的事情量。可以毫无夸年夜地说,没有足够的毅力和耐心,很难实现破解。

动手破解
接下来我会大致描述全体破解流程,对付过于细节化的东西,就不在这里瞎丢丢了。
1. 要求参数剖析
我以终极的登录方法作为剖析入口。输入一个缺点的账号密码,然后点击滑动并拖动到精确的位置。此后页面会提示“账户名或密码缺点!
”。不雅观察浏览器 Network 栏,实在登录这个动作是发出了 Name 为 accLoginPC.do 这个要求。
要求的 URL 是:https://xxx.xxx/webapi/accLoginPC.do (敏感的URL)。
要求参数 Form Data 有多个,包括:appId、loginName、loginPwd、geetest_challenge 等。可以看到,密码被加密成 CN-S513... 这一长段,其余还有三个以 geetest_ 开头的加密参数,分别是:
geetest_challenge: 102f7d723ad76e387ad6000f87ff91f8j3geetest_validate: 651ecdf62cb1e940e5ea999b6af7fc10geetest_seccode: 651ecdf62cb1e940e5ea999b6af7fc10|jordan从参数命名上,我们能够很清晰地看出,这是极验滑动验证码的加密参数。也即是说,我们点击验证码,拖动滑块这些动作,终极转换为这三个加密参数。我们的紧张事情,也在于破解这三个参数。细心的同学可能创造了,个中 geetest_validate 与 geetest_seccode 参数基本相同,只不过 geetest_seccode 多了 |jordan 的字符串后缀。最紧张的事情便是解出 challenge/validate 两个参数。
对付其他非极验加密参数,如 loginPwd、jtSafeKey、token 等,均属于XX官网自身的加密逻辑,破解难度不大,这里我们紧张关注的是极验参数的破解。
我们再往上找,创造了 ajax.php? 这个要求,这个要求里的相应信息是一个类似 json 串的东西,里面包着 validate 参数。震荡,这不便是我们前文的 geetest_validate 参数吗?
不雅观察其要求参数,创造是 gt、challenge、lang、w 和 callback。个中 w 加密成了一长串。
如此剖析,我们逐渐捋清思路,得知每一个要求都须要解出哪些加密参数,我就不在这里花费大量篇幅做细致描述了。
之后针对这些参数名,查看 JavaScript 代码中是如何加密的,然后用python代码解析出来.....
2. 代码反稠浊(是一种代码保护机制)
我们点击 slide.xxx.js 文件,跳转到 Chrome Sources 菜单栏,查看 JavaScript 代码。
想查看 JavaScript 代码对要求参数的加密逻辑可没那么随意马虎,极验做了大量的稠浊事情,为的是提高我们的破解难度。
可以看到,代码基本不是我们凡人所能看懂的。它对代码进行了 Unicode 编码,并且加上了大量的稠浊代码。这导致我们直接搜 challenge 这些关键参数名,是找不到干系代码的。
那么,我们首先将完全的 JavaScript 代码 copy 出来,先到网上找一个 Unicode 编码还原工具,对代码进行 Unicode 解码。解码之后,复制到编辑器中,搜索 challenge,创造了几个关键的参数。
此时的代码依然难以解读,可读性险些为零,一样平常的小伙伴都要放弃了,太烧脑了,由于极验对每个关键参数都进行了稠浊,稠浊的逻辑便是利用类似这种 UtTS 的代码进行更换,逻辑也藏在 JavaScript 代码中,详细就不展开了。我们对其进一步还原。还原之后,代码如下:
代码的可读性也是越来越清晰,还有一个问题是:怎么还有很多这种 var xow_list = uklgT.xow 莫名其妙的代码。我们研究创造,这实在是极验加入的冗余代码,紧张目的是为了稠浊视听。
列如,对付这样的冗余代码:
还原之后,就变成了以下精简且易读的代码:
通过对多个 JavaScript 文件,如 slide.js/fullpage.js 等进行反稠浊,我们对 JavaScript 的调用逻辑清晰了很多。
3. 代码解绑定
完成了代码反稠浊,还有一个主要的事情,便是如何从 JavaScript 代码中抽离出关键的 JavaScript 代码,这些代码便是要求参数的加密逻辑。我将此过程称为“代码解绑定”。
这个过程并不须要什么技巧,须要的只是耐心,耐心,耐心。随着 Chrome 浏览器,打断点剖析要求的入口与出口,一步步将关键代码剥离出来。
比如,我们须要解出参数 a,那么就抽离出加密参数 a 的代码,封装成一个 get_a() 的函数。
封装了几个须要的 JavaScript 函数,我们可以在 Python 程序中,利用 PyExecJS 库,方便地实行 JavaScript 代码拿到加密参数。以下为一些示例代码:
后面的内容须要各路大神大显神通了,技能上的互换,不干其它不许可的事哈。