MYBLOG

通用图片验证码免费识别API

2020-05-11 09:22:34ans

之前在尝试挖SRC漏洞的时候,由于太菜了,只能挖一下简单的XSS、SQL,以及弱口令爆破。

然鹅挖弱口令的时候尝尝会遇到验证码,而且验证码类别特别多。

滑动、点击以及其他古古怪怪的验证码目前我还搞不定,只能对用的还比较多的传统字母数字验证码下下手。

传统验证码通常要经过各种分割、滤波还有二值化之类的处理,考虑到图片验证码种类也是千千万万,所以想搞出一个通用的处理方法是不可能的,所以我把目标放到了端到端识别。由于我对深度学习一窍不通,完全没接触过,所以到github上找了几个模型自己修改+爬训练集

CNN的、Resnet的还有各种组合的模型都试过了,效果差的对训练过的同类型验证码识别率都很低,效果好的可以对同类型验证码识别率达到99%,但是换别的类型的验证码识别率就会立刻降到0

后来渐渐意识到神经网络似乎是无法完成通用的识别的。。

我又重新转回传统方法,又发现还有聚类这么个玩意,如果可以分割图像,然后靠聚类挨个识别的话,指不定可以。但是问题又来了,咋才能通用的分割。。

后来我去了解了下百度的API,高精度识别免费500次/天,对模拟登录是够了,但对于爆破来讲完全不够用。通用的免费50000次/天,但是识别效果又很差

然后我又去了解OCR,寄希望于OCR技术,又了解到OCR通常只能识别比较规整的字体,对验证码这种千奇百怪的字体形态也是无能为力……

近期又去了解了次时代、完美验证码识别系统这类工具的使用,发现是通过聚类的方法识别单个字符的,但是它可以做到自动识别图片中符合条件的字!

这不就很完美的解决了“通用分割”的问题吗?

于是我开始制作字库,手动一个个试,花了一个白天的资源搜索加通宵的手工制作,终于做出了500个字模的字库,测试以下效果:

正确率:30%

……

没关系,我再做它几千个就能更准了,但是这个字库能不能通用呢?于是尝试了一下另一种比较规整的验证码:

正确率:0%

……放弃

最终,我发现,还是白嫖来的最爽——

从网上找到一个通用识别库的dll文件,然后用python导入,用flask挂载到8082端口:

  1. from flask import Flask, request, jsonify
  2. import ctypes
  3. import os
  4. import base64
  5. os.environ['GLOG_minloglevel'] = '4'
  6. ocr = ctypes.windll.LoadLibrary('ocr.dll')
  7. ocr.init()
  8. crack_func = ocr.ocr
  9. app = Flask(__name__)
  10. @app.route('/', methods=['POST'])
  11. def crack():
  12. img = base64.b64decode(request.form['image'].encode())
  13. img_len = len(img)
  14. ret = str(ctypes.string_at(crack_func(img, img_len)))
  15. return ret
  16. if __name__ == '__main__':
  17. app.run('0.0.0.0', 8082)

YJtmVK.png

成功了诶

这个dll字库对各种验证码都有一定的识别能力,中等复杂的验证码识别率有个六七成左右,虽然没法和花钱的比,但是这个识别率也基本够用了。

于是迫不及待地想挂到服务器上。然鹅,问题又来了:

Linux怎么加载dll……我对这个一点都不懂,完全不知道怎么弄。于是谷歌发现了有wine这个东西,可以在linux上跑windows的程序,果断下载,编译,安装……循环。

单核学生机编译一次要俩小时,还净出毛病,啥没有JPEG支持啥的,谷歌百度找半天都找不到,搞的我心态都要崩了。

还好后来摸索出了解决方法,原来装个libjpeg-dev就好了,装完了就可以用了:

YJNvkT.png

Great……图片验证码的渊源终于可以告一段落了。

最后是使用方法:

http://121.199.4.195:8082/

POST image=图片内容的base64

会直接返回识别结果。

这个验证码API不出意外我会一直开着,供大家免费用,dll字库是网上共享的免费版,应该不存在版权之类的问题。

至于自动化的含验证码的弱口令探测工具,大佬们就自己写吧,我之前写的selenium的调用实在是太慢了,推荐用requests库去爆破验证码。

后续要专心考研,所以暂时先不写那个工具了,等之后有空闲再去写。

全部留言 0