基于YOLO实现滑块验证码破解

news/2024/11/16 12:23:57/文章来源:https://www.cnblogs.com/cy2011/p/18549017

申明:本案例中的思路和技术仅用于学习交流。请勿用于非法行为。

一、训练模型

详细训练步骤和导出模型参考 滑块验证码识别模型训练

二、模型试用

通过YoloDotNet运行模型,计算出滑块缺口位置后用RESTful格式的接口返回坐标给其它应用调用。YoloDotNet案例参考 物体检测框架YoloDotNet初体验。

主要步骤:

1. 创建webapi(c#)项目

# -n:指定项目名称为slider_api
dotnet new webapi -n slider_api
# 切换到项目目录下
cd slider_api
# 添加两项依赖
dotnet add package System.Drawing.Common
dotnet add package YoloDotNet

2. 创建控制器,用于计算滑块位置并返回。几个需要注意的点:

  • 创建Yolo模型时OnnxModel参数应设置为第一步中训练好的模型文件。
  • 模型识别结果是一个BoundingBox对象,不是坐标位置,需要手动处理。BoundingBox类型为SKRectI,可以理解为一个矩形。观察BoundingBox中的属性值有Left、Right、Top、Bottom、Width等。那么缺口在背景图中的中心点的X坐标轴计算方式应该为Left+(Width/2)。
  • 实验中计算出的X轴坐标与手动拖动滑块的真实坐标可能会有一个误差,但若干次测试后观察到这个误差波动不大,在一个比较固定的范围内。因此计算出的坐标值需要调整,调整值是多少?用相同的验证码图片分别在真实环境和模型中测试,得到一组数据计算出平均值,本例只取了10来组数据。
  • 模型会返回一对坐标数据,本案例中只有X轴坐标的位置会用于验证,因为验证码的背景图和滑块图的高度是完全一样的,鼠标拖过中滑块只会横向移动。

核心代码:

    [ApiController][Route("api/yolo")]public class YoloController : ControllerBase{private Yolo yolo;public YoloController(){yolo = new Yolo(new YoloOptions{OnnxModel = $"e:/4-code-space/82.yolo/models/slider.onnx",ModelType = ModelType.ObjectDetection,Cuda = false,GpuId = 0,PrimeGpu = false,});}[HttpPost]public IActionResult Detect([FromForm] IFormFile image){try{using var memoryStream = new MemoryStream();image.CopyTo(memoryStream);var imageBytes = memoryStream.ToArray();using var imageStream = new MemoryStream(imageBytes);using var skBitmap = SKBitmap.Decode(imageStream);using var skImage = SKImage.FromBitmap(skBitmap);var results = yolo.RunObjectDetection(skImage, confidence: 0.25, iou: 0.7);int x = results[0].BoundingBox.Left + (results[0].BoundingBox.Width / 2);x-=20;//同图片相比wq yolov5的结果对比,平均需要减20Console.WriteLine($"识别结果:{x}");return Ok(x);}catch (Exception ex){Console.WriteLine($"识别错误:{ex.Message}");return BadRequest(ex.Message);}}}

3. 将http请求路由到控制器,修改Program.cs,在app.Run()前面加一句app.MapControllers()。本项目sdk版本为8.0.403。

 三、验证模型计算结果

1. 根据第二步计算出的结果模拟生成验证数据,按照接口要求的数据格式拼接http报文发往服务端验证识别结果是否正确。打开chrome开发者工具观察真实验证数据,多次实验踩坑后总结验证数据有以下特征:

  • 滑块验证码的验证是在服务端进行的,鼠标拖动滑块过程中会产生一系列轨迹数据,这个轨迹数据记录是js实现的,验证过程中将验证码id和轨迹数据一并发往服务端,服务端验证通过返回目标数据。

  • 轨迹数据有4个属性x、y、t、type,分别表示横坐标、纵坐标、时间、鼠标动作(down、move、up)。

  • y坐标值不会参与验证,但轨迹数据中y值不是恒定不变的。因为横向拖动鼠标形成的不是绝对的横线而是近似横线,最终的y值是围绕0上下波动的,但波动范围不能太大。

  • 轨迹数据的t值的间距由小变大,再由大变小。因为拖动滑块是由慢到快,再由快到慢最终停止的过程。最后一个轨迹点的x值只需要接近真实值即可。

  • 轨迹数据的x值由0逐渐增大到接近实际值(模型返回的缺口位置),接近后还可以再小距离反向远离实际值。因为真实环境中滑块可能拖动过度再回调。

    按上以分析生成模拟数据,java实现代码如下:

private List<MouseTrajectory> generateTrajectory(Integer width) {List<MouseTrajectory> trajectories = new ArrayList<>();Random random = new Random();int x = 0, y = 0, tmp = 0, t = 0;t = random.nextInt(50) + 50;// 按下鼠标trajectories.add(new MouseTrajectory(x, y, "down", t));// 拖动鼠标while (x < width) {x += random.nextInt(5) + 2;tmp = random.nextInt(100) % 4;if (tmp == 0) {y = random.nextInt(7) - 3;}t += random.nextInt(60) + 20;if (x > width) {x = width;}trajectories.add(new MouseTrajectory(x, y, "move", t));}// 释放鼠标trajectories.add(new MouseTrajectory(x, y, "up", t));return trajectories;
}

2. 将生成的轨迹数据和其它查询参数按照目标接口格式组装后发往服务端。http报文的header值保持跟chrome开发者工具中的数据完全一致,尽量模拟真实环境。最终得到正确的服务端响应,这个案例中的返回数据是json格式字符串的base64编码值,需要再解码。

为了不暴露案例中的系统接口地址,只截图小部分返回数据和模拟生成的轨迹数据:

总结实验成功的两个关键点:

1. 模型识别准确。训练模型用了真实环境验证码图片约300张。

2. 轨迹验证数据尽量接近真实数据。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834544.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地oracle数据库实例启动报错 TNS-12545 TNS-12560 TNS-00515

oracle 实例启动报错 TNS-12545 TNS-12560 TNS-00515 具体提示如下: 监听该对象时出错: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host.docker.internal)(PORT=1521))) TNS-12545: 因目标主机或对象不存在, 连接失败 TNS-12560: TNS: 协议适配器错误 TNS-00515: 因目标主机…

jenkinsfile

k8s集群中用的jenkinsfile部署 java后台项目# x项目 test-java-eladmin-ci// harbor镜像仓库地址和密码信息 def registry = "harbor.solomon.com" // jenkins中定义的连接harbor的用户名密码凭据 def registry_se = "d2318c77-8a32-4618-bced-d6cabb0454b4&quo…

[网鼎杯 2018]Fakebook 1

[网鼎杯 2018]Fakebook 1 打开实例发现为博客列表,有登录跳转和类似注册或者添加博客的join跳转查看源码无果 打开登陆页,尝试万能密码没有用,尝试从join入手,用admin去随便join一个显示博客不存在 期间尝试多种sql注入方法均没有效果,转去其他方向 尝试dirsearch目录爆破…

【Adobe Premiere pro 2025下载与安装教程】

1、安装包「Adobe Premiere Pro 2025」: 链接:https://pan.quark.cn/s/e93beb96accb 提取码:CGY2 2、安装教程 1) 下载软件安装包,打开安装目录,双击Setup.exe安装,弹出安装对话框2) 选择安装目录,尽量不要选C盘,点击继续3) 等待安装过程完成,点…

人工智能同样也会读死书----“过拟合”

上一篇:《“嵌入”在大语言模型中是解决把句子转换成向量表示的技术》 序言:我们常常会说某某人只会“读死书”,题目稍微变一点就不会做了。这其实是我们人类学习中很常见的现象。可是你知道吗?人工智能其实更容易“读死书”。不过在人工智能领域,我们有个听起来高大上的说…

D45XT80-ASEMI电机专用整流桥D45XT80

D45XT80-ASEMI电机专用整流桥D45XT80编辑:ll D45XT80-ASEMI电机专用整流桥D45XT80 型号:D45XT80 品牌:ASEMI 封装:DXT-5 特性:插件桥堆 正向电流:45A 反向耐压:800V 恢复时间:>2000ns 引脚数量:5 芯片个数:4 芯片尺寸:50MIL 浪涌电流:450A 漏电流:>10uA 工作温…

【Adobe Acrobat pro 2024软件下载与安装教程-PDF编辑神奇】

1、安装包 「Adobe Acrobat 2024」: 链接:https://pan.quark.cn/s/86f8683afe5c 提取码:4uur 2、安装教程(建议关闭杀毒软件和系统防护) 1) 下载软件安装包,打开安装目录,双击Setup.exe安装,弹出安装对话框2) 点击安装按钮3) 正在安装4) 安装…

书生共学大模型训练营第4期 L1G200任务提交

MindSearch搜索引擎示例书生浦语对话模型调用示例书生万象开源视觉语言模型调用实例进阶任务:MindSearch话题挑战 https://www.zhihu.com/people/zhang-shu-yang-92-96

使用nvm管理多版本node的详细教程

在开发工作中,经常在不同的项目中使用不同版本的node去开发,换一个项目在重新安装node太麻烦,所以使用nvm来管理多版本的node开发环境,就非常方便了,所以本文给大家介绍了如何使用nvm管理多版本node,需要的朋友可以参考下前言 在开发工作中,经常在不同的项目中使用不同版本的n…

Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.5-2024111401 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Nov 14, 2024 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

.ts文件和d.ts文件对比

TS中有俩种文件类型,一种是.ts文件,一种是.d.ts文件 .ts文件 既可以包含类型信息也可以写逻辑代码 可以被编译为js文件 .d.ts文件 只能包含类型信息不可以写逻辑代码 不会被编译为js文件,仅做类型校验检查 自定义类型声明文件 d.ts文件在项目中是可以进行自定义创建的,通常…

Ubuntu Server 20.04 安装MySQL

1. 通过apt安装MySQL1 #命令1 2 sudo apt-get update 3 #命令2 4 sudo apt-get install mysql-server2. 配置mysql初始化信息1 sudo mysql_secure_installation配置说明:ubuntu@VM-0-10-ubuntu:~$ sudo mysql_secure_installationSecuring the MySQL server deployment.Connec…