欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

代码分享:使用Python和Tesseract来识别图形验证码

来源:本站整理 作者:佚名 时间:2018-03-05 TAG: 我要投稿

 各位在企业中做Web漏洞扫描或者渗透测试的朋友,可能会经常遇到需要对图形验证码进行程序识别的需求。很多时候验证码明明很简单(对于非互联网企业,或者企业内网中的应用来说特别如此),但因为没有趁手的识别库,也只能苦哈哈地进行人肉识别,或者无奈地放弃任务。在这里,我分享一下自己使用Python和开源的tesseract OCR引擎做验证码识别的经验,并提供相关的源代码和示例供大家借鉴。

一、关于图形验证码识别与tesseractOCR
尽管多数图型验证码只有区区几个数字或字母,但你可能听说了,在进行机器识别的过程中,你要收集样本,对图片去噪、二值化、提取字符、计算特征,甚至还要祭出神经网络去训练数据进行机器学习……还没开干,退堂鼓早打响三遍了。其实我根本不想去钻研那么多高深的理论,只想要寥寥数行Python代码就搞定它,然后把主要精力投入到更重要的渗透测试中去。在这种情况下,tesseract就能帮上大忙了。
Tesseract的OCR引擎最早是HP实验室开发的,曾经是 OCR业内最准确的三款识别引擎之一。2005年该引擎交给了Google,作为开源项目发布在Google Project上了。Tesseract提供独立程序和API两种形式供用户使用。纯白色背景、字符规整无干扰像素的验证码图片可以直接调用tesseract程序来进行识别。如要更方便灵活地在自己的程序中进行识别,则可以使用tesseract的API。
二、Tesseract的编译和安装
Tesseract的项目主页(https://github.com/tesseract-ocr/tesseract)上wiki中有详细的编译安装步骤,大家可以参考,本文中我们将以3.05.01版本为基础。我的系统环境是RHEL 7.4,64位版本。首先用yum安装各种依赖的图形库,然后用源码安装Leptonica(官方主页http://www.leptonica.com/download.html,版本需要1.74以上),编译安装很简单,解压后,以默认参数依次执行configure,make,make install命令即可。安装完之后需执行:
exportPKG_CONFIG_PATH=/usr/local/lib/pkgconfig
不然在下一步tesseract的configure脚本会报找不到Leptonica。
将tesseract的源码解压后进入到源码主目录下依次执行:
./autogen.sh
./configure--with-extra-libraries=/usr/local/lib
make
make install
即可成功安装。
根据项目wiki,Data Files节的指南下载相应的数据文件,因为我们只识别英文和数字验证码,所以下载3.04/3.05版本的英语文件eng.traineddata即可,下载后放到/usr/local/share/tessdata目录下。至此,tesseract就安装完毕了。
三、为Python封装tesseract API
tesseract提供的是C++ API(接口界面是TessBaseAPI类),最核心的函数就是TessBaseAPI::TesseractRect这个函数。为了能在Python中方便地使用,我将其封装为Python模块了,详细代码放在github上:https://github.com/penoxcn/Decaptcha。该模块名为decaptcha,源文件包括以下四个文件:
setup.py、decaptcha.i、decaptcha.h和depcaptcha.cpp。
 将以上文件放在同一个临时目录下,然后执行以下命令进行编译和安装:
python setup.py install
安装时需要调用swig命令,所以系统需要先安装swig。
如果tesseract不是安装在默认的路径下,请参照setup.py代码自行修改相关的头文件和库文件的路径即可。
安装完之后进入Python交互环境试着import一下看是否正常:
from decaptcha import Decaptcha
如果报错找不到libtesseract,那可能是tesseract的库目录(/usr/local/lib)没有在Python的库搜索目录中。这时候可以将tesseract的库目录添加到系统的/etc/ld.so.conf文件中(加了之后需要执行ldconfig命令以生效);或者每次import decaptcha模块之前,都先执行以下Python代码:
import sys
sys.path.append("/usr/local/lib")
四、安装Python PIL库
PIL的全称是Python Imaging Library,是一个强大而易用的图像库。在其主页(http://pythonware.com/products/pil/)下载最新版(截止目前是1.1.7)源代码进行安装。安装之前确保系统已安装了png/jpeg/tiff等图像库。解压缩之后,在主目录下执行python setup.py install即可。
使用很简单,下面的代码片段从任意格式图片文件创建一个Image对象,进行格式转换,获得其大小和像素数组,只需几行代码:
from PIL import Image
img = Image.open('test.png') # Your image here!  
img = img.convert("RGBA") 
pixdata = img.load() 
width,height = img.size
print 'imgsize: %dx %d' % (width, height)
print'pixel[2,4]:', pixdata[2, 4] #eg,(0xD3,0xD3,0xD3,0xFF)
五、实战验证码识别
至此,进行图形验证码识别的依赖环境都已准备好,我们可以开干了。
识别的流程简单来说如下:
1. 用Image加载图像,转为RGBA格式,然后获取像素数据;
2. 将RGBA格式的像素数据转换为0和1的字节串(其实就是二值化处理);
3. 调用decaptcha模块进行图像识别,获得验证码字符串
实际的代码也非常简单,请看我项目Decaptcha目录下的decaptcha_test.py文件,关键代码也就十几行。影响代码长短或复杂性的,就是二值化这一步了。其实很多图形验证码比较简单,细心分析一下,不难得出二值化的条件。下面以我工作中遇到过的一些验证码为例:
有5组,均来自于我公司的不同业务网站。识别代码请参看我项目目录下decaptcha_demo.py文件,所有的示例验证码放在images目录下。大家可以用图片编辑器打开相关的验证码文件观察和分析像素的规律。
第一组aa系列,字符颜色偏白,背景偏黑,所以可试着以像素RGB均值(或总和)大于某个数值为条件进行转换:r+g+b>=480则为1,否则为0。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载