- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
原原文文地地址址:/tips/13043
Author:crystal_lz@伏伏宸宸安安全全实实验验室室
注:此文章只适合简单验证码,最后也将编写的工 附上以及关键部分代码和使用说明文档
0x00 简简介介
虽然验证码发展到如今有许多人类都难以识别的状态了,但人有部分老系统使用的验证码异常的简单。还有一些网站
由于程序员本身的素质或者缺乏相关图像相关的知识,所以并没有自己写验证码的生成程序,而是直接在网上随便复
制粘贴一个Demo级别的代码来用,以达到网站有验证码的目的,而忽略了验证码的强弱性,导致很多网站的验证码都
是爆款弱验证码
如:
还有更傻缺的比如:
直接就能复制的...这种是完全不知道验证码的意义或者为了应付而做的验证码
0x01 处处理理方方式式
好吧忽略上面的图继续说
对于那些简单验证码他们的共同点是
1. 标准字体
2. 背景单简单甚至纯色没有背景
3. 字体并没有粘贴在一起
而本文讨论的就是这类的验证码。对于那种连背景都没有的纯色、标准字体、没有黏贴的那种再简单不过了直接就是
100%的识别率
这种就不讨论了 下面来看看wooyun的验证码
Wooyun的验证码有两种状态
一种是白色文字深色背景 一种是黑色文字浅色背景
如果只有一种无论是那种设定一个阀值都能很好的二值化 但现在的情况却是有两种 所以我能想到的最简单的方式 那
好 我就给出两个阀值 对于黑色文字我就用一个较小一点的阀值 对于白色文字我就用一个较大一点的阀值
但是这样还是会出现一个问题 白色文字二值化后背景黑色文字白色 而黑色文字二值化后背景白色文字黑色 就像下面
一下
可以看出上面我左边框选区域一切正常 而右边却出了问题 那是因为在我写程序的时候我认为二值化后文字都是黑色背
景是白色 所以我就把黑色区域当作文字来框选就看到了如上的效果 所以说这是一个问题 不仅要二值化二值化后还要
到底白色是文字还是黑色是文字
于是我又想到一种办法 通常情况下一张图上背景的面积都会大于文字所占用的面积 所以在二值化的同时我还做了一件
事情 二值化的同时记录下黑点个数和白点个数 如果黑点的个数大于了白点的个数那么我就把黑白反色一下让黑色像素
点变成最少 这样再把黑色像素当作文字处理
这样做还有一个问题就是 我应该怎么知道什么时候应该使用那一个阀值来二值化 当然办法可以有很多 比如当图像上
深色像素多余浅色像素的时候使用较大阀值 否则相反 不过我并不是这样做的
在工 上我提供了一个框让用户输入验证码的字符个数 这样的话我对体统的阀值挨个遍历 二值化后去识别区域 如果
框出来的区域个数是有问题的 那么就换下一个阀值 如果所有阀值都遍历完了还是有问题 那么这验证码确实也是超出
这个工 的范围了 因为这个工 的目的是通用 对于那些需要单独写代码来识别的不在他的能力范围内
在这之前一些验证码可能还需要一些处理比如很常见的一些验证码有边框的
左边是没有裁剪的边框一起被二值化成为了黑色 然后拆字就悲剧了 右边是裁剪掉了一个像素的把边框去掉了 然后就
一切正常了 这种情况就不说了 都懂的
还有一种比较复杂的情况 因为二值化并不是万能的 并不是说什么验证码一进行二值化后文字和背景就出来了 下面这
张图是我以前程序需要做的百度推广的验证码识别
上面这张图不怎么能看到效果 因为都是好几年前的事情了 验证码连接访问已经是500了 这张图都是测试的时候的截图
我描述一下情况吧 上面的验证码 首先有边框 文字 干扰线 即使能把边框裁剪掉也找不到一个合适的阀值来把线条和文
字分离 很简单因为他的线条的颜色比文字的颜色深 如果我的阀值太小 那么我的文字就没有了 只会剩下一些线条在哪
里
这图为上面那张图片上验证码的NZ两个字符在ps中放大的效果(尽管上面图像原来并非保存的png格式已经失真 但大概
还是能看到点什么的) 我也去翻了翻以前的代码来看 当初我二值化的时候并非直接二值化的 在二值化之前还单独对
RGB进行了判断 代码截图如下
别百度推广的验证码是我做的第一个验证码识别程序 所以我一直记得很清楚 不是一个二值化就能搞定的 所以说在这
个工 中我也加入了同样可以单独处理RGB的功能
由于百度的这个验证码已经访问不了了 所以我找了一个同样有线条的验证码 但是这个验证码线条颜色比文字颜色浅
所以我就用默认的127作为阀值 假设二值化无法搞定
用127阀值上面线条一起被黑化了 但是图片中文字颜色接近黑色而线条颜色却要浅一点 所以判断的时候 可以认为RGB
的平均值大于20的就视为背景 就可以这样干
然后效果就成了这样
这样线条就被处理掉了 不过这个验证
文档评论(0)