`
ljl_xyf
  • 浏览: 635998 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何识别高级验证码

    博客分类:
  • c#
阅读更多

   一、验证码的基本知识

  1. 验证码的主要目的是强制人机交互来抵御机器自动化攻击的。

  2. 大部分的验证码设计者并不得要领,不了解图像处理,机器视觉,模式识别,人工智能的基本概念。

  3. 利用验证码,可以发财,当然要犯罪:比如招商银行密码只有6位,验证码形同虚设,计算机很快就能破解一个有钱的账户,很多帐户是可以网上交易的。

  4. 也有设计的比较好的,比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证码虽然难,但算不上好。

  二、人工智能,模式识别,机器视觉,图像处理的基本知识

  1)主要流程:

  比如我们要从一副图片中,识别出验证码;比如我们要从一副图片中,检测并识别出一张人脸。 大概有哪些步骤呢?

  1.图像采集:验证码呢,就直接通过HTTP抓HTML,然后分析出图片的url,然后下载保存就可以了。 如果是人脸检测识别,一般要通过视屏采集设备,采集回来,通过A/D转操作,存为数字图片或者视频频。

  2.预处理:检测是正确的图像格式,转换到合适的格式,压缩,剪切出ROI,去除噪音,灰度化,转换色彩空间这些。

  3.检测:车牌检测识别系统要先找到车牌的大概位置,人脸检测系统要找出图片中所有的人脸(包括疑似人脸);验证码识别呢,主要是找出文字所在 的主要区域。

  4.前处理:人脸检测和识别,会对人脸在识别前作一些校正,比如面内面外的旋转,扭曲等。我这里的验证码识别,“一般”要做文字的切割

  5.训练:通过各种模式识别,机器学习算法,来挑选和训练合适数量的训练集。不是训练的样本越多越好。过学习,泛化能力差的问题可能在这里出 现。这一步不是必须的,有些识别算法是不需要训练的。

  6.识别:输入待识别的处理后的图片,转换成分类器需要的输入格式,然后通过输出的类和置信度,来判断大概可能是哪个字母。识别本质上就是分 类。

  2)关键概念:

  图像处理:一般指针对数字图像的某种数学处理。比如投影,钝化,锐化,细化,边缘检测,二值化,压缩,各种数据变换等等。

  1.二值化:一般图片都是彩色的,按照逼真程度,可能很多级别。为了降低计算复杂度,方便后续的处理,如果在不损失关键信息的情况下,能将图片 处理成黑白两种颜色,那就最好不过了。

  2.细化:找出图像的骨架,图像线条可能是很宽的,通过细化将宽度将为1,某些地方可能大于1。不同的细化算法,可能有不同的差异,比如是否更 靠近线条中间,比如是否保持联通行等。

  3.边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地方。可能通过一个固定的门限值来判断,也可能是自适应的。门 限可能是图像全局的,也可能是局部的。不能说那个就一定好,不过大部分时候,自适应的局部的门限可能要好点。被分析的,可能是颜色,也可能是灰度图像的灰 度。

  机器视觉:利用计算机来模式实现人的视觉。 比如物体检测,定位,识别。按照对图像理解的层次的差别,分高阶和低阶的理解。

  模式识别:对事物或者现象的某种表示方式(数值,文字,我们这里主要想说的是数值),通过一些处理和分析,来描述,归类,理解,解释这些事物, 现象及其某种抽象。

  人工智能:这种概念比较宽,上面这些都属于人工智能这个大的方向。简单点不要过分学院派的理解就是,把人类的很“智能”的东西给模拟出来协助生 物的人来处理问题,特别是在计算机里面。

 

 

 三、常见的验证码的破解分析

  以http://libcaca.zoy.org/wiki/PWNtcha 这 里PWNtcha项目中的资料为例分析,各种验证码的破解。(方法很多,仅仅从我个人乍看之下觉得可行的方法来分析)

  1)Authimage

  

      使用的反破解技巧:

  1.不连续的点组成字符

  2.有一定程度的倾斜

  设计不好的地方:

  1.通过纵横的直方图投影,可以找到字幕区域

  2.通过Hough变换,适当的参数,可以找到近似的横线,可以做倾斜矫正

  3.字符串的倾斜式面内的,没有太多的破解难度

  4.字母宽度一定,大小一定

  2)Clubic

  

      使用的反破解技巧:

  1.字符是手写体

  设计不好的地方:

  1.检测切割阶段没有任何技术含量,属于设计的比较丑的

  2.只有数字,而且手写体变化不大

  3.表面看起来对识别阶段有难度,仔细分析,发现几乎不用任何高级的训练识别算法,就

  固定的招某些像素点是否有色彩就够了

  3)linuxfr.org

  

      使用的反破解技巧:

  1.背景颜色块

  2.前景的横线或矩形

  设计不好的地方:

  1.背景色是单一色块,有形状,通过Region-Growth区域增长来很容易把背景给去掉

  2.前景色是标准的线条,色彩单一

  3.字母无粘连

  4.都是印刷体

  4)Ourcolony

  

      使用的反破解技巧:

  1.设计的太低级,不屑于去评价

  设计不好的地方:

  1.这种验证码,设计的最丑,但还是能把菜鸟搞定,毕竟学计算机的少,搞这个破解的更少,正所谓隔行如隔山

  5)LiveJournal

  

      使用的反破解技巧:

  1.这个设计略微好点,使用个随机噪音,而且作为前景

  2.字母位置粗细都有变化

  设计不好的地方:

  1.字母没有粘连

  2.噪音类型单一

  3.通过在X轴的直方图投影,能准确分割字幕

  4.然后在Y周作直方图投影,能准确定位高度

  5.识别阶段,都是印刷体,简单地很

 

 

   四、网上的一些高级验证码

  1)ICQ

  

      2)IMDb

  

      3)MS MVPS

  

  4)MVN Forum

  

  这些类型是被很多人认为比较难得类型,分析一下可以发现,字符检测,定位和分割都不难。 唯一影响识别率的是IMDBb和MVPS这两类,字体变形略大。

  总体来说,这些类型的破解也不难,很容易做到50%以上的识别率。

 

 

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

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

  (以风头正劲的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)

 

   六、对验证码设计的一些建议

  1.在噪音等类型的使用上,尽力让字符和用来混淆的前景和背景不容易区分。尽力让坏人(噪音)长得和好人(字母)一样。

  2.特别好的验证码的设计,要尽力发挥人类擅长而AI算法不擅长的。 比如粘连字符的分割和手写体(通过印刷体做特别的变形也可以)。 而不要一味的去加一些看起来比较复杂的噪音或者其他的花哨的东西。即使你做的足够复杂,但如果人也难识别,显然别人认为你是没事找抽型的。

  3. 从专业的机器视觉的角度说,验证码的设计,一定要让破解者在识别阶段,反复在低阶视觉和高阶视觉之间多反复几次才能识别出来。 这样可以大大降低破解难度和破解的准确率。

  七、郑重申明

  1.这个问题,本身是人工智能,计算机视觉,模式识别领域的一个难题。作为破解者来说,是出于劣势地位。要做的很好,是很难得。总体来说,我走 的是比较学院派的线路,能真正的破解难度比较高的验证码,不同于网上很多不太入流的破解方法。我能做的只有利用有限的知识,抛砖引玉而已。很多OCR的技 术,特别是离线手写体中文等文字识别的技术,个人了解有限的很,都不敢在这里乱写。

  • 大小: 4.8 KB
  • 大小: 2.5 KB
  • 大小: 4.3 KB
  • 大小: 3.7 KB
  • 大小: 7.5 KB
  • 大小: 14.6 KB
  • 大小: 6.2 KB
  • 大小: 13.8 KB
  • 大小: 4.2 KB
  • 大小: 20.1 KB
分享到:
评论

相关推荐

    使用python+robot framework识别图片验证码

    在IT行业中,自动化测试是提升效率的关键之一,特别是在网页应用中,验证码的识别是一个常见的挑战。本篇将详细讲解如何使用Python和Robot Framework相结合来识别图片验证码,以及如何利用PIL库进行图像处理,以及...

    高级验证码识别

    在本项目中,我们关注的是"高级验证码识别",这是一种涉及图像处理、模式识别和机器学习的技术。下面将详细讨论相关知识点。 首先,验证码的类型主要有基于图像的字符验证码、数学问题验证码、滑动验证码、点击...

    验证码高级识别源码-PHP

    验证码高级识别源码-PHP是基于PHP编程语言实现的一种用于图像验证码识别的技术。在网络安全领域,验证码被广泛用于防止自动化的机器人程序进行恶意操作,如批量注册、恶意投票等。这个源码提供了一种方法来识别这些...

    识别网站高级的验证码

    ### 识别网站高级的验证码 #### 一、验证码的基本知识 验证码(CAPTCHA)是一种用于区分用户是人类还是计算机程序的技术。它主要用于防止自动化软件进行恶意活动,如垃圾邮件发送、票务抢购等。 1. **目的**: -...

    PHP自动识别验证码

    "提交.zip"则可能是整个验证码识别系统的整合,包括了输入图像的处理、字符识别和结果的校验与提交。这个版本可能会包含一个完整的PHP验证码识别脚本,能够处理用户提交的验证码图像,并返回识别结果。 请注意,...

    Demo.zip_DEMO_识别验证码_验证码_验证码识别_验证码降噪

    传统方法可能使用支持向量机(SVM)、K近邻(KNN)等算法,而现在更流行的是基于卷积神经网络(CNN)的模型,它们能够自动学习到图像的高级特征,对于验证码识别表现出很高的准确率。 DEMO中的“Demo”文件可能包含...

    Java简单验证码识别(附源码)

    总的来说,Java验证码识别不仅加深了对图像处理和模式识别的理解,也为后续学习更高级的机器学习和深度学习技术打下了基础。通过实践这个项目,你可以掌握实际问题的解决思路,提高编程能力,并且能够灵活运用所学...

    VB识别数字验证码的小实例.rar_VB识别_数字识别_验证码识别

    在这个VB识别数字验证码的小实例中,我们探讨了一个利用Visual Basic(VB)编程语言来解析和识别含有纯数字的四位验证码图像的技术。...因此,对于更复杂验证码的识别,可能需要采用更高级的图像处理和机器学习技术。

    高级验证码识别技巧

    高级验证码识别技巧,做了一个帮助文件,适合本地收藏

    OCR识别验证码技术.zip

    因此,OCR系统需要具备高级的图像处理和模式识别能力。例如,使用深度学习模型如卷积神经网络(CNN)可以训练出更强大的识别能力,通过大量标注数据来学习各种扭曲和变形的字符。 VC,可能是Visual C++的简称,这是...

    java识别验证码 仅限字母数字 附带bmp图片

    然而,如果验证码是动态生成或者有额外的复杂性(如扭曲、遮挡),那么可能需要更高级的图像处理和机器学习算法来提升识别准确率。 总的来说,Java识别验证码是一个涉及多领域知识的挑战,需要综合运用图像处理、...

    Delphi验证码图片内容识别Demo示例

    这涉及到更复杂的OCR(光学字符识别)技术,可能需要用到更高级的API功能,如区域选择、版面分析等。对于大段文字,识别可能需要处理文字排列、字体大小变化、背景干扰等问题,因此预处理和识别算法都需要更加精细。...

    基于C#语言的识别图片的验证码程序

    - **OCR(光学字符识别)**:如果需要更高级的识别,可以使用机器学习算法,如SVM(支持向量机)或深度学习模型(如CNN,卷积神经网络)。Emgu CV提供了一些内置的OCR工具。 4. 结果整合: - 将识别到的字符按照...

    VB 简单验证码识别

    需要注意的是,简单的验证码识别可能只适用于一些基础的验证码,对于更复杂的验证码(如扭曲、背景噪声大、字符重叠等),可能需要使用更高级的深度学习技术,如卷积神经网络(CNN)进行端到端的学习。 总的来说,...

    识别验证码思路一

    因此,对于更复杂的验证码,可能需要更高级的图像处理技术和深度学习模型,如使用更复杂的CNN结构(如ResNet、VGG)或者结合RNN进行序列学习。 然而,需要注意的是,验证码识别技术的发展也引发了对隐私和安全的...

    验证码识别程序+发票标号识别案例

    reCAPTCHA是一种高级验证码系统,它利用人类用户的输入来帮助验证大量网络内容,同时也防止了机器人滥用。 实现验证码识别,一般步骤包括: 1. 图像预处理:对原始验证码图像进行灰度化、二值化、噪声去除等操作,...

    OCR识别验证码

    `jai_imageio.jar`是Java Advanced Imaging (JAI) Image I/O的jar包,JAI是Oracle提供的一个用于高级图像处理的API,它支持多种图像格式的读写和处理,对于OCR识别过程中的图像预处理可能非常有用。`clibwrapper_...

    易语言论坛验证码识别

    - 另外,随着AI技术的发展,深度学习模型如卷积神经网络(CNN)在验证码识别中也越来越常见,虽然这超出了易语言的范畴,但了解这些高级技术可以帮助提升验证码识别的准确率。 总的来说,“易语言论坛验证码识别”...

    车牌识别及验证码识别的一般思路

    但对于更复杂的验证码,如QQ验证码和Gmail验证码,通常需要更高级的方法: 1. 人工神经网络:深度学习,特别是卷积神经网络(CNN),在验证码识别中表现出色。CNN能自动学习图像特征,并进行分类。 2. 数据增强:...

Global site tag (gtag.js) - Google Analytics