极验验证码的破解-开篇

来源:互联网 发布:求关键路径的算法步骤 编辑:程序博客网 时间:2024/05/22 16:54

 近几年有个拖动解锁的验证码风头很盛,用过12306的人就知道,它有段时间用的就是这个拖动解锁的验证码,据说就是极验验证码,虽然现在12306的验证码变成了看图识画,安全性和趣味性大大提高,但是也还是被万能的大神破了。由此看来天下没有破不了的验证码,只要功夫深,防火墙也能磨成针。

    好了,今天我们来探讨一下极验验证码的破解,这也是我最近一段时间的研究成果。首先声明一下:本博客所讨论的内容仅限于技术研究,请勿用于商业用途,否则后果自负。

    我打算分成几个章节来讨论极验验证码所采用的技术,以及一些破解方案:

1、极验验证码的破解1-破解思路探讨



极验验证码的破解1-破解思路探讨

本篇我将给大家介绍一下这个极验验证码是什么鬼,要想破解它我们应该分成几个步骤。

    首先打开网址:http://user.geetest.com/login?url=http:%2F%2Faccount.geetest.com%2Freport。应该感谢极验给我们提供了一个测试平台,如下图所示:

我们需要知道的事情:

1、极验验证码是以api的方式集成到不同的网站上的,这个api是一个js文件,上图中的“1”处就是这个js文件,我们下载下来看看:

image

我们需要注意的是:

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个小图片拼接而成的,如下所示:

image

image

3、如果想知道滑块的位置,我们只有通过对比两张背景图的像素差异来找的,值得庆幸的是,极验验证码只能水平拖动,所以我们只要找出滑块目标位置的left坐标即可。

4、拿到滑块的目标位置后,我们就要进行验证码破解。目前存在两种方式:一种是研究极验的api,然后收集参数构造post请求到极验的后台进行验证;另一种就是模拟人的操作来拖动鼠标到目标位置来解锁验证码。这两种方式各有利弊,第一种方式需要自己构造参数发送请求,严重依赖于极验的api,如果api稍有变更,那么此方法就会失效;第二种方式需要一个一个模拟浏览器来渲染页面,然后触发鼠标事件来达到目的,它的优点是比较稳定,不用考虑更多的技术细节,再牛逼的验证码总是要让人能通过的,我们模拟人的行为,它估计也没办法不让我们过,它的缺点是需要模拟浏览器来渲染,因此破解时间比较长。为了稳定性,我选择的是第二种方法,以phantomJs作为浏览器引擎,编写js脚本进行交互。

综上所述,我们要想破解这个验证码,我们可以分成几个任务来完成:

1、图片还原:找出两张背景图的原图,根据页面上给的参数生成两张完整的图片。

2、求解滑块位置:对比上一步生成的两张背景图,求解滑块目标位置的left坐标,此坐标便是滑块的目标位移(暂时这么理解,实际有点偏差,后面会讲到)

3、编写js脚本:编写控制整个流程并移动滑块进行验证的js脚本文件

4、模拟器加载页面并执行js脚本进行破解

好了,这一章讲到这里,下一章我将介绍如何实现图片还原和求解滑块位置。

仅此而已

0 0
原创粉丝点击