破解滑动验证码的详细指南

破解滑动验证码需要分析其网络请求和JavaScript代码。本文将通过具体步骤和代码实例,展示如何破解滑动验证码的w参数。

第一步:初步观察和工具准备
1. 使用请求转发工具

首先,使用诸如Charles或Fiddler等请求转发工具,截获并查看验证码验证过程中所有网络请求。
将目标代码替换为处理过的代码,以便更详细地分析和修改请求内容。
2. 观察并记录验证过程

观察验证过程中触发的请求,记录所有相关参数。
第二步:分析和破解关键参数
1. 重要参数概述

在请求中,我们重点关注以下几个参数:

gt:极验提供的固定ID。
challenge:行为ID,每次操作后都会生成新的challenge。
w:加密数据,验证的核心。
第三步:具体请求详解
1. 核心JS文件获取 (gettype.php)

获取包含验证逻辑的核心JS文件链接。
2. 无感验证请求 (get.php)

收集浏览器信息并上报,注意其中的c和s参数。
3. 执行无感验证 (ajax.php)

进行初步验证,如果失败,会返回具体的验证类型,如滑块验证。
4. 滑动验证JS加载 (slide.x.x.x.js)

加载处理滑动验证的相关JS文件。
5. 获取滑动验证数据 (get.php)

获取滑动验证所需的基本数据,关注bg, c, challenge, fullbg, gt, slice, s等参数。
6. 执行滑动验证 (ajax.php)

完成滑动验证后,返回validate值。
第四步:破解w参数
1. 分析w参数生成过程

在本地代码中搜索w参数的生成逻辑,加入debugger进行调试,找到关键函数调用。
2. 破解u参数

u参数通过以下代码生成:
typescript

function getRandomTextHelper() {
  const helper = () => ((65536 * (1 + Math.random())) | 0).toString(16).substring(1)
  return helper() + helper() + helper() + helper()
}

var oldRandomText = getRandomTextHelper()

function getRandomText(needRefresh) {
  if (needRefresh) {
    oldRandomText = getRandomTextHelper()
  }
  return oldRandomText
}

function getU() {
  var e = new U().encrypt(getRandomText())
  while (!e || 256 !== e.length) e = new U().encrypt(getRandomText(true))
  return e
}

var U = ...
3. 破解h参数

h参数生成相对复杂,涉及l参数和多个加密步骤:
javascript

var h = m.$_GGc(l)

var l = V.encrypt(pt.stringify(o), r.$_CCEB())
o参数包含多个字段,通过分析函数确定每个字段的生成逻辑。
第五步:轨迹数据构造  更多内容联系1436423940
1. 生成滑动轨迹

滑动轨迹数据记录鼠标的移动路径,以下函数模拟滑动轨迹:
typescript

function generateSlideTrace(distance: number) {
  const trace = [
    [random(-50, -10), random(-50, -10), 0],
    [0, 0, 0],
  ]
  const count = 30 + Math.floor(distance / 2)
  let t = random(50, 100)
  let lastX = 0
  let lastY = 0
  let lastYCount = 0

  for (let i = 0; i < count; i++) {
    const x = Math.round(i == count ? 1 : (1 - Math.pow(2, (-10 * i) / count)) * distance)
    t += random(10, 20)
    if (x === lastX) continue
    lastYCount += 1
    if (lastYCount > random(5, 10)) {
      lastYCount = 0
      lastY = random(-2, 2)
    }
    lastX = x
    trace.push([x, lastY, t])
  }
  return trace
}
第六步:合并u和h参数,生成w参数
1. 计算w参数

通过以下代码合并生成w参数:
typescript

function getSlideW(props) {
  return getSlideLeft(props) + getRight()
}

function getSlideLeft(props) {
  return encodeLeft(getL(props))
}

function getL({ c, s, trace, challenge }) {
  const o = {
    lang: 'zh-cn',
    userresponse: H(trace.at(-1)[0], challenge),
    passtime: trace.at(-1)[2],
    imgload: Math.floor(Math.random() * 50 + 30),
    aa: getAA(encodeTrace(trace), c, s),
    ep: {
      v: '7.8.8',
      $_BIQ: false,
      me: true,
      tm: -1,
      td: -1,
    },
  }
  return V.encrypt(stringify(o), getRandomText())
}

function getRight() {
  var e = new U().encrypt(getRandomText())
  while (!e || 256 !== e.length) e = new U().encrypt(getRandomText(true))
  return e
}

// 其他相关函数
function getRandomTextHelper() { ... }
var oldRandomText = getRandomTextHelper()
function getRandomText(needRefresh) { ... }
function stringify(t, e, n) { ... }
function H(t, e) { ... }
function getAA(t, e, n) { ... }
function encodeTrace(arr) { ... }
function encodeLeft(l) { ... }

var U = ...
var V = ...
第七步:构造请求
1. 构造并发送请求

按照验证过程,构造请求并发送:
typescript

// 示例代码
async function verifyCaptcha() {
  const response = await fetch('ajax.php', {
    method: 'POST',
    body: JSON.stringify({
      // 填入所有必要参数,包括w参数
    }),
  })
  const result = await response.json()
  if (result.success) {
    console.log('验证成功')
  } else {
    console.log('验证失败')
  }
}

verifyCaptcha()

在微信小程序中,制作一个滑动验证码通常需要用到canvas元素和一些动画效果。下面是一个简单的步骤指南: 1. **引入Canvas组件**:首先,在你的WXML文件中引入`<view class="slider-captcha canvas-view">`,这将是滑动验证码容器。 ```html <view class="slider-captcha canvas-view"> <!-- 滑动验证码将会在这里绘制 --> </view> ``` 2. **创建Canvas实例**:在对应的JS文件里,初始化一个Canvas实例,并设置它的宽度和高度。 ```javascript Page({ data: { sliderWidth: '200px', // 验证码宽度 sliderHeight: '50px', // 验证码高度 slideStartX: null, }, //... }) ``` 3. **绘制验证码**:在`onLoad`生命周期钩子中,创建一个函数来绘制滑动条背景和数字,然后定期更新验证码内容。 ```javascript drawSlider: function () { var ctx = wx.createSelectorQuery().select('.canvas-view').getContext(); ctx.clearRect(0, 0, this.data.sliderWidth, this.data.sliderHeight); // 绘制背景和数字 }, ``` 4. **滑动效果**:在用户的触摸开始(`touchstart`)和结束(`touchend`)事件中,记录开始位置并计算滑动距离。如果滑动距离满足条件,则更改显示的内容。 ```javascript touchStartHandler: function (e) { this.setData({ slideStartX: e.touches[0].clientX }); }, touchEndHandler: function (e) { var currentX = e.changedTouches[0].clientX; let distance = currentX - this.data.slideStartX; // 更新验证码显示内容 if (Math.abs(distance) > this.data.sliderWidth / 2) { // 滑动超过一定阈值,改变验证码 this.drawNewCode(); } }, ``` 5. **动态生成验证码**:每次滑动结束后,你可以编写`drawNewCode`函数来生成新的随机验证码并重新绘制。 6. **用户交互**:在HTML层面,你可以添加相应的事件监听器,比如点击滑动条,禁用提交按钮直到验证码正确。 ```html <view class="slider-handle" ontouchmove="touchMoveHandler" ontouchend="touchEndHandler"></view> <button bindtap="checkAnswer" disabled></button> ``` 请注意,以上代码只是给出一个基本的概念,实际应用中可能还需要考虑性能优化、验证码的加密存储等细节。此外,微信小程序可能有限制部分CSS样式和动画的直接使用,所以你可能需要查阅官方文档了解兼容性情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值