Python结合Genetic Algorithm破解网易易盾拼图验证实战解析
本文详细解析如何利用Python及Genetic Algorithm(遗传算法)破解网易易盾的拼图验证机制。文章从环境配置入手,解决依赖包版本冲突问题,逐步演示如何生成与还原拼图图片。重点深入Pandora项目源码,通过修改individual.py文件提取最优解映射,实现自动化验证绕过。
首先观察目标验证的具体形态。

这是一种基于推理的验证机制,在防止人机破解方面确实有效,但其中仍存在可被利用的漏洞,例如:

(以上为原图与二值化处理后的对比结果)

(这是正常状态下的图片示例)
如红线标注区域所示,可以观察到明显的突变现象,且在二值化处理后边缘趋于直线。然而,正常图像通常不会出现如此显著的突变特征。
初识Pandora
随后,我查阅了机器视觉相关的文章与论文,发现了一种高效的算法——Genetic Algorithm(遗传算法)。特别值得一提的是,有作者利用该算法实现了“拼图自动还原”功能(并非A*算法那种寻找最优路径的解法,而是纯粹的拼图还原)。项目仓库地址如下:首先介绍如何运行该项目。过程中存在诸多坑点,接下来请做好面对PyCharm一路报错的准备。本文使用Python 3.10版本,这是目前的最新稳定版。文档中指示的这一步执行时会报错。
pip3 install -r requirements.txt
解决方案:单独下载requirements.txt文件中的每个包,并根据当前下载包的最新版本替换旧版本号。


目前我使用的每个包的最新版本号如下。

全部替换完成后,再次执行以下代码,即可避免报错。
pip3 install -r requirements.txt接着执行以下代码。
pip3 install -e .
进入Pandora环境
按照官网提示执行,首先创建一个拼图,命令格式如下(此处文件名已修改)。
create_puzzle images/starry.jpg --size=60 --destination=puzzle.jpg
执行后发现似乎无法正常运行,原因在于未在正确路径下执行。其脚本实际位于bin文件夹内。你可能会遇到如下错误提示。

若成功执行,bin目录下将生成一张拼图图片。

上述步骤介绍了图片生成方法,接下来是核心内容:如何还原图片。
gaps --image=puzzle.jpg --generations=20 --population=600关于参数的解释,官网说明如下:
选项说明:
--image 拼图图片路径(需还原的图片)
--size 拼图块大小(像素单位)
--generations 遗传算法的代数
--population 种群中的个体数量
--verbose 显示每一代后的最佳解决方案
--save 将拼图结果保存为图像
先按照官方文档流程执行一遍。

运行结果良好,但随后又出现报错,且语法拼写无误。别担心,解决方案已找到。
python gaps --image=puzzle.jpg --generations=20 --population=600 --size=60 --save或者,你可以不指定遗传代数与人口数。
python gaps --image=puzzle.jpg --size=60 --save

这是完全还原后的结果。至此,我们克服了项目报错,填平诸多坑点,成功运行Demo,完成了60%的工作。接下来是如何利用该项目破解网易易盾的推理拼图验证。
探究Pandora内部机制
首先查看项目目录结构:

gaps文件夹下包含所有模块源码。作者对各个基础功能进行了封装,但其中并未直接提供我们所需的功能,因此需要自行阅读并理解源码,进而进行二次开发以实现特定功能。
我们主要关注individual.py文件:

用通俗语言解释,即“在所有排列组合中,帮你找出最优解”。

输出该映射关系,结果如下,这正是我们所需的数据。

下方有一个创建图像的方法,这是最终得到最优解后的图像拼接函数。

因此,只需获取最后的索引映射即可!
以下为最优解映射值的输出实例:
在初始化时,新增一个变量用于存储最终结果。

self.pieceMapping = None自定义一个函数。

# 返回映射值
def getPieceMapping(self):
return self.pieceMapping每次执行时,将最优解传递出去。

def to_image(self):
"""Converts individual to showable image"""
pieces = [piece.image for piece in self.pieces]
self.pieceMapping = self._piece_mapping
return image_helpers.assemble_image(pieces, self.rows, self.columns)以上操作即可输出我们所需的结果。
调用方式如下:

key为最终结果的标志,value为原始标志。
注意:对于极度复杂的原始图片生成的拼图,在还原后误差可能会较大。


至此,关于详解Python结合Genetic Algorithm算法破解网易易盾拼图验证的文章介绍完毕。更多相关Python Genetic Algorithm内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













