网易易盾—推理拼图验证码的破解

友情提示:转载请标明出处,各位大佬们,谢谢了

首先看一下目标的验证形态是什么样子的
网易易盾—推理拼图验证码的破解_第1张图片

是一种通过验证推理的验证方式,用来防人机破解的确是很有效果,但是,But,这里面已经会有一些破绽,比如:
网易易盾—推理拼图验证码的破解_第2张图片
(以上是原图和二值化之后的结果)
网易易盾—推理拼图验证码的破解_第3张图片
(这是正常图片)

像划红线的这些地方,可以看到有明显的突变,并且二值化之后边缘趋于直线,但是正常图像是不会有这种这么明显的突变现象。

初识潘多拉

后来,我去翻阅了机器视觉的相关文章和论文,发现了一个牛逼的算法,这个算法就是——Genetic Algorithm遗传算法,最贴心的的是,作者利用这个算法实现了一个功能,“拼图自动还原”(不是像什么A*算法寻找最优路线解那种哈,就是单纯的拼图)项目仓库地址
首先来介绍下如何使用跑起来这个项目吧,坑是真的很多,接下来感受一下pyCham的一路报错!
这里我用的是python3.10的版本,目前是最新的版本
文档中这一步执行是会报错的

pip3 install -r requirements.txt

网易易盾—推理拼图验证码的破解_第4张图片
解决方案:单独对requirements.txt文件下的每个包单独下载,然后根据当前下载的包的最新版本替换旧版本号。
网易易盾—推理拼图验证码的破解_第5张图片
网易易盾—推理拼图验证码的破解_第6张图片
我目前每个包最新使用的是这些版本号
网易易盾—推理拼图验证码的破解_第7张图片
全部替换完了之后,再执行一次下面的代码,他就不会报错了

pip3 install -r requirements.txt

然后下一步,执行下面代码

pip3 install -e .

网易易盾—推理拼图验证码的破解_第8张图片

进入潘多拉

然后我们按照官网的提示来执行,先创建一个拼图出来,命令是这样的(这里的文件名我改了)

create_puzzle images/starry.jpg --size=60 --destination=puzzle.jpg

在这里插入图片描述
会发现,好像不行,因为我们没有在正确的位置上执行,他的脚本位置是在bin文件夹下面,你可能会遇到如下问题
网易易盾—推理拼图验证码的破解_第9张图片
成功之后的话,会在bin目录下生成一个拼图图片
网易易盾—推理拼图验证码的破解_第10张图片
以上是介绍如何生成图片,接下来是重头戏,如何还原图片

gaps --image=puzzle.jpg --generations=20 --population=600

对于参数的解释官网是这样的:

Option
–image Path to puzzle(需要被还原的图片)
–size Puzzle piece size in pixels (拼图的大小)
–generations Number of generations for genetic algorithm (遗传算法的代数)
–population Number of individuals in population
–verbose Show best solution after each generation (显示每一代后的最佳解决方案)
–save Save puzzle solution as image (拼图结果另存为图像)

先按照官方的走一遍
网易易盾—推理拼图验证码的破解_第11张图片
很好,很舒服,继续报错,而且语法拼写上我们也没有拼写错,没关系!我已经帮你找到解决方案了。

 python gaps --image=puzzle.jpg --generations=20 --population=600 --size=60  --save

或者你不指定遗传代数和人口数

 python gaps --image=puzzle.jpg --size=60 --save

网易易盾—推理拼图验证码的破解_第12张图片
网易易盾—推理拼图验证码的破解_第13张图片
这是完全还原的结果,至此,我们披荆斩棘从解决项目报错,一路挖坑填坑到demo成功运行,到这里我们已经成功了60%,接下来就是如何利用这个项目,去破解网易易盾的推理拼图验证。

探究潘多拉的秘密

首先看一下项目目录:
网易易盾—推理拼图验证码的破解_第14张图片
gaps文件夹下面是所有模块的源码,作者对各个基础功能做了封装,但是我们想要的功能并不存在,就需要自行阅读和理解源码,然后二开实现自己想要的功能。

我们主要关注这个文件individual.py
网易易盾—推理拼图验证码的破解_第15张图片
我来用大白话给你翻译一下吧,“在所有排列中,帮你找出最优解”
网易易盾—推理拼图验证码的破解_第16张图片
输出这个映射,结果是这样的,正好是我们想要的东西
网易易盾—推理拼图验证码的破解_第17张图片
下面会有一个创建图像的方法,这是最后得到最优解图像拼接函数
网易易盾—推理拼图验证码的破解_第18张图片
那么,我们将最后的索引映射取到就OK了!

以下为最优解的映射值输出实例:

初始化的时候,新增一个变量用来存储最后的结果
网易易盾—推理拼图验证码的破解_第19张图片

self.pieceMapping = None

自定义一个函数
网易易盾—推理拼图验证码的破解_第20张图片

# 返回映射值
def getPieceMapping(self):
	return self.pieceMapping

每次执行的时候,将最优解传递出去
网易易盾—推理拼图验证码的破解_第21张图片

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)

以上,就把我们想要的结果输出了

调用:
网易易盾—推理拼图验证码的破解_第22张图片
网易易盾—推理拼图验证码的破解_第23张图片
key为最后的结果标志,value为原始标志。

PS:对于极度复杂的原始图片创建的拼图,在还原之后,误差会挺大的。
网易易盾—推理拼图验证码的破解_第24张图片

友情提示:转载请标明出处,各位大佬们,谢谢了

你可能感兴趣的:(计算机视觉,人工智能,安全,python)