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

第一步:初步观察和工具准备
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参数包含多个字段,通过分析函数确定每个字段的生成逻辑。
第五步:轨迹数据构造
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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值