利用边缘检测实现的滑动验证码破解 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chxj1992
V2EX    Python

利用边缘检测实现的滑动验证码破解

  •  1
     
  •   chxj1992 2017-06-29 17:36:58 +08:00 10030 次点击
    这是一个创建于 3028 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近可能是和验证码杠上了 ...

    项目地址: https://github.com/chxj1992/slide_captcha_cracker

    Demo: http://slide-captcha.chxj.name

    相比之前利用神经网络训练来破解普通验证码,这个可能更具通用性,因为不用依赖训练数据。

    滑动验证码拼图的定位问题只是破解过程中的一个环节,代码主要采用 opencv 提供的一些函数对图片进行处理后来实现定位,在这里只是提供一个思路,抛砖引玉。

    关于滑动验证码

    演示项目所用到的滑动验证码的实现相对简单,整个交互过程主要包含以下步骤:

    • 服务端将背景图片和拼图图片合并为一张图片,并记录下拼图在背景图中的x 坐标,然后将拼好图片和单独的拼图图片返回给客户端
    • 客户端实现单片拼图在背景图上拖动的动画效果,并在用户完成拖动动作后,将当前拼图所处位置的坐标数据加密后返回给服务端
    • 服务端解密数据并比较客户端返回的x 坐标数据并与之前保存的x 坐标数据进行比较,允许小范围内的误差

    实现原理

    基于以上的验证码实现,本例子通过以下方式实现对验证码拼图在背景图中的定位(其他步骤较为简单,不做考虑):

    • 利用opencv库中提供的边界查找函数(cv2.findContours)提取单片拼图边缘轨迹并构造成一个二维矩阵(算子)
    • 利用 高斯模糊算子( cv2.GaussianBlur )和 Canny 边缘检测算子( cv2.Canny )对背景图进行处理,凸显出拼图在图片中的边缘
    • 用拼图轨迹算子在处理后的背景图上进行 互相关操作,所得最大(小)值的位置就是拼图在背景图中的坐标

    其他问题

    拼图的定位只是破解滑动验证码的一个中间环节,想要破解一个好的验证码产品除了定位拼图在整个图片中的位置外,可能还有以下几个问题需要考虑:

    • 从服务端获取的背景图可能是经过加密的(可以阅读 js 源码获得恢复图片的算法)
    • 返回给服务端的参数一般是经过加密处理的(可以阅读 js 源码理解算法)
    • 服务端可能会对用户滑动行为的移动轨迹对用户进行校验(可以尝试通过 selenium 等工具模拟拖动行为,或者积累真实的拖动数据后学习规律并通过 js 源码获得构造数据的算法)
    5 条回复    2017-06-30 09:46:31 +08:00
    misaka19000
        1
    misaka19000  
       2017-06-29 17:58:35 +08:00
    这种验证的核心是不是对滑动轨迹的坐标进行计算,以此来进行 robot 判断?
    hanbing135
        2
    hanbing135  
       2017-06-29 18:07:32 +08:00 via Android
    完全看不懂 这玩意不能用机器学习训练出来吗
    chxj1992
        3
    chxj1992  
    OP
       2017-06-29 18:19:34 +08:00 via Android
    @misaka19000 对,我觉得那个也是一个重点,但如果不是用第三方(极验那种)提供的实现,自己也比较难实现对轨迹的校验,所以这里只讨论了定位拼图位置的问题
    chxj1992
        4
    chxj1992  
    OP
       2017-06-29 18:23:06 +08:00 via Android
    @hanbing135 之前也想过,如果用深度学习的方法,首先需要大量的训练数据,并且如果以背景图的定位点作为输出结果来分类,训练难度也比较大。还有就是如果背景图会变化,深度学习的方式也很受影响。边缘检测在这些方面要好得多。对机器学习了解不多,说的不对请指正哈
    NaVient
        5
    NaVient  
       2017-06-30 09:46:31 +08:00
    楼主的想法很赞,给人的启发也挺大的,Mark了改天试下
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     898 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 21:28 PVG 05:28 LAX 14:28 JFK 17:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86