渔人码头

天行健,君子以自强不息。地势坤,君子以厚德载物。
posts - 12, comments - 16, trackbacks - 0, articles - 43
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

破解图片验证码限制的一般思路

Posted on 2007-01-13 16:59 Fisher 阅读(1326) 评论(0)  编辑  收藏 所属分类: Java应用
 相信大家都有在论坛灌水的经历吧?但是如果你连续发表统一内容的东西在论坛中,不久论坛的整个板块就全是你发表的信息了,其他信息全被挤在了后面。假设你发表的信息够多,版主都删不完时,那么这个论坛基本就报废了!其他的商业论坛也意识到了防止恶意灌水的重要性,纷纷使用了一些防止恶意灌水的措施,有发贴间隔时间的限制、同一IP地址的发贴数限制、内容不能重复等,但是这些都不是今天的重点,由于论坛使用的是一个公用发贴表单,需要突破唯一的难点是验证码。(为了防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试或是防止不断提交某网络信息而采用的一种网络通行方式。随机生成字符信息放入图片中,防止计算机直接识别。比如招商银行的网上个人银行,腾讯的QQ社区等等)

  验证码分为如下几类:数字型、字符型、符号型、综合型。

  一般验证码属于数字型的,不过有的图片中生成了不少彩色和黑白的噪音点(指验证图片上的斑点)。那么我们应该怎么去识别呢?传统的验证码识别方式很简单,由于数字的位置是固定的,所以我们只需要提取每一幅数字的图片(没有噪音点的)然后把每一个特殊数字独有的象素位置记录下来,然后在网络上提取需要破解的特征码,祛除噪音点,对其位置和记录位置进行比对,那就是么就能确定相应的数字了。

  总结一下传统的就是:

  1.先分析验证码,前景颜色是否不定

  2.然后把验证码的宽度/验证码文字个数,比如一验证码下载后宽度为60,有4个数字,那么就60/4=15,然后保存每个字,如果只有数字保存0-9数字到位图文件,如果英文那更麻烦点,0-9,A-Z都要保存到位图,位图的前景色都不变,保持一种颜色,背景随便你改不改

  3.如果前景要变则将文字统一为同种颜色,每个数字0-9的点阵都有个公共点,取该公共点颜色然后把前景全部统一成一种颜色,比如白色{255,255,255},位图的结构是BGR,而不是RGB

  4.然后进行比较,如果验证码的一点为白色,第2步保存的位图同一点也是白色,那么频率增加1

  5.最后频率最高的就是验证码了!

  接下来要做的就是做个post程序了,这个太简单了,代码你就自己写吧!不过也要做到如下细节:做成多线程程序进行发贴,不然程序会失去响应的。最好是可以导入大量的代理IP的,然后就是发贴的内容最后加上几个随机字符,这样可以防止重复贴的过滤!最重要的,只是做测试,发贴量不要太多、不要乱发广告贴!

  其实上述方法已经不是只是对验证码进行识别了,完全可以用到现实生活中去,比如说手写体识别、车牌识别等等,但是现实生活中我们还要进行更多的加工,比如说圆形检测,多边形检测等等。所以说从网络安全技术中,也有很多东西能造福社会,还等待我们继续创造!