基于YOLO实现滑块验证码破解
申明:本案例中的思路和技术仅用于学习交流。请勿用于非法行为。
一、训练模型
详细训练步骤和导出模型参考 滑块验证码识别模型训练
二、模型试用
通过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实现滑块验证码破解的更多相关文章
- 爬虫笔记之w3cschool注册页面滑块验证码破解(巨简单滑块位置识别,非鼠标模拟轨迹)
一.背景介绍 最开始接触验证码破解的时候就是破解的w3cschool的使用手机号找回密码页面的验证码,详见:验证码识别之w3cschool字符图片验证码(easy级别),这次破解一下他们注册页面的滑块 ...
- 使用 Python+Selenium 破解滑块验证码
开发工具 Python版本:3.6.4 相关模块: pillow模块: selenium模块: numpy模块: 以及一些Python自带的模块. 其他: chromedriver 环境搭建 安装 ...
- 使用Python + Selenium破解滑块验证码
在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...
- python3 破解 geetest(极验)的滑块验证码
Kernel_wu 快速学习的实践者 python3 破解 geetest(极验)的滑块验证码 from selenium import webdriver from selenium.webdriv ...
- 爬虫进阶教程:极验(GEETEST)验证码破解教程
摘要 爬虫最大的敌人之一是什么?没错,验证码!Geetest作为提供验证码服务的行家,市场占有率还是蛮高的.遇到Geetest提供的滑动验证码怎么破?授人予鱼不如授人予渔,接下来就为大家呈现本教程的精 ...
- 温习数据算法—js滑块验证码
前言 大多数的应用软件都需要输入一些验证码,验证码的样式也多种多样. 比如抢票,提交订单需要验证码,很多人就纳闷了,怎么还需要验证码呢?这不是浪费时间嘛. 存在即合理,合理就是现实的. 源码下载地址+ ...
- atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...
- [ASP.NET] 图形验证码破解-以简单图形为例
原文 http://www.dotblogs.com.tw/joysdw12/archive/2013/06/08/captcha-cracked.aspx 前言 这次来讲个比较有趣的主题,就是该如何 ...
- 基于NDK的Android防破解& Android防破解 【转载】
两篇防破解文章转载 基于NDK的Android防破解:http://blog.csdn.net/bugrunner/article/details/8634585 Android防破解:http:// ...
- 验证码破解 | Selenium模拟登陆12306
12306官网登录的验证码破解比较简单,验证码是常规的点触类型验证码,使用超级鹰识别率比较高. 思路: (1)webdriver打开浏览器: (2)先对整个屏幕截屏,通过标签定位找到验证码图片,并定位 ...
随机推荐
- mysql 5.7密码修改
官网下载安装包:https://dev.mysql.com/downloads/mysql/ 一.停止mysqld服务 二.编辑配置文件 有的Linux版本是/etc/my.cnf 有的Linux版本 ...
- win7安装snmp服务
一.安装SNMP Win7操作系统默认情况下是不安装SNMP服务的,今天讲解一下在Win7操作系统下安装SNMP,具体安装步骤如下: 打开控制面板--卸载程序 WIN7操作系统下安装SNMP的步骤如下 ...
- C语言基础函数
C语言 文件操作 fopen(filename, "r") // 只读模式打开文件 -r // 只读 -w // 可写 -b // 二进制 fgetc(fd) // 从fd获取ch ...
- 初三奥赛模拟测试1--T1回文
初三奥赛模拟测试1--\(T1\)回文 HZOI 题意 给定一个 \(n \times m\) 的,由字符组成的矩阵 \(A\) , 问你由 \(( 1 , 1 )\) 开始,点 \(( i , j ...
- 充分利用HarmonyOS NEXT:开发者的全功能指南
随着技术的不断进步,开发者们面临着如何在复杂的技术环境中创造出卓越应用的挑战.在当今的科技浪潮中,如何抓住创新的机遇?HarmonyOS NEXT的发布,带来了全新的机遇和功能.本文将探讨开发者如何充 ...
- KNN算法 0基础小白也能懂(附代码)
KNN算法 0基础小白也能懂(附代码) 原文链接 1.K近邻是啥 1968年,Cover 和 Hart 提出了最初的近邻法,思路是--未知的豆离哪种豆最近,就认为未知豆和该豆是同一种类. 近邻算法的定 ...
- Mac 上几款 Telegram App 的区别
Mac App Store 上有 Telegram 和 Telegram Lite 两款应用,而 Homebrew 上有 telegram 和 telegram-desktop 两款应用.下面介绍一下 ...
- Drools与动态加载规则文件
Drools与动态加载规则文件 Drools简介 对系统使用人员来说: 对开发人员来说: Drools架构图 快速开始 Drools简介 Drools是一款基于Java的开源规则引擎,将规则与业务代码 ...
- python3实现url全编码/解码
最近在学习SQL注入,绕过方法中有编码注入绕过,需要将关键词进行全编码,百度了一下没有找到全编码工具,所有的编码工具里"and"编码完还是"and",于是查了一 ...
- Docker镜像源地址
Docker镜像源地址(1)官方镜像:https://registry.docker-cn.com(2)网易镜像:http://hub-mirror.c.163.com(3)清华大学:https:// ...