近几年有个拖动解锁的验证码风头很盛,用过12306的人就知道,它有段时间用的就是这个拖动解锁的验证码,据说就是极验验证码,虽然现在12306的验证码变成了看图识画,安全性和趣味性大大提高,但是也还是被万能的大神破了。由此看来天下没有破不了的验证码,只要功夫深,防火墙也能磨成针。
好了,今天我们来探讨一下极验验证码的破解,这也是我最近一段时间的研究成果。首先声明一下:本博客所讨论的内容仅限于技术研究,请勿用于商业用途,否则后果自负。
我打算分成几个章节来讨论极验验证码所采用的技术,以及一些破解方案:
1、极验验证码的破解1-破解思路探讨
本篇我将给大家介绍一下这个极验验证码是什么鬼,要想破解它我们应该分成几个步骤。
首先打开网址:http://user.geetest.com/login?url=http:%2F%2Faccount.geetest.com%2Freport。应该感谢极验给我们提供了一个测试平台,如下图所示:
我们需要知道的事情:
1、极验验证码是以api的方式集成到不同的网站上的,这个api是一个js文件,上图中的“1”处就是这个js文件,我们下载下来看看:
我们需要注意的是:
1、极验验证码是采用api的方式与别的网站集成的,api就是上图中“1”所指的js文件,我们可以看看这个文件:
(function () { var e = function () { var t, n = document.body.getElementsByTagName("script"), r = 'http://api.geetest.com/get.php?gt=a40fd3b0d712165c5d13e6f747e948d4&random=1466910819494'; for (var o = 0; o < n.length; o++) { if (n[o].src == r) { t = n[o]; if (window.Geetest) { new Geetest({ "gt": "a40fd3b0d712165c5d13e6f747e948d4", "feedback": "http://www.geetest.com/contact#report", "hide_delay": 800, "product": "float", "height": 116, "logo": true, "theme_version": "3.0.21", "id": "a7adbcccc6366d5a96a94aac6b6ad7518", "slice": "pictures/gt/7ed8940e0/slice/89ead30a.png",//小滑块的图片 "theme": "golden", "version": "5.5.16", "https": false, "type": "slide", "show_delay": 250, "xpos": 0, "bg": "pictures/gt/7ed8940e0/bg/89ead30a.jpg",//带洞的背景图 "fullbg": "pictures/gt/7ed8940e0/7ed8940e0.jpg",//完整的背景图 "fullpage": false, "benchmark": false, "ypos": 16, "link": "", "staticservers": ["static.geetest.com/", "dn-staticdown.qbox.me/"], "mobile": false, "challenge": "7adbcccc6366d5a96a94aac6b6ad751837", "apiserver": "http://api.geetest.com/", "clean": false }, true).appendTo(t, true) } else { setTimeout(e, 100) } break } } }; …… })();
可以看到这个文件包含了极验验证码的所有参数,页面上的验证码控件只不过是根据这个api的结果加上html渲染出来的而已。
2、验证码控件有两个背景图(一张完整的和一张带洞的)和一个滑块图片,滑块的位置就由图片来指示。值得注意的是,极验验证码的两个背景图并不是一张完整的图片,极验的api给的图片都是混乱的,界面上显示的完整的背景图都是在原图上抠出52个小图片拼接而成的,如下所示:
3、如果想知道滑块的位置,我们只有通过对比两张背景图的像素差异来找的,值得庆幸的是,极验验证码只能水平拖动,所以我们只要找出滑块目标位置的left坐标即可。
4、拿到滑块的目标位置后,我们就要进行验证码破解。目前存在两种方式:一种是研究极验的api,然后收集参数构造post请求到极验的后台进行验证;另一种就是模拟人的操作来拖动鼠标到目标位置来解锁验证码。这两种方式各有利弊,第一种方式需要自己构造参数发送请求,严重依赖于极验的api,如果api稍有变更,那么此方法就会失效;第二种方式需要一个一个模拟浏览器来渲染页面,然后触发鼠标事件来达到目的,它的优点是比较稳定,不用考虑更多的技术细节,再牛逼的验证码总是要让人能通过的,我们模拟人的行为,它估计也没办法不让我们过,它的缺点是需要模拟浏览器来渲染,因此破解时间比较长。为了稳定性,我选择的是第二种方法,以phantomJs作为浏览器引擎,编写js脚本进行交互。
综上所述,我们要想破解这个验证码,我们可以分成几个任务来完成:
1、图片还原:找出两张背景图的原图,根据页面上给的参数生成两张完整的图片。
2、求解滑块位置:对比上一步生成的两张背景图,求解滑块目标位置的left坐标,此坐标便是滑块的目标位移(暂时这么理解,实际有点偏差,后面会讲到)
3、编写js脚本:编写控制整个流程并移动滑块进行验证的js脚本文件
4、模拟器加载页面并执行js脚本进行破解
好了,这一章讲到这里,下一章我将介绍如何实现图片还原和求解滑块位置。