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

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

首先看一下目标的验证形态是什么样子的
在这里插入图片描述

是一种通过验证推理的验证方式,用来防人机破解的确是很有效果,但是,But,这里面已经会有一些破绽,比如:
在这里插入图片描述
(以上是原图和二值化之后的结果)
在这里插入图片描述
(这是正常图片)

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

初识潘多拉

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

pip3 install -r requirements.txt

在这里插入图片描述
解决方案:单独对requirements.txt文件下的每个包单独下载,然后根据当前下载的包的最新版本替换旧版本号。
在这里插入图片描述
在这里插入图片描述
我目前每个包最新使用的是这些版本号
在这里插入图片描述
全部替换完了之后,再执行一次下面的代码,他就不会报错了

pip3 install -r requirements.txt

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

pip3 install -e .

在这里插入图片描述

进入潘多拉

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

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

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

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 (拼图结果另存为图像)

先按照官方的走一遍
在这里插入图片描述
很好,很舒服,继续报错,而且语法拼写上我们也没有拼写错,没关系!我已经帮你找到解决方案了。

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

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

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

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

探究潘多拉的秘密

首先看一下项目目录:
在这里插入图片描述
gaps文件夹下面是所有模块的源码,作者对各个基础功能做了封装,但是我们想要的功能并不存在,就需要自行阅读和理解源码,然后二开实现自己想要的功能。

我们主要关注这个文件individual.py
在这里插入图片描述
我来用大白话给你翻译一下吧,“在所有排列中,帮你找出最优解”
在这里插入图片描述
输出这个映射,结果是这样的,正好是我们想要的东西
在这里插入图片描述
下面会有一个创建图像的方法,这是最后得到最优解图像拼接函数
在这里插入图片描述
那么,我们将最后的索引映射取到就OK了!

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

初始化的时候,新增一个变量用来存储最后的结果
在这里插入图片描述

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为原始标志。

PS:对于极度复杂的原始图片创建的拼图,在还原之后,误差会挺大的。
在这里插入图片描述

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

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值