您的位置:首页 > 其它

验证码破解的方法,简单验证码破解演示(转)

2010-10-21 22:04 302 查看

验证码破解的方法,简单验证码破解演示(转)





对于复杂的验证码,位置随机、扭曲、模糊、干扰项、
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

可以根据需要做出微调

本例采用黑白化公式来黑白化。

/**

* 将一个像素点转为白色或者黑色。

*

* @param pixel

* @return 转换后的像素点(黑/白)

*/

public

static

int
pixelConvert(
int
pixel) {

int
result =
0
;

//获取R/G/B

int
r = (pixel >>
16
) &
0xff
;

int
g = (pixel >>
8
) &
0xff
;

int
b = (pixel) &
0xff
;

//默认黑色

result = 0xff000000
;

int
tmp = r * r + g * g + b * b;

if
(tmp >
3
*
128
*
128
) {

//白色,全F

result += 0x00ffffff
;

}

return
result;

}

/**
* 将一个像素点转为白色或者黑色。
*
* @param pixel
* @return 转换后的像素点(黑/白)
*/
public static int pixelConvert(int pixel) {
int result = 0;
//获取R/G/B
int r = (pixel >> 16) & 0xff;
int g = (pixel >> 8) & 0xff;
int b = (pixel) & 0xff;
//默认黑色
result = 0xff000000;
int tmp = r * r + g * g + b * b;
if (tmp > 3 * 128 * 128) {
//白色,全F
result += 0x00ffffff;
}
return result;
}


然后根据获取到的模板,在每次比对的时候将图片净化,然后比对
结果如下





其实这上面的验证码是支付宝之前的验证码,现在已经换了新的验证码了,所以老的验证码也无所谓了,我就公布出老的破解方法

具体的实现逻辑可以看下代码,文章中的两个例子都有涉及到,仅供学习讨论使用,禁止一切的非法活动
有对效验码有研究的朋友可以一块交流。

示例代码下载
ps:csdn上传的审核太慢了。等不及了就放javaeye了
CSDN的链接终于好了也放上来,CSDN下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: