zoukankan      html  css  js  c++  java
  • 如何识别高级的验证码

    原文:http://security.ctocio.com.cn/securitycomment/290/8182290.shtml

    摘录一部分,其余的请看原文

    五、高级验证码的破解分析

      时间关系,我简单介绍如何利用图像处理和模式识别技术,自动识别比较高级的验证码。

      (以风头正劲的Google为例)

          1)至少从目前的AI的发展程度看,没有简单的做法能自动处理各种不同的验证码,即使能力很强,那么系统自然也十分复杂强大。所以,要想在很简单的算法实现比较高级的验证码破解,必须分析不同验证码算法的特点:

      作为一般的图像处理和计算机视觉,会考虑色彩,纹理,形状等直接的特征,同时也考虑直方图,灰度等统计特征,还考虑FFT,Wavelet等各种变换后的特征。但最终目标都是Dimension Reduction(降维)然后利于识别,不仅仅是速度的考虑。从图像的角度看,很多系统都考虑转换为灰度级甚者黑白图片。

      Google的图片可以看出,颜色变化是虚晃一枪,不存在任何处理难度。难度是字体变形和字符粘连。

      如果能成功的分割字符,那么后期识别无论是用SVM等分类算法,还是分析笔顺比划走向来硬识别,都相对好做。

      2)图像处理和粘连分割

      代码中的part1目录主要完成图像预处理和粘连字符分割

      001:将图像从jpg等格式转换为位图便于处理

      002:采用Fix/Adaptive的Threshold门限算法,将图片Bin-Value二值化。(可用003算法)

      003:采用OSTU分水岭算法,将图片Bin-Value二值化。(更通用,大部分时候效果更好)

      005:获取ROI感兴趣的区域。

      006:Edge Trace边缘跟踪。

      007:Edge Detection边界检测。

      008:Thin细化去骨架。

      009:做了一些Tidy整理。(这个一般要根据特定的Captcha算法调整)

      010:做切割,注意图片中红色的交叉点。

      011:将边缘检测和骨干交叉点监测的图像合并。(合并过程可以做分析: 比如X坐标偏移门限分析,交叉点区域纹理分析,线条走势分析,等等各种方法,找出更可能的切分点和分离后部件的组合管理。)

          代码:(代码质量不高,从其他项目拷贝过来,简单修改的。)

      查看代码(./pstzine_09_01.txt)

      注:在这里,我们可以看到,基本的部件(字母是分割开了,但可以造成统一字母的被切割成多个Component。 一种做法是:利用先验知识,做分割; 另外一种做法是,和第二部分的识别结合起来。 比如按照从左至右,尝试增加component来识别,如果不能识别而且component的总宽度,总面积还比较小,继续增加。 当然不排除拒识的可能性。)

      3)字符部件组合和识别。

      part2的代码展示了切割后的字母组合,和基于svm的字符识别的训练和识别过程。

      Detection.cpp中展示了ImageSpam检测过程中的一些字符分割和组合,layout的分析和利用的简单技术。 而Google的验证码的识别,完全可以不用到,仅做参考。

      SVM及使用:

      本质上,SVM是一个分类器,原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方式来组合成一个多类分类的分类器。 天生通过核函数的使用支持高维数据的分类。从几何意义上讲,就是找到最能表示类别特征的那些向量(支持向量SV),然后找到一条线,能最大化分类的Margin。

      libSVM是一个不错的实现。

      训练间断和识别阶段的数据整理和归一化是一样的。这里的简单做法是:

      首先:

          #define SVM_MAX +0.999
      #define SVM_MIN +0.001

      其次:

      扫描黑白待识别字幕图片的每个像素,如果为0(黑色,是字母上的像素),那么svm中该位置就SVM_MAX,反之则反。

      最后:

      训练阶段,在svm的input的前面,为该类打上标记,即是那一个字母。

      识别阶段,当然这个类别标记是SVM分类出来。

      注意:

      如果是SVM菜鸟,最好找一个在SVM外边做了包装的工具,比如样本选择,交叉验证,核函数选择这些,让程序自动选择和分析。

      代码:通过ReginGrowth来提取单个单个的字符,然后开始识别。

      查看代码(./pstzine_09_02.txt)

  • 相关阅读:
    HDU 4870 Rating(高斯消元 )
    iOS开发者账号详细介绍
    iOS之Block
    CocoaPods 安装和使用
    搭建自己的局域网服务器
    MarkDown语法收集
    正则表达式参考表
    iOS企业级应用打包与部署
    iOS开发之代码加载方式进入APP的界面
    shell脚本小Demo
  • 原文地址:https://www.cnblogs.com/ivanyb/p/2262890.html
Copyright © 2011-2022 走看看