使用Python逆向解析极验四代滑块验证码

一、极验请求分析
1. 滑块测试网站入口
访问极验滑块验证码测试页面:极验滑块测试

2. 滑块验证过程抓包
与极验三代滑块验证码相比,极验四代简化了验证过程,加密参数w的生成也变简单了。与极验三代验证码一样的分析流程,继续分析。

3. 请求详解
3.1. adaptive-captcha-demo
请求介绍
极验第四代验证码测试主页,主要是获取下个请求中的URL(这个URL是动态变化的,所以这个步骤必须要)

请求参数
无特别参数

请求响应
响应为HTML文档,通过正则匹配下个步骤的请求URL

html

href="(.*?adaptive-captcha-demo\.js)"
3.2. adaptive-captcha-demo.js
请求介绍
获取w参数加密需要的参数captchaId

请求参数
无特别参数

请求响应
响应为JS文件,通过正则匹配captchaId参数的值

javascript

captchaId:"([0-9a-z]+)"
3.3. load
请求介绍
获取验证码信息,包括:验证码类型、验证码背景图、验证码滑块图、lot_number参数、静态文件URL等

请求参数

python

params = {
    "captcha_id": "24f56dc13c40dc4a02fd0318567caef5",
    "challenge": "f8beca82-84a4-4b32-a01d-dae1697f1236",  # 由JS代码生成,下面会详细讲解生成过程
    "client_type": "web",
    "risk_type": "slide",
    "lang": "zh",
    "callback": "geetest_1641878914316"  # 当前时间戳
}
请求响应
响应中的c、s在后续无感验证生成w参数时需要使用,其中c为定值,s为变化值。

json

{
  "status": "success",
  "data": {
    "lot_number": "c574cd8c30a541b28597fb4582542c61",
    "captcha_type": "slide",
    "js": "/js/gcaptcha4.js",
    "css": "/css/gcaptcha4.css",
    "static_path": "/v4/static/v1.4.4",
    "slice": "pictures/v4_pic/slide_2021_07_14/Group81/slide/019d7acaf9aa4f488a332b6baff7176b.png",
    "bg": "pictures/v4_pic/slide_2021_07_14/Group81/bg/019d7acaf9aa4f488a332b6baff7176b.png",
    "ypos": 116,
    "gct_path": "/v4/gct/gct4.5258a91d0f5f0bb73c65d4d18d48d93f.js",
    "arrow": "arrow_1",
    "show_voice": false,
    "feedback": "https://www.geetest.com/Helper",
    "logo": true,
    "pt": "1",
    "captcha_mode": "risk_manage",
    "language": "zh",
    "custom_theme": {
      "_style": "stereoscopic",
      "_color": "hsla(224,98%,66%,1)",
      "_gradient": "linear-gradient(180deg, hsla(224,98%,71%,1) 0%, hsla(224,98%,66%,1) 100%)",
      "_hover": "linear-gradient(180deg, hsla(224,98%,66%,1) 0%, hsla(224,98%,71%,1) 100%)",
      "_brightness": "system",
      "_radius": "4px"
    }
  }
}
3.4. verify
请求介绍
该请求是极验验证请求,gcaptcha4.js收集滑动轨迹,与上个请求中的lot_number参数,加密生成w参数。

请求参数

python

params = {
    "captcha_id": "24f56dc13c40dc4a02fd0318567caef5",  # 与上个请求中的captcha_id参数相同
    "challenge": "e29f82f7-78db-42de-913f-fb1b01d3e30b",  # 与上个请求中的challenge参数相同
    "client_type": "web",  # 固定值
    "lot_number": "c574cd8c30a541b28597fb4582542c61",  # 上个请求的响应中lot_number参数值
    "risk_type": "slide",  # 验证码类型
    "pt": 1,  # 上个请求的响应中pt参数值
    "w": "c742e66584e3b20ad523c2ddff...",  # gcaptcha4.js收集滑动轨迹加密生成
    "callback": "geetest_1641878916958"  # 当前时间戳
}
请求响应
验证成功,拿到seccode。

json

{
  "status": "success",
  "data": {
    "lot_number": "5b79a07bfb1640c1955ef28fbe28bef0",
    "result": "success",
    "fail_count": 0,
    "seccode": {
      "lot_number": "5b79a07bfb1640c1955ef28fbe28bef0",
      "pass_token": "f5b3b3d7664e032bc06730d56f83433046af98878bfa796d5e4b5b5f48904e40",
      "gen_time": "1641880037",
      "captcha_output": "2W2T6RrNJ8qVlCuIQxrHVp0imaZt_LrywRPCvYEbTHwQyoZwHIYvpYM5zF0-qSl8LQF_m8ggUDGiA0b8IDdrjji1YjjbEERRWAP9SxWj-G090QRaou4m8NnZL0NVmBie"
    },
    "score": "1"
  }
}
二、JS破解前准备工作
1. gcaptcha4.js反混淆
通过AST语法树将混淆的gcaptcha4.js文件还原,具体还原方式请参见相关教程。

2. 找到w参数
通过分析代码找到生成w参数的关键位置和逻辑。

三、load请求中challenge参数破解
经过测试,有两种方式生成challenge:

1. 通过Python的uuid库代码直接生成
python

import uuid
challenge = uuid.uuid1().__str__()
2. 通过构造challenge的函数生成
找到构造challenge的函数入口,逐步分析其生成过程,并将其转换为Python代码。

python

import uuid

def generate_challenge():
    return str(uuid.uuid1())

challenge = generate_challenge()
四、w参数破解
1. w参数分析
通过调试工具捕捉w参数的生成过程,分析需要的关键函数和参数。

2. 解析关键参数
解析生成w参数所需的e对象,并将其序列化和加密。

python


import json
import random
import time
from hashlib import sha256

def generate_track():
    # 模拟生成滑动轨迹,实际情况可能需要更复杂的轨迹
    return [[random.randint(0, 100), random.randint(0, 100), random.randint(0, 10)] for _ in range(10)]

def generate_w(track, captcha_width, lot_number):
    passtime = sum(t[2] for t in track)
    set_left = sum(t[0] for t in track)
    userresponse = set_left / (0.8876 * 340 / captcha_width)

    e = {
        "setLeft": set_left,
        "track": track,
        "passtime": passtime,
        "userresponse": userresponse,
        "device_id": "A59C",
        "lot_number": lot_number,
        "geetest": "captcha",
        "lang": "zh",
        "ep": "123",
        "nz8c": "255401529",
        "em": {
            "ph": 0,
            "cp": 0,
            "ek": "11",
            "wd": 1,
            "nt": 0,
            "si": 0
        }
    }

    e_json = json.dumps(e, separators=(',', ':'))
    e_hash = sha256(e_json.encode()).hexdigest()
    return e_hash

track = generate_track()
lot_number = "c574cd8c30a541b28597fb4582542c61"
captcha_width = 300
w = generate_w(track, captcha_width, lot_number)

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值