简言
后台登录界面有验证码存在时,能阻拦住大部分想进行暴力破解的人.本文将利用Python进行简单的验证码识别,本来还想学习一下tesseract的机器学习提高识别率来着,但是我太菜了,一直报错.
安装tesseract
OCR,即Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.对于图形验证码来说,它们都是一些不规则的字符,这些字符确实是由字符稍加扭曲变换得到的内容.
tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/
这里我选择的是tesseract-ocr-w64-setup-v5.0.0-alpha.20210506
为了能在python中使用我们还需要安装pytesseract
pip install pytesseract
找到python的安装路径下的pytesseract,使用记事本编辑pytesseract.py,将tesseract_cmd = ‘tesseract’改为tesseract.exe所在的绝对路径.
简单测试
随便找了一个网站后台
像这种无线条干扰的验证码图片是最容易识别的,将图片下载到本地.
import pytesseract from PIL import Image text = pytesseract.image_to_string(Image.open("./captcha.png")) print(text)
输出结果:
输入结果中存在特殊字符,可以使用re正则匹配去除,代码更改如下
import pytesseract from PIL import Image import re text = pytesseract.image_to_string(Image.open("./captcha.png")) text = re.findall('\w.*',text)[0] print(text)
输出结果:
去噪处理
像这种图片需要进行去噪处理,去除线条的干扰
利用Image对象的convert()方法传入参数(‘L’),即可将图像转为灰度图像,然后进行二值化处理,去噪的关键在于二值化的阈值取值多少,二值化的阈值如何确定我也没有太好的方法,只能通过image.show()展示的图片的清晰程度不断调整.
import pytesseract from PIL import Image image = Image.open('./checkCode.jpg') image =image.convert('L') threshold = 60 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table,'1') image.show() text = pytesseract.image_to_string(image) print(text)
checkCode.jpg(方便大家做实验用):
运行结果中同样含有特殊字符,使用re正则匹配掉.
tesseract OCR的训练踩坑经历
1
tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
会报错Empty page,改用下面的命令可以成功
tesseract num.font.exp0.tif num.font.exp0 -psm 7 batch.nochop makebox
2
如果要合并多个tiff文件,需要一直按住ctrl键进行选择
3
训练貌似只支持黑白图像,验证码图片需要进行转灰度和二值化处理,以一张验证码图片为例
转灰度,二值化处理之前
转灰度,二值化处理之后
代码如下:
from PIL import Image image = Image.open('./checkCode.jpg') image =image.convert('L') threshold = 60 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table,'1') image.show()
每张图片需要的阈值有可能不同,需要自己调整代码中threshold的取值
编写爆破脚本
1:使用session = requests.Session()来保存一次会话
2:使用re正则匹配验证码的地址,将图片下载到本地
使用pytesseract进行识别,保存识别结果,删除验证码图像
3:构造表单,发送数据.
4:没必要使用多线程,由于GIL的存在,对于这种IO密集型的代码,运行速度并不会提升多少甚至没有提升.
伤敌八百自损一千的奇淫巧计
可以借助第三方平台的API进行验证码的识别,第三方平台的验证码识别准确率很高,但是爆破成本太高了,且爆破成功率低,氪金大佬可以试试^^
总结
对于没有线条干扰的验证码识别准确率很高,但是对于有线条干扰的验证码识别准确率真的是十分感人,虽然可以通过转灰度,二值化处理提高准确率,但仍有些验证码无法准确识别.
如果有机器学习训练成功的师傅请指点俺一下^^
来源:freebuf.com 2021-06-28 15:52:42 by: 菜头想学安全
请登录后发表评论
注册