看我怎么编写一个验证码辨认程序

访客5年前关于黑客接单913

在此之前我收到了一些读者对我的反应,他们期望我能够在文中解说相关解析器的开发流程。为了满意我们的需求,我决议和你们共享一个我非常重要的项目的完好施行进程。话不多说,让我们现在就开端!
当我开发这些脚本时,我对图画处理或其间的算法没有任何的了解或认知。最开端时我所能想到的便是:
图画根本上是一个矩阵,像素作为独自的单元格。
五颜六色图画具有每个像素的元组(红,绿,蓝)值,灰度图画具有单个值,而且一般图画中每个像素值的范围在(0,255)。
以下是我大学网站的登录界面:

首要,我对验证码做了开始的调查剖析。总结如下:

验证码中的字符位数一直为6位,而且是灰度图画;
字符之间的距离看起来一直保持相同的距离;
每个字符都是彻底界说的;
图画有许多杂散的暗像素,以及穿过图画的线条
我决议下载一个图片验证码,并凭借这款东西以二进制可视化图画(0表明黑色,1表明白色像素)。

我的调查是正确的 – 图画尺度为45×180,每个字符被分配一个30像素的空间来拟合,从而使它们均匀距离。
因而,我的第1步是
将图画裁剪成6个不同的部分,每部分的宽度为30像素。
这儿我挑选运用Python作为我的开发言语,由于它的库最易运用和完成。
经过简略的搜索后,我找到了PIL库。我决议运用Image模块,由于我的操作仅限于裁剪并将图画作为矩阵加载。
所以,依据文档,裁剪图画的根本语法如下:
from PIL import Image
image = Image.open("filename.xyz")
cropped_image = image.crop((left, upper, right, lower))
在本例中,假如你想裁剪榜首个字符,
from PIL import Image
image = Image.open("captcha.png").convert("L") # Grayscale conversion
cropped_image = image.crop((0, 0, 30, 45))
cropped_image.save("cropped_image.png")
被裁剪保存的图画:

我将其包装在一个循环中,写了一个简略的脚本,从该站点获取500个验证码图画,并将一切裁剪后的字符保存到一个文件夹中。
第三次调查 – 每个字符都有明晰的界说。为了“整理”图画中的裁剪字符(删去不必要的线和点),我运用了以下办法。
字符中的一切像素都是纯黑色(0)。我用了一个简略的逻辑 – 假如它不是彻底黑色的,就视为白色。因而,关于值大于0的每个像素,将其重新分配为255。运用load()函数将图画转换为45×180矩阵,然后对其进行处理。
pixel_matrix = cropped_image.load()
for col in range(0, cropped_image.height):
    for row in range(0, cropped_image.width):
        if pixel_matrix[row, col] != 0:
            pixel_matrix[row, col] = 255
image.save("thresholded_image.png")
为了愈加明晰,我将代码使用至原始图画上。
原图:

处理后:

能够看到处理后的图画中的非纯黑像素都已被移除,其间包含交叉图画的线条。
直到项目完成后,我才知道上述办法被称为图画处理中的阈值处理。
第四次调查 – 图画中有许多杂散像素。
循环遍历图画矩阵,假如相邻像素为白色,与相邻像素相对的像素也为白色,且中心像素为黑色的,则使中心像素为白色。
for column in range(1, image.height - 1):
    for row in range(1, image.width - 1):
        if pixel_matrix[row, column] == 0
            and pixel_matrix[row, column - 1] == 255 and pixel_matrix[row, column + 1] == 255 :
            pixel_matrix[row, column] = 255
        if pixel_matrix[row, column] == 0
            and pixel_matrix[row - 1, column] == 255 and pixel_matrix[row + 1, column] == 255:
            pixel_matrix[row, column] = 255
输出:

能够看到,此刻图画中的字符根本已被独自分离出来了。

[1] [2] [3]  黑客接单网

相关文章

CTF标题实战:2019-Hgame-Web-Week4

前语 最近使用空余时刻做了一下Hgame,以下是部分web题题解。 happyPython 信息收集 发现是flask,顺手测验一下。 http://118.25.18.223:3001/{{1+1}...

浅谈RASP技能攻防之根底篇

本文就笔者研讨RASP的进程进行了一些概述,技能干货略少,倾向于遍及RASP技能。中心对java怎么完成rasp技能进行了简略的举例,想对咱们起到抛砖引玉的效果,能够让咱们更好的了解一些关于web运用...

你的网站是怎样被黑的

前语 这个标题的来历是@evilcos(余弦大大)在Github上共享的一个PPT,感兴趣的能够去他的repo下载。写这篇博客主要是想给自己最近业余时间学到的安全相关的常识做个总结,主要是关于网站常见...

对DOTNET(.NET)中的歹意长途拜访进程进行剖析(下)

上一篇说到代码会有许多重复,由于它在每个if句子(共有五个if句子,会在下篇讲到)中都会调用一个函数。但是,细节却略有不同,其间给定的办法称号和函数的参数都会显现函数的内容。 第一个if句子在程序会集...

我是怎么绕过Uber的CSP防护成功XSS的?

咱们好!在开端正式的内容之前,请答应我做个简略的毛遂自荐。首要,我要阐明的是我不是什么安全研究人员/安全工程师,切当的来说我是一名安全的爱好者,这始于两年前的Uber。我喜爱触摸新的事物,而且每天都在...

MySQL联合注入之绕过安全狗到GetShell

发现网上公开过安全狗的办法少之又少,并且根本都是给个大约点就完毕,本文章是将整个进程记录了一遍,因为一开始我也没想到我能成功的绕过去,大约进程是这样:Mysql根底有必要要有–>定位—>f...