简略验证码辨认及东西编写思路
Author:crystal_lz@伏宸安全实验室
注:此文章只适宜简略验证码,最终也将编写的东西附上以及要害部分代码和运用说明文档
0x00 简介
虽然验证码发展到现在有许多人类都难以辨认的状况了,但人有部分老体系运用的验证码反常的简略。还有一些网站由于程序员自身的本质或许缺少相关图画相关的常识,所以并没有自己写验证码的生成程序,而是直接在网上随意仿制张贴一个Demo等级的代码来用,以到达网站有验证码的意图,而疏忽了验证码的强弱性,导致许多网站的验证码都是爆款弱验证码
如:
还有更傻缺的比方:
直接就能仿制的...这种是彻底不知道验证码的含义或许为了敷衍而做的验证码
0x01 处理方法
好吧疏忽上面的图持续说
关于那些简略验证码他们的共同点是
规范字体 布景单简略乃至纯色没有布景 字体并没有张贴在一同
而本文评论的便是这类的验证码。关于那种连布景都没有的纯色、规范字体、没有黏贴的那种再简略不过了直接便是100%的辨认率
这种就不评论了 下面来看看wooyun的验证码
Wooyun的验证码有两种状况
一种是白色文字深色布景 一种是黑色文字淡色布景
假如只要一种无论是那种设定一个阀值都能很好的二值化 但现在的状况却是有两种 所以我能想到的最简略的方法 那好 我就给出两个阀值 关于黑色文字我就用一个较小一点的阀值 关于白色文字我就用一个较大一点的阀值
可是这样仍是会呈现一个问题 白色文字二值化后布景黑色文字白色 而黑色文字二值化后布景白色文字黑色 就像下面一下
能够看出上面我左面框选区域一切正常 而右边却出了问题 那是由于在我写程序的时分我以为二值化后文字都是黑色布景是白色 所以我就把黑色区域当作文字来框选就看到了如上的作用 所以说这是一个问题 不只要二值化二值化后还要究竟白色是文字仍是黑色是文字
所以我又想到一种方法 通常状况下一张图上布景的面积都会大于文字所占用的面积 所以在二值化的一同我还做了一件工作 二值化的一同记录下黑点个数和白点个数 假如黑点的个数大于了白点的个数那么我就把是非反色一下让黑色像素点变成最少 这样再把黑色像素当作文字处理
这样做还有一个问题便是 我应该怎样知道什么时分应该运用那一个阀值来二值化 当然方法能够有许多 比方当图画上深色像素剩余淡色像素的时分运用较大阀值 不然相反 不过我并不是这样做的
在东西上我供给了一个框让用户输入验证码的字符个数 这样的话我对体统的阀值挨个遍历 二值化后去辨认区域 假如框出来的区域个数是有问题的 那么就换下一个阀值 假如一切阀值都遍历完了仍是有问题 那么这验证码的确也是超出这个东西的范围了 由于这个东西的意图是通用 关于那些需求独自写代码来辨认的不在他的才能范围内
在这之前一些验证码或许还需求一些处理比方很常见的一些验证码有边框的
左面是没有裁剪的边框一同被二值化成为了黑色 然后拆字就悲惨剧了 右边是裁剪掉了一个像素的把边框去掉了 然后就一切正常了 这种状况就不说了 都懂的
还有一种比较复杂的状况 由于二值化并不是全能的 并不是说什么验证码一进行二值化后文字和布景就出来了 下面这张图是我曾经程序需求做的百度推广的验证码辨认
上面这张图不怎样能看到作用 由于都是好几年前的工作了 验证码衔接拜访现已是500了 这张图都是测验的时分的截图
我描述一下状况吧 上面的验证码 首要有边框 文字 搅扰线 即便能把边框裁剪掉也找不到一个适宜的阀值来把线条和文字别离 很简略由于他的线条的色彩比文字的色彩深 假如我的阀值太小 那么我的文字就没有了 只会剩余一些线条在哪里
这图为上面那张图片上验证码的NZ两个字符在ps中扩大的作用(虽然上面图画本来并非保存的png格局现已失真 但大约仍是能看到点什么的) 我也去翻了翻曾经的代码来看 最初我二值化的时分并非直接二值化的 在二值化之前还独自对RGB进行了判别 代码截图如下
[1] [2] [3] 黑客接单网