验证码识别技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码识别技术相关的知识,希望对你有一定的参考价值。

如题,本人在做一个关于验证码识别的程序。要求识别的是随机英文字母+随机数字+随机颜色+随机位置+随机长度。有高手来帮帮忙哦。若是有最基础的随机数字+随机大写英文字母的四位验证码识别的程序,也给分哦。邮箱地址ningmengxinxin@163.com。急,谢谢各位!

public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException

// 验证码图片的宽度。
int width = 70;
//验证码图片的高度。
int height=36;
BufferedImage buffImg=new BufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g=buffImg.createGraphics();

//创建一个随机数生成器类。
Random random=new Random();

// 设定图像背景色(因为是做背景,所以偏淡)
g.setColor(getRandColor(180, 250));
g.fillRect(0,0,width,height);
//创建字体,字体的大小应该根据图片的高度来定。
Font font=new Font("Times New Roman",Font.PLAIN,28);
//设置字体。
g.setFont(font);

//画边框。
g.setColor(Color.BLACK);
g.drawRect(0,0,width-1,height-1);
// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
g.setColor(Color.GRAY);
for (int i=0;i<50;i++)
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);


//randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
StringBuffer randomCode=new StringBuffer();

// 设置默认生成4个验证码
int length = 4;

// 设置备选验证码:包括"a-z"和数字"0-9"
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
int size = base.length();

//随机产生4位数字的验证码。
for (int i=0;i<length;i++)
//得到随机产生的验证码数字。
int start = random.nextInt(size);
String strRand = base.substring(start, start + 1);

//用随机产生的颜色将验证码绘制到图像中。
// g.setColor(new Color(red,green,blue));
// 生成随机颜色(因为是做前景,所以偏深)
g.setColor(getRandColor(1, 100));
g.drawString(strRand,13*i+6,28);

//将产生的四个随机数组合在一起。
randomCode.append(strRand);

//将四位数字的验证码保存到Session中。
HttpSession session=req.getSession();
session.setAttribute("rand",randomCode.toString());

//禁止图像缓存。
res.setHeader("Pragma","no-cache");
res.setHeader("Cache-Control","no-cache");
res.setDateHeader("Expires", 0);

res.setContentType("image/jpeg");

//将图像输出到Servlet输出流中。
ServletOutputStream sos=res.getOutputStream();
ImageIO.write(buffImg, "jpeg",sos);
sos.close();


Color getRandColor(int fc,int bc)//给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);


这个是之前弄过的一个,可能比你的需求是简单了些,你就作为简单的参考吧
参考技术A 在C#中如何实现Form与Form之间的通信www.chinacs.net 2006-09-16 中文C#技术站
今天在该网站看到这么一篇文章: "C#如何实现两个WINFORM之间的访问". 把写的代码考下来的确能实现,不过大家不知道有没有发现一个问题. 写这篇文章的人把问题搞的更糟了. 为什么这么说呢. 请看我对这个问题的解决方法.

大家知道面向对象程序设计的一个特点是多态.,一个是封装,还一个是继承,最后这个我们这么不做多余的说明.实现方法如下:

1. 从Form 继承一个 Form1类.

2. 从Form 继承一个 Form2类.

3.在Form2类中加一个成员变量:frmParent

4.在Form2 类中加入一个重载的构造方法:public form2(Form1 Parent)frmParent=Parent;

5.在Form1中添加一个Button对象. 对应的事件代码为:



Form2 frm=new Form2(this);
frm.Show();



6.在Form2中添一个Button对象,对应事件代码为:



frmParent.Text="成败改写";



就这么简单就完成了Form与Form之间的通信. 多么简单,是吧! 希望能通过这片文章认识一些C#的高手.我也是做C#程序设计师,因为看到这那篇文章会把大家引导向误区,故而写了这么一篇.还请那位仁兄(弟)看到之后不要见怪.

口令破解之验证码识别技术探究




本篇主要针对口令破解中的验证码识别技术的研究,主要分为云打码和本地打码。


原创工具已经很好用,主要调用了云验证码查询接口(需到官方购买),本次研究主要新增加一本地打码接口。


关于基准工具“小米范验证码登陆爆破工具”的介绍和使用方法可以参考原作者博客(http://www.cnblogs.com/SEC-fsq/p/5712792.html )。

口令破解之验证码识别技术探究

0x01 功能新增
口令破解之验证码识别技术探究

原版界面如下所示:


口令破解之验证码识别技术探究


新版界面如下:


口令破解之验证码识别技术探究


与原版相比,有以下两个优点:


1.增加本地打码功能接口,可以自行添加验证码识别的方法。这样针对简单的验证码,不必使用云打码,使用自己的验证码识别功能即可。


2. 破解jxbrowser组件,重新整合代码,使得二次开发更方便。


Jxbrowser是Java浏览器一款组件,基于Chromium可以在java应用程序来处理和显示HTML5、CSS3、JavaScript、Flash等。jxbrowser是收费的,可以申请license来试用一个月。根据作者的工具不难看出,原来的做法是使用jxbrowser的demo,然后创建一个和demo目录结构一样的程序,来以此达到绕过license的限制达到破解的目的(具体可以参考http://www.freebuf.com/articles/web/41112.html)。工具的原理可以参考原作者博客。


源程序代码结构如下:


口令破解之验证码识别技术探究


修改后的结构如下:


口令破解之验证码识别技术探究


本地验证码识别可以调用YzmToText.getCode()方法来实现。


口令破解之验证码识别技术探究


针对其他验证码的识别,修改getCode()方法即可。


口令破解之验证码识别技术探究


0x02 使用方法
口令破解之验证码识别技术探究

1.tesseract-ocr下载安装


此步骤非必须,如果使用tess4j识别验证码的话需要安装该文件。本次验证码识别采用了tess4j,所以需要安装该文件。


口令破解之验证码识别技术探究


如果识别验证码时提示如上错误,则需安装VC ++ 2015依赖库。


2.下载代码并打包jar文件(或者直接下载编译好的jar文件)。


打包的jar文件:https://github.com/fupinglee/CrackCaptcahLogin/releases


3.在jar同级目录下新建tmp目录(用来存放下载的验证码)、字典目录dict(username.txt和password.txt)、tessdata目录(训练识别验证码的库)。


其结构如下:


口令破解之验证码识别技术探究

4.使用命令java -jar CrackCaptcahLogin.jar打开工具,输入url,根据id、name、class属性识别用户名、密码、验证码输入框、及登录按钮。


动态效果图如下所示:


口令破解之验证码识别技术探究


0x03 FAQ
口令破解之验证码识别技术探究

1.验证码不同步


刚开始新增本地识别接口的时候,遇到有验证码不同步的情况。当时处理验证码是另外写了一个下载验证码的步骤,然后识别后提交,结果发现验证码一直不正确。以为是cookie的原因,就想着在获取验证码的同时将返回的cookie再置入浏览器,来达到同步的效果。结果还是不行。然后在使用云打码的时候发现验证码都是正确的,就看了一下验证码是怎样获取的。


口令破解之验证码识别技术探究


结果发现多走了许多弯路,验证码数据内容已经返回了,直接将该数据流保存即可获取验证码图片。


2.本地验证码无法识别


由网站下载下来的验证码,直接使用tesseract可以识别,但是使用程序就无法识别了,即使设置了识别库也不行。然后发现经过处理后可以识别。如下:


口令破解之验证码识别技术探究


0x04 总结
口令破解之验证码识别技术探究

这个识别验证码也不是万能的,无论识别简单的还是复杂的验证码还需要自己修改,不过只需修改YzmToText.java中的代码即可。这里只给出了一个示例而已。


原版可以去http://www.cnblogs.com/SEC-fsq/p/5712792.html 查看(再次强调),不管修改的还是原版的,功能可能还不完善,代码已放在GitHub,可以自行修改。简单的我已经完成了,困难的交给你们。


来源:猎户安全实验室



以上是关于验证码识别技术的主要内容,如果未能解决你的问题,请参考以下文章

OCR软件能识别百度的验证码吗?

按键精灵脚本中如何自动识别并输入验证码

验证码识别大赛英文验证码识别

[爬虫]验证码识别(4.1)

JAVA识别图片验证码

解读智能识别验证码的验证原理