验证码破解实战一例

      年前有一段时间看了篇“如何识别高级的验证码”的文章,里面所提到的很多东西都是我平时所接触所用到的,于是乎就拿百度贴吧的验证码来练了练手。百度贴吧的验证码如下图所示

百度贴吧验证码

捣鼓了一两天的时间,对于手动分割好的单个字符的识别准确率倒是不低,不过始终没能很好的解决粘连字符的分割问题,后来就放下了。

 

      这两天一同学让帮忙破解一网站的验证码,瞅了下是比较传统的数字验证码,而且无粘连、扭曲、倾斜,于是就开始着手破解了。

 

      要识别的验证码如下图所示:

verify1         verify          verify          verify

 

从上面的验证码可以看出,破解的工作无需考虑字符的分割问题,而只需将精力花在背景的去除上。乍一看,每个字符周围的背景杂点都跟字符的颜色很接近,看上去不太容易过滤调背景杂点而只保留字符本身,实际上做起来也不容易。起初考虑过几种阈值化处理操作,可处理后的结果一点也不理想。几次尝试失败之后,考虑到此种验证码主要是在前景与背景的颜色上做文章,于是我打算分析验证码的颜色分布直方图,看能不能找出突破口。由于每个字符周围的杂点颜色跟该字符的颜色相关,而与其他字符的颜色无关,所以我接下来的颜色直方图的分析都只是针对分割后的单个字符。

 

      就拿verify举例吧,分割后的每个字符所对应的颜色直方图如下图所示:

 

6   

↓↓                                            6_hist                                                   

 

 

4

 ↓↓

4

 

 

5

↓↓

5

 

 

4

↓↓

4

 

 

画出每个字符的颜色分布直方图之后,一眼便看出了验证码背后存在某种规律。进一步分析可得知,直方图左侧孤立的小块区域正是字符本身的颜色,而右侧的大块区域则全是背景杂色,因此只要我们得出直方图左侧块的颜色范围,便可去除非字符本身的杂点,至于这个范围的获取想必不会有人会认为是难事。

 

      去除背景并进行图像二值化后就会得到下图所示的字符图片:

6 -> 6        4 -> 4         5 -> 5        4 -> 4

接下来要做的事情便是识别这些无背景杂点的二值图像字符,方法有很多,我用的是机器学习的方法,背景去除成功的情况下的识别率基本接近于100%。

 

 

       最后给出该破解的效果演示程序:效果演示程序

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值