对于复杂的验证码,位置随机、扭曲、模糊、干扰项、gif验证码、汉字等。。。。
对于复杂背景的,但是字体是统一颜色的,我们可以统计每个像素点的值,然后统计出峰值的4个,之后把峰值之外的点全部转为白色,峰值的4种色转为黑色。(具体情况具体定)
大部分验证码都是可以用黑白的方法把底纹给去掉的,比如,这个大家常见的效验码,去了底纹之后的效果为上图,可以看到还是有一些干扰点,我们可以用代码把这些孤立的干扰点去掉(去的力度可以自己确定),去了干扰点的效果为上图,接下来这些字符都是很规整的字符了
看上图优化后的目标,这两个6是一样的,加上一些补偿,提取到模板,接下来就很容易破解了,可以看到左图的M有些模糊了,其实能达到90%的概率就可以了
如果遇到gif类型的效验码,忘记哪个网站了,但是我确定我见过,这种校验码其实也类似,关键就是从gif中提取到效验码图片,我们可以提取帧数最长的一张,取到之后过程就也一样了,去除干扰,提取模板或者学习,比对破解
由于生成图片对服务器来说是个“体力活”,并且效验码的访问量是很大的,并且有很多时候由于用户网速等原因会不停的请求效验码刷新,所以很多看起来很牛的效验码其实是固定生成好的,比如每天0点生成N个,然后供第二天使用,这类效验码就是每天不停的人工输入,然后供当天使用,听起来很雷,但是国内确实有这样的做法。
还有种更雷的做法,把效验码提取然后通过程序集中的发布出去,让一些想赚钱的人来输入,1分钱一张(或者更低)放心,肯定有人愿意做的。。。
获取到去了噪点的图片之后(有些需要做补偿)找出模板,由于固定的位置直接去固定位置的图片即可
这里仅提供一种验证码破解的标准示例,共大家研究学习
这种做法仅对规则的效验码有效,复杂的效验码无效,但是总体的步骤是一致的。
通过这组验证码大家会看到一些规律,1。这种验证码字体很规则,2。每位数字的位置都是固定的。我们称之为标准效验码,所有的干扰项也就是背景颜色有不同的深灰色干扰纹。字体没有任何的扭曲、位置变换。
思路:截取每个位置上的10位数字图片,然后将图片都黑白化,然后用模板进行比对。
图片黑白化原理:
获取到R、G、B的值,然后根据黑白化的公式R*R +G*G +B*B < 3*128*128为黑色,否则为白色,这种方法对于绝大多数是有效的。
还有一种是根据灰度图,然后在根据灰度来确定是黑还是白。
像素点灰度的公式:
1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*28+G*151+B*77)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;
参考:http://baike.baidu.com/view/1184366.html
可以根据需要做出微调
本例采用黑白化公式来黑白化。
- /**
- *将一个像素点转为白色或者黑色。
- *
- *@parampixel
- *@return转换后的像素点(黑/白)
- */
- publicstaticintpixelConvert(intpixel){
- intresult=0;
- //获取R/G/B
- intr=(pixel>>16)&0xff;
- intg=(pixel>>8)&0xff;
- intb=(pixel)&0xff;
- //默认黑色
- result=0xff000000;
- inttmp=r*r+g*g+b*b;
- if(tmp>3*128*128){
- //白色,全F
- result+=0x00ffffff;
- }
- returnresult;
- }
然后根据获取到的模板,在每次比对的时候将图片净化,然后比对
结果如下
其实这上面的验证码是支付宝之前的验证码,现在已经换了新的验证码了,所以老的验证码也无所谓了,我就公布出老的破解方法
具体的实现逻辑可以看下代码,文章中的两个例子都有涉及到,仅供学习讨论使用,禁止一切的非法活动
有对效验码有研究的朋友可以一块交流。