首页>>科技 >>内容

利用机器学习15分钟破解验证码,不再担心买不到12306门票

发布时间:2023-10-14 17:15:32编辑:温柔的背包来源:

很多朋友对利用机器学习15分钟破解验证码,不再担心买不到12306门票不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

利用机器学习15分钟破解验证码,不再担心买不到12306门票

每个人都讨厌验证码——。只有输入那些烦人的图片上的文字才能访问该网站。验证码旨在防止计算机自动填写表格并验证您是一个真正的“人”。但随着深度学习和计算机视觉的兴起,它们现在往往很容易被击败。

我一直在读Adrian Rosebrock 写的《Deep Learning for Computer Vision with Python》一书。在本书中,Adrian 回顾了如何通过机器学习破解e-zpass 纽约网站上的验证码系统:

Adrian 无法访问生成验证码图像的应用程序的源代码。为了破解该系统,他必须下载数百张示例图像并手动解决它们来训练他的系统。

但是如果我们想要破解一个开源的验证码系统,我们从哪里获取源代码呢?

我访问了WordPress.org 插件注册网站并搜索“CAPTCHA”。上面的结果被称为“Really Simple CAPTCHA”,安装次数超过100 万:

WordPress.org插件注册地址:https://wordpress.org/plugins/

最重要的是,这是它的源代码!这应该很容易破解,因为有生成验证码的源代码。为了让事情变得更具挑战性,让我们给自己一个时间限制。我们能在15分钟内彻底破解这个验证码系统吗?试一试吧!

重要提示:这绝不是对“Really Simple CAPTCHA”插件或其作者的批评。插件作者本人表示它不再安全并建议您使用其他东西。这只是一个有趣且快速的技术挑战。但如果你是100 万用户之一,也许你应该保持警惕:)

挑战

首先,我们需要知道Really Simple CAPTCHA 生成什么样的图像。在演示网站上我们看到:

非常简单的验证码地址:https://wordpress.org/plugins/really-simple-captcha/

演示验证码图片

验证码图像看起来像四个字母。我们在PHP 源代码中验证一下:

public function __construct() { $this-chars='ABCDEFGHJKLMNPQRSTUVWXYZ23456789'; $this-char_length=4; $this-fonts=array( dirname( __FILE__ ) . '/gentium/GenBkBasR.ttf', dirname( __FILE__ ) . '/gentium/GenBkBasI.ttf', dirname( __FILE__ ) . '/gentium /GenBkBasBI.ttf', 目录名( __FILE__ ) . '/gentium/GenBkBasB.ttf', );

是的,它使用4 种不同字体的随机组合生成4 个字母的验证码。我们可以看到它在代码中从不使用“O”或“I”以避免用户混淆。这给我们留下了32 个可能的字母和数字。

到目前为止时间:2分钟

我们的工具集

在进一步讨论之前,我们先讨论一下解决此问题所需的工具:

蟒蛇3

Python 是一种有趣的编程语言,具有出色的机器学习和计算机视觉库。

开放式计算机视觉

OpenCV 是一种流行的计算机视觉和图像处理框架。我们将使用OpenCV 来处理验证码图像。它有一个Python API,所以我们可以直接在Python中使用它。

喀拉斯

Keras 是一个用Python 编写的深度学习框架。它使得用最少的编码来定义、训练和使用深度神经网络变得容易。

TensorFlow

TensorFlow 是Google 的机器学习库。我们将使用Keras 进行编码,但Keras 本身并没有真正实现神经网络逻辑。相反,它在幕后使用Google 的TensorFlow 库来完成繁重的工作。

好吧,回到挑战。

创建数据集

要训练任何机器学习系统,您需要训练数据。为了破解验证码系统,我们需要这样的训练数据:

现在我们有了WordPress 插件的源代码,我们可以对其进行修改以保存10,000 个验证码图像,以及每个图像的预期答案。

经过几分钟的修改代码并添加一个简单的for 循环后,我得到了一个包含训练数据的文件夹- 10,000 个PNG 文件,并以正确的答案作为文件名:

这是我不会向您提供示例代码的唯一部分。我们这样做是出于教育目的,我不希望您真正访问垃圾邮件网站。但我会向您提供我最后生成的10,000 张照片,以便您可以复制我的结果。

到目前为止时间:5分钟

简化问题

现在我们有了训练数据,我们可以直接用它来训练神经网络:

如果有足够的训练数据——,这种方法可能会起作用,但我们可以使问题变得更简单。问题越简单,训练数据越少,我们解决它所需的计算能力就越少。毕竟我们只有15分钟!

幸运的是,验证码图像通常仅由四个字母组成。如果我们可以分割图像,使每个字母都是一个单独的图像,那么我们就可以训练神经网络来识别单个字母:

我没有时间检查10,000 张训练图像并使用Photoshop 将它们手动分割成单独的图像。这需要几天时间,但我只剩下10 分钟了。我们无法将图像分成4 个大小相等的块,因为验证码随机地将字母放置在不同的水平位置,如下图所示:

每幅图像中的字母是随机放置的,使得图像分割更加困难。

幸运的是,我们仍然可以实现自动化。在图像处理中,我们经常需要检测具有相同颜色的像素“斑点”。这些连续像素的边界称为轮廓。 OpenCV 有一个内置的findContours() 函数,我们可以用它来检测这些连续区域。

我们将从原始验证码图像开始:

然后我们将图像转换为纯黑白像素(这称为颜色阈值),以便很容易找到连续区域的轮廓边界:

接下来,我们将使用OpenCV 的findContours() 函数来检测图像中包含相同颜色的连续像素块的分离部分:

然后将每个区域保存为单独的图像文件。由于我们知道每个图像应包含从左到右的四个字母,因此我们可以使用这些知识来标记我们保存的字母。我们按照这个顺序保存它们,并用相应的字母名称保存每个图像字母。

但是等等——我有一个问题!有时验证码有重叠的字母,如下所示:

这意味着我们最终会提取两个字母拼凑在一起的区域:

如果我们不解决这个问题,我们将产生不良的训练数据。我们需要解决这个问题,这样我们就不会意外地让机器将这两个挤在一起的字母识别为一个字母。

这是一个简单的技巧:如果一个区域的宽度大于其高度,则意味着我们可能会将两个字母挤在一起。在这种情况下,我们可以将这两个字母放在中间,并将其拆分为两个单独的字母:

现在我们有了提取单个字母的方法,让我们在所有验证码图像上运行它。目的是收集每个字母的不同变体。我们可以将每个字母保存在自己的文件夹中。

这是我删除所有字母后“W”文件夹的图片:

目前为止时间:10分钟

构建并训练神经网络

因为我们只需要识别单个字母的图像,所以不需要非常复杂的神经网络结构。识别字母比识别猫和狗等复杂图像容易得多。

我们将使用一个简单的卷积神经网络架构,具有两个卷积层和两个全连接层:

使用Keras 定义这个神经网络架构只需要几行代码:

# 构建神经网络! model=Sequential() # 第一个具有最大池化的卷积层model.add(Conv2D(20, (5, 5), padding='same', input_shape=(20, 20, 1),activation='relu')) model .add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # 第二个具有最大池化的卷积层model.add(Conv2D(50, (5, 5), padding='same',activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # 具有500 个节点的隐藏层model.add(Flatten()) model.add(Dense(500) ,activation='relu')) # 具有32 个节点的输出层(每个节点对应我们预测的每个可能的字母/数字) model.add(Dense(32,activation='softmax')) # 要求Keras 构建背后的TensorFlow 模型场景model.compile(loss='categorical_crossentropy', optimizationr='adam',metrics=['accuracy'])

现在我们可以运行它了。

# 训练神经网络model.fit(X_train, Y_train, validating_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)

经过10 次训练数据集后,我们的准确率接近100%。我们应该能够在需要的时候自动绕过这个验证码。

经过时间:15分钟

使用训练好的模型来解决验证码

现在我们有了一个训练有素的神经网络,使用它来破解验证码很简单:

1. 从WordPress插件网站获取真实的验证码图像。

2. 使用我们用于创建训练数据集的方法将验证码图像拆分为四个不同的字母图像。

3. 让我们的神经网络对每个字母图像进行单独的预测。

4. 使用四个预测字母作为验证码的答案。

以下是我们的模型如何解码真实的验证码:

或者从命令行:

尝试一下

如果您想亲自尝试一下,可以在此处获取代码。它包括10,000 个示例图像以及本文中每个步骤的所有代码。 Bankuo 解释了如何运行模型的README.md 文件。

代码地址:https://s3-us-west-2.amazonaws.com/mlif-example-code/solving_captchas_code_examples.zip

以上知识分享希望能够帮助到大家!