`
Hooopo
  • 浏览: 328828 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用imagemagick和tesseract-ocr破解简单验证码

    博客分类:
  • Ruby
阅读更多

工具:imagemagick + tesseract-ocr

 

Tesseract-ocr据说辨识程度是世界排名第三,可谓神器啊。

准备工作:

1.安装tesseract-ocr

sudo apt-get install tesseract

2.安装imagemagick

sudo apt-get install imagemagick

3.安装rmagick

sudo apt-get remove --purge librmagick-ruby-doc librmagick-ruby1.8
sudo apt-get install libmagick9-dev ruby1.8-dev
sudo gem install rmagick

先试一个简单的:

require 'rubygems'
require 'rtesseract'
img = RTesseract.new("tmp/test.jpg")
img.to_s.sub(/\s+$/, "") # => "3R8Z" 

很成功,但这个太简单了。一般破解复杂点的验证码处理步骤是先用imagemagick灰度化,灰度反转,提高对比度,二值化等。然后再用ocr去识别。ocr识别黑白图片效果比较好些。

这个是人民网的验证码:

img = MiniMagick::Image.new("tmp/people.jpg") 
img.colorspace("GRAY")#灰度化
image = RTesseract.new(img.path)
image.to_s.sub(/\s+$/, "") # => "254369" 

 这个还是简单,再复杂一点的,这个是4399.com的验证码:

有黑色边框,有背景色,文字稍微扭曲。

 

img = MiniMagick::Image.new("tmp/4399.jpg")
img.crop("#{img[:width] - 2}x#{img[:height] - 2}+1+1") #去掉边框(上下左右各1像素)
img.colorspace("GRAY") #灰度化
img.monochrome #二值化
image = RTesseract.new(img.path) #ocr识别
image.to_s.sub(/\s+$/, "") #=> "5692" 

 

像上面这样简单的识别率几乎能达到80%以上,扭曲太严重的识别率就很低了。有轻微噪点的就得自己写去噪算法了。。

 

还有一些验证码看起来很变态但是是纸老虎。像当当的。刷新了几次发现结果在1-20之间,选中一个数暴力破解每次也有1/20正确的概率。

还有139的:。答案就12种1-4A-Da-d。而且不区分大小写。选中一个字母每次有1/6的概率命中。

 

ps:研究破解验证码不是为了搞破坏。请勿跨省追捕。

分享到:
评论
9 楼 huyong36 2012-03-28  
收藏起来。。
8 楼 bxc168 2012-02-22  
bxc168 写道
img = RTesseract.new("tmp/test.jpg")
bxc168 写道
你好,你的例子为什么运行的时候报错
RTesseract::ConversionError (RTesseract::ConversionError)
请问有什么地方需要注意吗?

img = RTesseract.new("tmp/test.jpg")
就是执行到这个步骤,里面转换不了,我是在WINDOS平台下

说错了,是在img.to_s.sub(/\s+$/, "")这里,报错的,好像是转换不了,不知道为什么
7 楼 bxc168 2012-02-22  
img = RTesseract.new("tmp/test.jpg")
bxc168 写道
你好,你的例子为什么运行的时候报错
RTesseract::ConversionError (RTesseract::ConversionError)
请问有什么地方需要注意吗?

img = RTesseract.new("tmp/test.jpg")
就是执行到这个步骤,里面转换不了,我是在WINDOS平台下
6 楼 bxc168 2012-02-22  
你好,你的例子为什么运行的时候报错
RTesseract::ConversionError (RTesseract::ConversionError)
请问有什么地方需要注意吗?
5 楼 Hooopo 2011-10-11  
JasonChi 写道
你好,我在设置解析图片灰度的时候遇到下面问题,请问是什么问题呢?

Command ("mogrify -colorspace "GRAY" public/price1.jpg") failed: {:status_code=>1,utput=>""}

运行identify看看imagemagick是否安装ok
4 楼 JasonChi 2011-10-11  
你好,我在设置解析图片灰度的时候遇到下面问题,请问是什么问题呢?

Command ("mogrify -colorspace "GRAY" public/price1.jpg") failed: {:status_code=>1,utput=>""}
3 楼 up2u0609 2011-07-27  
擦,果断收藏给老婆作医院挂号器用
2 楼 Hooopo 2011-04-30  
fireflyman 写道
皮皮书屋的这种,怎么处理.......
#include <stdio.h>

int n[]={0x48,                                                                                                               0x65,0x6C,0x6C, 
0x6F,0x2C,0x20, 
0x77,0x6F,0x72, 
0x6C,0x64,0x21, 
0x0A,0x00},*m=n;
main(n){ 
    if(putchar (*m)!='\0') main(m++);
}


这个就更简单了啊。
1.把抓取这段代码,保存到xx.c
2.编译:gcc xx.c
3.用ruby调用编译后的文件得到结果。
1 楼 fireflyman 2011-04-30  
皮皮书屋的这种,怎么处理.......
#include <stdio.h>

int n[]={0x48,                                                                                                               0x65,0x6C,0x6C, 
0x6F,0x2C,0x20, 
0x77,0x6F,0x72, 
0x6C,0x64,0x21, 
0x0A,0x00},*m=n;
main(n){ 
    if(putchar (*m)!='\0') main(m++);
}

相关推荐

Global site tag (gtag.js) - Google Analytics