使用OpenCV 破解QQ登录中的滑动验证码

系列文章目录

第一篇: Java实现QQ登录

第二篇: Selenium QQ自动化登录

第三篇: 使用OpenCV 破解QQ登录中的滑动验证码


 

文章目录

系列文章目录

文章目录

前言

一、登录流程

二、验证办法

1.滑动验证码

2.获取缺口坐标

2.1 获得两张验证码的url

2.2 处理图片获得x坐标

2.3 调用结果

总结



 

前言

前面几篇文章中介绍了在安全状态下,QQ登录的几种方法,但是只要是,该账号登录在新IP上,或用新账号登录本IP,都会使得登录流程转向非安全状态,即会有图片验证码,如下:


提示:以下是本篇文章正文内容,下面案例可供参考

一、登录流程

如我在第一篇文章中介绍那样:Java实现QQ登录,会多出几个请求,其中我们会看到又两个img的请求:

而这两个请求正是获得验证码图片和图片缺口的接口。

二、验证办法

1.滑动验证码

当我们拖动滑块并停止时,会向后台发送一个cap_union_new_verify的请求,这个request的data里,又这样一个关键的数据,ans

 

经过分析得知,这个ans的值,正式滑动验证码中缺口图片在原图中的位置,那么我们只要能获得这个缺口坐标,即可获得正确request data。

2.获取缺口坐标

我们使用OpenCV来处理图片

2.1 获得两张验证码的url

大图:

https://t.captcha.qq.com/hycdn?index=1&image=937349372142954496?aid=21000501&sess=s0QmzAR9jp0J_P9zQf6-BikkZVSLAm3IZz9JBiMAkRnqiQQ-ehtcopO3OYgJzF9ZLrA1B6phmWOrNtG1YEarWRA9wRp2gHvMW9lzGN5bZgFvIdgvL1ljAEcUq-ASo3WNABJPoMJP-UWSkRsimXX2wetiGFbUg7pMjUYGBPJAUxL8gCiyRnbKExWMrjyzVu4onNqzoxRU4_Ou9jexaVzeERJRo-WahiuPG2NyiohF5390zOVQ1tmDAmDg**&sid=607792806632235317&img_index=1&subsid=9

缺口图:

https://t.captcha.qq.com/hycdn?index=2&image=937349372142954496?aid=21000501&sess=s0QmzAR9jp0J_P9zQf6-BikkZVSLAm3IZz9JBiMAkRnqiQQ-ehtcopO3OYgJzF9ZLrA1B6phmWOrNtG1YEarWRA9wRp2gHvMW9lzGN5bZgFvIdgvL1ljAEcUq-ASo3WNABJPoMJP-UWSkRsimXX2wetiGFbUg7pMjUYGBPJAUxL8gCiyRnbKExWMrjyzVu4onNqzoxRU4_Ou9jexaVzeERJRo-WahiuPG2NyiohF5390zOVQ1tmDAmDg**&sid=607792806632235317&img_index=2&subsid=10

url中最重要的参数sess可从上一个请求:cap_union_prehandle中的response中获得。

验证码的图有时间限制,一段时间后会过期

 

2.2 处理图片获得x坐标

因为滑块是左右滑动的,所以y坐标固定,我们先滑动一下获得他的y坐标,本例中的y坐标是41。

使用下面程序:

    // 加载opencv环境public static String dllPath = "D:\\workcode\\txslider\\src\\main\\resources\\opencv\\opencv_java3413.dll";/*** 获取验证滑动距离** @return*/public static int getTencentDistance(String bUrl, String sUrl, int top) {System.load(dllPath);File bFile = new File("D:\\cap_union_new_getcapbysig.jpg");File sFile = new File("D:\\cap_union_new_getcapbysig.png");try {FileUtils.copyURLToFile(new URL(bUrl), bFile);FileUtils.copyURLToFile(new URL(sUrl), sFile);BufferedImage bgBI = ImageIO.read(bFile);BufferedImage sBI = ImageIO.read(sFile);// 裁剪bgBI = bgBI.getSubimage(360, top, bgBI.getWidth() - 370, sBI.getHeight());ImageIO.write(bgBI, "png", bFile);Mat s_mat = Imgcodecs.imread(sFile.getPath());Mat b_mat = Imgcodecs.imread(bFile.getPath());// 转灰度图像Mat s_newMat = new Mat();Imgproc.cvtColor(s_mat, s_newMat, Imgproc.COLOR_BGR2GRAY);// 二值化图像binaryzation(s_newMat);Imgcodecs.imwrite(sFile.getPath(), s_newMat);int result_rows = b_mat.rows() - s_mat.rows() + 1;int result_cols = b_mat.cols() - s_mat.cols() + 1;Mat g_result = new Mat(result_rows, result_cols, CvType.CV_32FC1);Imgproc.matchTemplate(b_mat, s_mat, g_result, Imgproc.TM_SQDIFF); // 归一化平方差匹配法// 归一化相关匹配法Core.normalize(g_result, g_result, 0, 1, Core.NORM_MINMAX, -1, new Mat());Core.MinMaxLocResult mmlr = Core.minMaxLoc(g_result);Point matchLocation = mmlr.maxLoc; // 此处使用maxLoc还是minLoc取决于使用的匹配算法Imgproc.rectangle(b_mat, matchLocation,new Point(matchLocation.x + s_mat.cols(), matchLocation.y + s_mat.rows()), new Scalar(0, 0, 0, 0));return (int) ((matchLocation.x + s_mat.cols() + 360 - sBI.getWidth()));} catch (Throwable e) {e.printStackTrace();return 0;} finally {bFile.delete();sFile.delete();}}/**** @param mat*  二值化图像*/public static void binaryzation(Mat mat) {int BLACK = 0;int WHITE = 255;int ucThre = 0, ucThre_new = 127;int nBack_count, nData_count;int nBack_sum, nData_sum;int nValue;int i, j;int width = mat.width(), height = mat.height();// 寻找最佳的阙值while (ucThre != ucThre_new) {nBack_sum = nData_sum = 0;nBack_count = nData_count = 0;for (j = 0; j < height; ++j) {for (i = 0; i < width; i++) {nValue = (int) mat.get(j, i)[0];if (nValue > ucThre_new) {nBack_sum += nValue;nBack_count++;} else {nData_sum += nValue;nData_count++;}}}nBack_sum = nBack_sum / nBack_count;nData_sum = nData_sum / nData_count;ucThre = ucThre_new;ucThre_new = (nBack_sum + nData_sum) / 2;}// 二值化处理int nBlack = 0;int nWhite = 0;for (j = 0; j < height; ++j) {for (i = 0; i < width; ++i) {nValue = (int) mat.get(j, i)[0];if (nValue > ucThre_new) {mat.put(j, i, WHITE);nWhite++;} else {mat.put(j, i, BLACK);nBlack++;}}}// 确保白底黑字if (nBlack > nWhite) {for (j = 0; j < height; ++j) {for (i = 0; i < width; ++i) {nValue = (int) (mat.get(j, i)[0]);if (nValue == 0) {mat.put(j, i, WHITE);} else {mat.put(j, i, BLACK);}}}}}

 

主要思想为:根据传入的y坐标和两个图片的url,将网络上的图片先保存在本地,然后对大图进行切图,减少一些计算量,然后二值化两张图,接着使用归一化相关匹配法,计算出切图后的x距离,最后加上原来的x距离,即可得到最终的x坐标。

 

2.3 调用结果

getTencentDistance("https://t.captcha.qq.com/hycdn?index=1&image=937349372142954496?aid=21000501&sess=s0QmzAR9jp0J_P9zQf6-BikkZVSLAm3IZz9JBiMAkRnqiQQ-ehtcopO3OYgJzF9ZLrA1B6phmWOrNtG1YEarWRA9wRp2gHvMW9lzGN5bZgFvIdgvL1ljAEcUq-ASo3WNABJPoMJP-UWSkRsimXX2wetiGFbUg7pMjUYGBPJAUxL8gCiyRnbKExWMrjyzVu4onNqzoxRU4_Ou9jexaVzeERJRo-WahiuPG2NyiohF5390zOVQ1tmDAmDg**&sid=607792806632235317&img_index=1&subsid=9","https://t.captcha.qq.com/hycdn?index=2&image=937349372142954496?aid=21000501&sess=s0QmzAR9jp0J_P9zQf6-BikkZVSLAm3IZz9JBiMAkRnqiQQ-ehtcopO3OYgJzF9ZLrA1B6phmWOrNtG1YEarWRA9wRp2gHvMW9lzGN5bZgFvIdgvL1ljAEcUq-ASo3WNABJPoMJP-UWSkRsimXX2wetiGFbUg7pMjUYGBPJAUxL8gCiyRnbKExWMrjyzVu4onNqzoxRU4_Ou9jexaVzeERJRo-WahiuPG2NyiohF5390zOVQ1tmDAmDg**&sid=607792806632235317&img_index=2&subsid=10",41)

调用getTencentDistance方法,传入大图和缺口图的地址,并传入y坐标。

最终结果为:

而实际y坐标为

相差6个像素点,在可接受范围内。


 

总结

本文主要介绍了用opencv,来识别滑动验证码中,缺口图片相对背景图的x坐标,获得了x坐标位置,即可模拟手动滑动,完成验证码的突破,结合前面几篇文章,即可完成有验证码情况下的登录。

 

当然还有更方便的方式,即通过Selenium自动模仿人手动滑动的方法,这种方法将在下篇文章中介绍。

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java程序破解qq闪图

1.找到闪图存放的位置/sdcard/tencent/MobileQQ/diskcache 下面 就是这些&#xff08;但是这不全是qq闪图的照片 而是缓存&#xff09; 有些手机有时间排序&#xff0c;如果是刚发的闪图 可以通过时间排序&#xff0c;直接手机上通过图片打开方式查看 但是我的红米手机没有这…

尚硅谷大数据hadoop教程_yarn

p125 课程介绍 p126 yarn基础架构 YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。 p127 工作机制 &#xff08;1&#xff09;MR程序提交到客户端所在的节点。 &#xff08;2&#xff09;YarnRunner向ResourceManager申请一个Applicatio…

【Java基础】I/O流 —— Java中的流都需要关闭吗?

目录 一、为什么要关闭流&#xff1f;二、close方法和flush方法1.使用close方法2.使用flush方法 三、流按指向分类四、不用关闭的流 一、为什么要关闭流&#xff1f; 涉及到对外部资源的读写操作&#xff0c;包括网络、硬盘等等的I/O流&#xff0c;如果在使用完毕之后不关闭&a…

【Linux】还在用top命令?可以试试atop工具,信息一目了然,运维工程师的新选择

atop使用 Linux以其稳定性&#xff0c;越来越多地被用作服务器的操作系统(当然&#xff0c;有人会较真地说一句&#xff1a;Linux只是操作系统内核:)。但使用了Linux作为底层的操作系统&#xff0c;是否我们就能保证我们的服务做到7*24地稳定呢&#xff1f;非也&#xff0c;要…

鲁大师5月新机性能/流畅/久用榜:蓝绿厂霸榜,天玑9200+与高通骁龙8 Gen2迎来首次交锋

性能榜 6.18年中购物节前夕&#xff0c;一众厂商开始扎堆发布新机冲销量&#xff0c;也导致本月的新发机型数量达到了19款。 从品牌来看&#xff0c;ov两家和其子品牌、独立品牌就占据了十二台。从机型定位来看&#xff0c;本月的手机竞争主要围绕中端市场&#xff0c;除了索尼…

BUUCTF misc 专题(49)穿越时空的思念

下载下来是一段音频&#xff0c;听了一下&#xff0c;大致能听出来点东西&#xff0c;将它放入Audacity或者Audition 我这里是放入了Audition 可以明显地看到有摩斯密码&#xff0c;手动敲下来并用在线网站解码 再将它转化成小写&#xff08;可以使用python&#xff09;&#…

想你,淡淡的思念

2019独角兽企业重金招聘Python工程师标准>>> 淡淡的夜&#xff0c;思念是风&#xff0c; 将我的心吹向你的身边&#xff0c; 淡淡的夜&#xff0c;牵挂是雨&#xff0c; 将我的爱抛向你的脚下。 淡淡的夜&#xff0c;你在那里? 你在遥远的天边&#xff0c; 淡淡的月…

思念到极致时什么感觉?(1)

故事一&#xff1a; 跟交往了四年的初恋分手后&#xff0c; 他去了北京&#xff0c; 我没找任何同伴独自去了那里&#xff0c; 下车的一瞬间我哭了&#xff0c; 想象着他曾经在这里出现过&#xff0c; 也曾挤在拥挤的人群中。 后来哭累了回到酒店&#xff0c; 翻看着他的朋友圈…

500道网络安全/WEB安全面试题合集!附答案解析

前言 随着国家政策的扶持&#xff0c;网络安全行业也越来越为大众所熟知&#xff0c;想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外&#xff0c;除了学好网络安全知识以外&#xff0c;还要应对好企业的面试。 作为一个安全老鸟&#xff0c;工作这么多年…

能用excel批量提取网页内特定数据吗?

这个需求其实是采集数据&#xff0c;用第三方软件比较合适&#xff0c;当然&#xff0c;用excel也可以批量提取网页内特定文字。请按照以下步骤操作&#xff1a; 1. 打开要提取的网页&#xff0c;并选中要提取的文字&#xff0c;例如一个表格里的数据。 2. 复制选中的文字。 …

新浪微博 mysql_新浪微博,腾讯微博mysql数据库主表猜想

用户信息表(t_user_info)字段名称字节数类型描述 User_id4uint32用户编号(主键) User_name20Char[20]名称 Msg_count4uint32发布消息数量,可以作为t_msg_info水平切分新表的auto_increment Fans_count4uint32粉丝数量 Follow_count4Uint32关注对象数量 备注&#xff1a;以User_…

android微博客户端下载,iBeebo微博客户端

iBeebo微博客户端是一款免费的开源微博客户端&#xff0c;比起官方的手机客户端这款应用显然要小巧的多&#xff0c;它没有那些多余的无用功能。iBeebo微博客户端支持私信&#xff0c;你还可以查看热门话题和热门微博&#xff0c;喜欢的朋友不要错过哦!赶紧来最火软件站点击iBe…

2022年12月最新微博新版批量删除微博博文代码_删除清空微博博文的微博批量删除代码与方法

2022年12月微博新版本界面批量删除微博博文的方法 2022最新批量删除微博丨怎么一键批量删除微博与删除关注? 本教程为&#xff1a;一键批量删除新浪微博以前发过的微博(作者&#xff1a;当时我就没憋住) 新浪微博本身不提供批量删除微博的方法&#xff0c;&#xff0c;下面就…

基于IOS的仿微博系统

这份需求说明书的目的是直接对基于MVC模式的微博系统进行需求分析和系统总体设计服务。本说明书面向的读者是进行需求分析的人员和进行系统总体设计的人员。在开发的时候做了ppt、演示视频源码等需要可联系企鹅&#xff1a;2415273018。主要工作是设计实现一款个性化的基 于iOS…

微博java版_新浪微博JAVA通用版

这是新浪微博JAVA通用版&#xff0c;专为JAVA用户打造。无论您身处何地&#xff0c;随时随地记录生活的点点滴滴&#xff0c;与好友分享。 软件介绍 新浪微博JAVA通用版是专为Java平台用户打造的新浪微博手机客户端&#xff0c;功能强大。完全支持阅读、发布、评论、转发、私信…

android 微博发布,手机上怎么用微博?手机如何发广播?

1 如何安装Android微博 Android微博可以通过以下两种方式进行安装&#xff1a;在Android market中下载腾讯微博Android版进行安装 在腾讯微博官网下载apk文件进行安装 2 腾讯微博Android客户端&#xff0c;可以用邮箱地址注册微博帐号吗&#xff1f; 非常抱歉&#xff0c;目前A…

腾讯微博android版本,腾讯微博

安装与下载 1 如何获取一个腾讯微博iPhone客户端&#xff1f; 首先请确认您已经拥有了一个iTunes帐号&#xff0c;可以通过该帐号在App store中下载应用。(如何获取该帐号了解更多) 您可以通过电脑中的iTunes软件将下载到电脑的腾讯微博iPhone客户端同步到您的iPhone中 您也可以…

用计算机上发微博,电脑版新浪微博怎么使用?新浪微博基本使用方法介绍

新浪微博能在第一时间传递最新消息&#xff0c;消息传播速度快、信息量大&#xff0c;在这里可以了解最新信息&#xff0c;可以学习经验&#xff0c;可以找到喜爱的各种小组&#xff0c;深受现代生活人们的喜爱&#xff0c;而新浪微博自2009年开始公测以来&#xff0c;已经拥有…

前端自动化测试基础概念与方案

测试的类型 常见的测试类型主要有以下几种&#xff1a; 单元测试&#xff1a;验证独立单元是否能正常工作集成测试&#xff1a;验证多个单元协同工作端到端测试&#xff1a;从用户角度以机器的方式在真实浏览器环境验证应用交互快照测试&#xff1a;验证程序的UI变化 单元测…

第1章:SpringMVC简介

一、SpringMVC 1.Java语言学习流程 2.SpringMVC的主要内容 二、SpringMVC简介 1.什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型&#xff0c;视图&#xff0c;控制器划分M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用…