首页 > 其他分享 >基于YOLO实现滑块验证码破解

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

时间:2024-11-16 12:20:34浏览次数:1  
标签:轨迹 滑块 模型 YOLO 验证码 new 数据

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

一、训练模型

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

二、模型试用

通过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的结果对比,平均需要减20
                Console.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. 轨迹验证数据尽量接近真实数据。

 

标签:轨迹,滑块,模型,YOLO,验证码,new,数据
From: https://www.cnblogs.com/cy2011/p/18549017

相关文章

  • 手机验证码漏洞挖掘(任意手机号注册,任意用户密码重置等等)
    一.短信验证码爆破漏洞挖掘1.漏洞原理服务端未对验证时间,次数做出限制,存在爆破的可能性。简单的系统可以直接爆破,但做过一些防护的系统还得进行一些绕过进行爆破。对与4位验证码:0000~9999的10000次,五分钟之内。对于6位验证码:1000000位,五分钟之内跑不完。2.爆破方法(没有次......
  • 使用 Tcl 实现滑动验证码识别
    滑动验证码是一种常见的验证方式,用于验证用户操作的真实性。以下是使用Tcl实现滑动验证码识别的简单示例。功能概述程序的主要功能包括:读取滑动验证码的图片。分析滑块与缺口位置。模拟滑块移动,完成验证。代码实现tcl引入必要的库packagerequireImgpackagerequire......
  • 使用 Chapel 实现滑动验证码识别
    滑动验证码识别是一种基于图像处理的技术,用于识别滑块的缺口位置。本篇文章将演示如何使用Chapel语言实现一个简单的滑动验证码识别程序。Chapel简介Chapel是一种并行编程语言,适合数据密集型计算任务。我们可以利用其强大的数组和数据处理能力完成图像分析。环境准备安装Ch......
  • 使用 Neko 编程语言实现简单的滑动验证码识别
    滑动验证码是一种常见的安全验证方式,要求用户将图块拖动到正确位置。本文将使用Neko编程语言实现一个简单的滑动验证码识别程序,通过基本的图像处理技术自动识别图块匹配位置。实现步骤加载图片:使用Neko的图像处理库加载滑块和背景图片。图像预处理:转换为灰度图并进行边缘......
  • yolov8环境配置安装
    声明:本教程基于已经成功安装了anaconda的基础上完成1.首先在anacondaprompt里面输入以下命令,环境名称可以自己起,python版本可以根据自己的要求设定。2.运行上方命令之后会出现以下内容,输入y即可3.安装成功后,用下面命令进入你的虚拟环境,可以看右侧小图,此时环境已经由bas......
  • 【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性
    【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析…【深度学习目标检测|YOLO算法5-2-3】YOLO家族进化史:从YOLOv1到YOLOv11的架构创新、性能优化与行业应用全解析…文章目录【深度学习目标检测|YOLO算法5-2-3......
  • Docker环境搭建CUDA12.2 + Yolov5 7.0 GPU训练环境(单卡训练)
    1、建立Docker容器,指定Shm共享内存。dockerrun-d-it--nameyolov5--gpusall-p20000:22--shm-size16gdockerproxy.cn/nvidia/cuda:12.2.0-devel-ubuntu22.042、进入容器,升级安装器aptdockerexec-itf7383b766c6d/bin/bashapt-getupdateapt-getinstallvim3......
  • 基于yolov10的柿子成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:yolov10,柿子成熟度检测系统,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的柿子成熟度检测系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的......
  • YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构
    摘要大规模视觉预训练显著提高了大规模视觉模型的性能。现有的低FLOPs模型无法从大规模预训练中受益。在本文中,作者提出了一种新的设计原则,称为ParameterNet,旨在通过最小化FLOPs的增加来增加大规模视觉预训练模型中的参数数量。利用DynamicConv动态卷积将额外的参......
  • YOLOv8改进,YOLOv8结合DynamicConv(动态卷积),CVPR2024,二次创新C2f结构
    摘要大规模视觉预训练显著提高了大规模视觉模型的性能。现有的低FLOPs模型无法从大规模预训练中受益。在本文中,作者提出了一种新的设计原则,称为ParameterNet,旨在通过最小化FLOPs的增加来增加大规模视觉预训练模型中的参数数量。利用DynamicConv动态卷积将额外的参......