- A+
在我看来,基本上可以不负责任地认为,Python 可以做任何事情。无论是从入门级选手到专业级选手都在做的爬虫,还是 Web 程序开发、桌面程序开发还是科学计算、图像处理,Python 都可以胜任。或许是因为这种万能属性,周围好更多的小伙伴都开始学习 Python。
那Python 现在到底有多热呢?
微软在上个月开启了一个针对 Excel 功能的话题,用以收集用户的反馈。随后有用户提议让 Python 成为 Excel 的一种脚本语言,不仅可以作为 VBA 的替代品,而且也可以作为字段函数(= SUM(A1:A2))的替代方案。该提议得到了众多用户的支持,得票支持率高于排名第二的提议的两倍。现在,Python 的这把火已经烧到了程序员的圈子外。根据国务院《新一代人工智能发展规划的通知》,可以想见人工智能教育往低幼渗透的例子只会越来越多。小学生学 Python 是培养编程兴趣和思维,为了你自己的百万年薪和发展前景,或许你才是最该学 Python 的人。
今天让我们突破这个世界上最流行的WordPress验证代码插件。
阿德里安没有访问生成验证代码图片的应用程序的源代码。为了破解这个系统,他必须下载数百个示例图像并手动回答它们,以训练他的深度学习系统。
最好的是,它是开源的!因为我们有生成验证代码的源代码,所以它很容易破解。为了让事情更有挑战性,让我们给自己一个时间限制。我们能在15分钟内破解这个验证系统吗?让我们试试看!
挑战的开始
要创建攻击计划,让我们看看插件将生成什么类型的图片。在演示站点上,我们看到了:
好了,验证图像看起来是四个字母。让我们在PHP源代码中验证这一点:
是的,它生成四个字母验证码,并使用四种不同的随机组合字体。如我们所见,它从不在代码中使用“o”或“I”,以避免用户混淆。这给了我们总共32个字母和数字,我们可能需要识别它们。没问题!
我们的工具集
在进一步讨论之前,让我们讨论一下我们将要用来解决这个问题的工具。
创建数据集
为了训练任何机器学习系统,我们都需要训练数据集。解码验证系统,我们需要训练数据如下所示。
因为我们有WordPress验证代码插件的源代码,所以我们可以对它做一些修改,这样就可以保存10000个验证码和每个映像的正确答案。
这是我不会给你的代码中唯一的一部分。我们这样做是为了教育,我不希望你真的去黑WordPress网站。不过,我会给你我的最后10000个图像,以便你可以重复我的结果。
简化
现在我们有了训练数据,我们可以直接用它来训练神经网络。
有了足够的训练数据,这种方法粗略,甚至可行,但我们可以使它更容易解决问题。问题越简单,训练数据越少,计算资源消耗越少。毕竟,我们只有15分钟!
我没有时间去浏览10000个训练图像和手动分为单独的图像在PS图象处理软件。需要几天时间,我只剩下10分钟了。
每个图像中的字母都是随机放置的,这使得分割图像更加困难。
幸运的是,我们仍然可以自动执行此操作。在图像处理中,我们经常需要检测具有相同颜色的像素。这些连续像素周围的边界称为等高线。OpenCV有一个内置的findcontours()函数,可以用来检测这些连续的区域。
然后,我们将图像转换为纯黑白(这称为阈值设置),这样就很容易找到一个连续的区域:
接下来,我们将使用findcontours OpenCV()检测每个连续的簇包含图像中相同颜色的像素功能。
然后只需要将每个区域保存为单独的映像文件。因为我们知道每个图像应该包含四个字母,从左到右,我们可以用这些知识来标记字母。只要我们按顺序保存它们,就可以用正确的字母名称保存每个字母图像。
这意味着我们最终会找到两个字母拼在一起的区域:
如果我们不处理这个问题,我们最终会造成糟糕的培训数据。我们需要解决这个问题,这样我们就不会小心让机器把这两个字母看成一个字母。
我们将把比高度高的任何区域的宽度分开,并将其用作两个字母。这是非常粗糙的,但这种处理仍然是可行的,以确定验证码。
现在我们有一个方法来提取的一封信,让我们对所有的验证码图像运行它。我们的目标是收集每个字母的不同变化。我们可以把每个字母保存在自己的文件夹里。
从我们的10000个验证图像中提取的一些“W”字母。我总共得到了1147张不同的“W”图像。
神经网络的创建与训练
由于我们只需要识别一个字母和一些图像,所以我们不需要一个非常复杂的神经网络体系结构。识别字母比识别复杂的图像更容易,比如猫和狗的照片。
如果你想知道更多关于卷积神经网络如何工作,为什么他们被用作图像识别是理想的,看看阿德里安的书或我以前的文章。
现在,我们可以开始训练它了!
训练数据集经过10次训练后,达到了100%的精度。现在,只要我们认为,我们应该能够自动绕过这个验证码!我们做到了!
利用训练模型破解验证码
现在,我们有了一个训练有素的神经网络,用它来破解真正的验证代码是非常简单的。
或者从命令行
试试!
如果你想亲自尝试,你可以在这里得到代码。它包括10000个示例图像和本文中每一步的所有代码。看readme.md文件里面看看如何运行它。