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)

  • 相关阅读:
    Reactive Extensions (Rx) 入门(5) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(4) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(3) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
    Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要
    Xamarin NuGet 缓存包导致 already added : Landroid/support/annotation/AnimRes 问题解决方案
    Android 系统Action大全
    Xamarin Forms 实现发送通知点击跳转
    如何理解灰度发布
    推荐一款分布式微服务框架 Surging
  • 原文地址:https://www.cnblogs.com/ivanyb/p/2262890.html
Copyright © 2011-2022 走看看