淘宝滑动验证码研究

2023-11-12

引言

悠闲的时候,总会去找些事做做。前些天在登录淘宝的时候,发现了滑动验证码,虽然已经不是什么新事物,但还是产生了很大的兴趣。

 

传统的字符输入验证码,变为了滑动验证码,这一看就是产品大师的手笔啊,不知道申请专利没有。

这种“情感化”的验证码设计,可破解度高不高呢?如果是可破解度高,那就真是验证码的一次革命变新了。还是让我先了解一下滑动验证码的资料吧!

没有Google就百度,搜一搜,让我很震惊,一般搜技术的东西,大多数来源于csdn,blogs.cn,更牛批一点的是来源于stackoverflow,这次居然来自于知乎,这颠覆了我对知乎的看法。

https://www.zhihu.com/question/32209043/answer/55252171

http://www.zhihu.com/question/35538123

特别是第二个链接里有一个评论,对我有很重要的启示,原话为

响应时间,拖拽速度,时间,位置,轨迹,重试次数等。
这些因素能够构成一个采样结果或者辨识特性。

这下算是知道了,要破解这种验证码,就要用鼠标去模拟滑动。我再来分析淘宝验证码时,发现淘宝的登录验证码是随机的,并且有一个很明显的延迟加载。

为破解淘宝的滑动验证码,我梳理了一个整个过程。

1,判断验证码在什么时候出现。

2,验证码出现时,判断何时加载完成。

3,确定验证码的位置。

4,用鼠标模拟拖动验证码。

5,检验本次操作是否成功。

下文,就是我针对这5个步骤,一步一步的去实现淘宝验证码的破解。

 一:判断验证码在什么时候出现

 要想知道滑动验证码在什么时候出现,就显得非常简单了,用firefox一看,只要会点html的人,一下就明白了。

 

经过换电脑,换浏览器,清缓存的反复验证,发现:有验证码时候与有没验证码时,HTML的区别在于

<!--无验证码-->
<div id=imgCaptcha></div>

<!--有验证码-->
 <div id=imgCaptcha style="HEIGHT: 339px; MIN-HEIGHT: 0px; TOP: -202px"></div>

我在写程序的时候,就是根据这两行代码的区别来分辨本次登录是否需要验证码。

二:验证码出现时,判断何时加载完成

        这个问题最先是困扰着我的,这个验证码是通过ajax加载的,一个外部程序去判断一个网页的ajax请求是否加载完成,显然是有难度的,我搜了些资料,没找到一个合适的方法。

        随后我变了一种思路,我发现正在加载验证码的时候,span标签里的文字是‘加载中’,加载成功后,span的文字变为了 ‘请按住滑块,拖动到最右边’。所以我通过这个区别很轻松的判断了验证码是否已经加载完成了。

        换个思路,问题就简单了。

三:确定验证码的位置

        判断验证码的位置,这是一个真正的难点,且听我娓娓道来。

        验证码X轴 = 浏览器在电脑屏上的X轴  +  验证码在浏览器中的X轴

        验证码Y轴 = 浏览器在电脑屏上的Y轴  +  验证码在浏览器中的Y轴

        我体会到了计算机与数学的关系,虽然只是小学数学。

1,验证码在网页中的位置

        验证码是在网页中的,要先确定验证码在网页中的位置,这时,会javascript的同学就笑了。但是你的javascript要怎样才能注册到淘宝的网页中去呢?显然不太容易,后来我用HtmlDocument对象来确定网页的位置,具体代码如下。

        后来,我发现往淘宝网页注册javascript也是可行的,但还是用第一种吧!解决这个问题我只用一种方法就行了。

/// <summary>
/// 获取验证码的位置
/// </summary>
/// <returns></returns>
private System.Windows.Point GetCaptchaPosition(System.Windows.Forms.HtmlDocument paraHtmlDoc)
{
    System.Windows.Point webControlPoint = default(System.Windows.Point);

    //获取当前控件的所有父控件  Example  html -> body -> form -> div
    List<KeyValuePair<String, HtmlElement>> allElement = new List<KeyValuePair<string, HtmlElement>>();
    HtmlElement currentElement = paraHtmlDoc.GetElementById("TPL_username");
    while (currentElement != null)
    {
        allElement.Insert(0, new KeyValuePair<String, HtmlElement>(currentElement.TagName, currentElement));
        currentElement = currentElement.Parent;
    }

    int webControlX = 0;
    int webControlY = 0;
    for (int i = 0; i < allElement.Count; i++)
    {
        webControlX += allElement[i].Value.OffsetRectangle.X;
        webControlY += allElement[i].Value.OffsetRectangle.Y;
    }
    webControlPoint = new Point(webControlX, webControlY);
    return webControlPoint;
}

2,整个网页在电脑中的位置:

    这个相对于第1点来说,技术上没那么难,但是考虑的问题要多些,屏幕的大小,分辨率的改变,最小化,最大化窗口时,都要去考虑一下。

四:用鼠标模拟拖动验证码      

在c#中模拟鼠标的拖动,我调用了Windows自身的类库,注释我也写的比较详细了,如果实在是有不懂的,也可以互相研究哈!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
//using Microsoft.Win32;

namespace TaoBao.ClientWPFApp
{
    public class Win32Mouse
    {
        //鼠标移动
        //dX和dy保留移动的信息。给出的信息是绝对或相对整数值。
        public static readonly int MOUSEEVENTF_MOVE = 0x0001;
        //绝对位置
        //则dX和dy含有标准化的绝对坐标,其值在0到65535之间。
        //事件程序将此坐标映射到显示表面。
        //坐标(0,0)映射到显示表面的左上角,(65535,65535)映射到右下角
        //如果没指定MOUSEEVENTF_ABSOLUTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。
        //正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。
        public static readonly int MOUSEEVENTF_ABSOLUTE = 0x8000;
        public static readonly int MOUSEEVENTF_LEFTDOWN = 0x0002;//左键按下
        public static readonly int MOUSEEVENTF_LEFTUP = 0x0004;//左键抬起
        public static readonly int MOUSEEVENTF_RIGHTDOWN = 0x0008; //右键按下 
        public static readonly int MOUSEEVENTF_RIGHTUP = 0x0010; //右键抬起 
        public static readonly int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //中键按下 
        public static readonly int MOUSEEVENTF_MIDDLEUP = 0x0040;// 中键抬起 

        /// <summary>
        /// 得到光标的位置
        /// </summary>
        /// <param name="pt"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern bool GetCursorPos(out System.Windows.Point pt);

        /// <summary>
        /// 移动光标的位置
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        [DllImport("user32.dll")]
        public static extern void SetCursorPos(int x, int y);

        /// <summary>
        /// 第2个参数应该是为,
        /// </summary>
        /// <param name="dwFlags"></param>
        /// <param name="dx">DX=需要移动的X*65536/取屏幕宽度 ()+1</param>
        /// <param name="dy">DY=需要移动的Y*65536/取屏幕高度 ()+1</param>
        /// <param name="cButtons"></param>
        /// <param name="dwExtraInfo"></param>
        /// <returns></returns>
        [DllImport("user32")]
        public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
    }
}

 五:检验本次操作是否成功

 这个和第一点“判断验证码在什么时候出现”类似,主要比较HTML的差异。如果发现鼠标模拟拖动不成功,就得检验验证码的位置是否正确,以及再模拟拖动鼠标。

 经过反复修改测试,淘宝滑动验证码的破解成功率在100%。最后补一张效果图,有点遗憾的是,我想截图的时候,刷了好几次验证码都没有出来。

后记:

朋友开了网店,在网络里下载些刷单软件经常被骗,听说后我义愤填膺啊,为了公道,必须得开发一个牛批的软件来打击这些骗子。前期功能就实现以下几点:

1,实现自动输入用户名,密码,自动拖拉验证码,实现全自动化淘宝登录。

2,提取淘宝用户的信息,比如等级,收货信息,已购物的订单详情。

3,实现自动搜索商品。

4,实现自动货比三家,添加收藏夹。

5,实现自动网页旺旺聊天。

6,实现自动提交订单。

7,实现付款。

8,自动好评。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

淘宝滑动验证码研究 的相关文章

随机推荐

  • 关于matplotlib及相关cmap参数的取值

    关于matplotlib及相关cmap参数的取值 在matplotlib中对于图片的显示有如下方法 这不是重点 其中有cmap binary 的参数 plt imshow imgs i reshape 28 28 cmap binary 或
  • Linux系统之安装java开发环境

    Linux系统之安装java开发环境 一 java介绍 1 java简介 2 java的三大平台 3 java的主要特性 二 检查本地系统环境 1 检查系统版本 2 检查系统内核版本 三 清空java环境 1 删除java目录 2 移除所有
  • 不高兴的津津1073

    Description 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且上得越久就会越不高兴 假
  • 经典Proxool.properties

    数据库1jdbc 1 proxool alias WEBGISjdbc 1 proxool driver class oracle jdbc driver OracleDriverjdbc 1 proxool driver url jdbc
  • JNLP 文件无法打开的解决办法

    JNLP Java Network Launching Protocol 是 java 提供的一种可以通过浏览器直接执行 java 应用程序的途径 它使你可以直接通过一个网页上的 URL 连接打开一个 java 应用程序 因此 要运行 jn
  • 用户·角色·权限·表

    一 引言 因为做过的一些系统的权限管理的功能虽然在逐步完善 但总有些不尽人意的地方 总想抽个时间来更好的思考一下权限系统的设计 权限系统一直以来是我们应用系统不可缺少的一个部分 若每个应用系统都重新对系统的权限进行设计 以满足不同系统用户的
  • React新特性hooks中memo,usememo,useCallback的区别

    useMemo memo类似于PureCompoent 作用是优化组件性能 防止组件触发重渲染 memo针对 一个组件的渲染是否重复执行
  • 江苏开票系统安全接入服务器地址,江苏省增值税发票查询平台网址.doc

    江苏省增值税发票查询平台网址 江苏省增值税发票查询平台网址 81 增值税发票查询平台于2016年5月27日在全国36个省 市 自治区升级完毕 目前全国统一版本为V2 0 00 新版本上线后 功能更加强大和人性化 为了使广大纳税人能更加正确
  • nginx出现 “414 request-uri too large”

    公司项目有一个模块 在请求查询的时候使用了Get方法 由于拼接的url过长 导致nginx出现了 414 request uri too large 错误 出现这种问题可以按照如下解决 在nginx的nginx conf修改如下参数的 cl
  • git check-pick,git patch 与 git stash 详解

    大家好 我是 17 今天和大家聊一聊 git check pick git patch 与 git stash 的用法 git cherry pick 为什么要用 cherry pick 不适合 merge 的场景就可以考虑 cherry
  • mysql数据库——思维导图

    学完mysql后 自己弄得的思维导图 原图30 6MB 太大了放不上来 这里就放个链接吧 欢迎大家去看 如果有需要改正的地方 请告诉我 谢谢 链接 https www zhixi com view 718f3805 密码 6522 下面是M
  • Android 动态权限判断是否允许的几种方式及测试

    一 说在前面 由于各个系统厂商定制 checkSelfPermission在有些机型上是始终为0的 也就是允许 这个问题非常头疼嘞 于是手持一加对三种方式进行了测试 以read sms权限为例 二 检查方式 常用的检查 ContextCom
  • java 内存分配管理_JAVA实验操作系统内存管理-最优分配,最先分配,最坏分配算法...

    package Memory import java util ArrayList import java util Iterator import java util Scanner public class OS ArrayList f
  • 用这个算法能让大数据集群性能提升100倍!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 一 前情概要 二 背景引入 三 问题凸现 四 Hadoop的优化方案 一 前情概要 这篇文章给大家聊聊Hadoop在部署了大规模的集群场景下 大量客户端并发写数
  • K8S安装部署Nacos集群

    1 在k8s中部署的难点 在k8s中部署nacos集群和在裸机器上直接部署nacos机器其实差别不大 最主要的区别是k8s中部署的服务没有固定的ip地址 而nacos集群部署需要配置所有实例的ip 2 解决 在k8s中通过StatefulS
  • day06 Spring AOP

    DI注解 作用 解决使用xml配置繁琐的问题 该注解和使用配置文件一样分成两类进行注入 字段注入或属性注入 注入bean 取代xml中的ref 1 value注解 使用value注解给属性进行赋值 只能使用于八大基本类型和常量类型 Stri
  • Woedpress分类目录绑定二级域名

    实现分类目录和二级域名绑定需要使用 WordPress 的多站点功能 Multisite 以下是一个基本的步骤和示例代码来实现这个功能 代码实现方法 步骤 将 WordPress 安装为多站点模式 在 WordPress 安装目录下的 wp
  • verdi使用linux命令,vcs和verdi的调试及联合仿真案例

    环境配置 首先搭建好vcs和Verdi都能工作的环境 主要有license问题 环境变量的设置 在220实验室的服务器上所有软件的运行环境都是csh 所以 所写的脚本也都是csh的语法 生成波形文件 Testbench的编写 若想用Verd
  • 机器学习实战8-基于XGBoost和LSTM的台风强度预测模型训练与应用

    大家好 我是微学AI 今天给大家介绍一下机器学习实战8 基于XGBoost和LSTM的台风强度预测模型训练与应用 今年夏天已经来了 南方的夏天经常会有台风登陆 给人们生活带来巨大的影响 本文主要基于XGBoost模型和长短期记忆 LSTM
  • 淘宝滑动验证码研究

    引言 悠闲的时候 总会去找些事做做 前些天在登录淘宝的时候 发现了滑动验证码 虽然已经不是什么新事物 但还是产生了很大的兴趣 传统的字符输入验证码 变为了滑动验证码 这一看就是产品大师的手笔啊 不知道申请专利没有 这种 情感化 的验证码设计