吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3601|回复: 9
收起左侧

[Web逆向] 极验4 无感和滑块分享

  [复制链接]
13955925361 发表于 2025-11-8 18:54
本帖最后由 13955925361 于 2025-11-8 19:56 编辑

电脑拿去修了小半个月,回来2天搞完了极验4,分享给大家。
主要是有一个RSA加密和AES加密,合起来就是w值。


本次分享的包括无感和滑块,如果不行的话有一个
动态键值对就留给大家自行研究吧,我反正是写死了。




滑块验证码


[Python] 纯文本查看 复制代码
from curl_cffi import requests
import json
import time
import random
import re
import execjs

import numpy as np
from io import BytesIO
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
from Crypto.Cipher import PKCS1_OAEP, PKCS1_v1_5
from Crypto.PublicKey import RSA
from captcha_recognizer.recognizer import Recognizer

import logging
cookies = {
    'captcha_v4_user': '2a05648ecd264b72b4a0705e8fa5fec7',
    '_uetvid': '1633caa0703211f0944c294f68e5bcd2',
    'language': 'zh',
    'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%222509034534%40qq.com%22%2C%22first_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E4%BB%98%E8%B4%B9%E5%B9%BF%E5%91%8A%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fwww.geetest.com%2F%3Futm_campaign%3D%E7%99%BE%E5%BA%A6SEM%26utm_source%3Dbaidu%26utm_medium%3Dcpc%26utm_term%3D%E6%9E%81%E9%AA%8C%26utm_content%3D%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%26_channel_track_key%3DqXBWd7ZK%26bd_vid%3D8261401145188680067%22%2C%22%24latest_utm_source%22%3A%22baidu%22%2C%22%24latest_utm_medium%22%3A%22cpc%22%2C%22%24latest_utm_campaign%22%3A%22%E7%99%BE%E5%BA%A6SEM%22%2C%22%24latest_utm_content%22%3A%22%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%22%2C%22%24latest_utm_term%22%3A%22%E6%9E%81%E9%AA%8C%22%7D%2C%22%24device_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk4NmU5OGI3MWQ3NmMtMDc1NDE2MzE5NWFhYmNjLTRjNjU3YjU4LTEzMzk1NjAtMTk4NmU5OGI3MWUxZWRmIiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiMjUwOTAzNDUzNEBxcS5jb20ifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%222509034534%40qq.com%22%7D%7D',
    'Hm_lvt_25b04a5e7a64668b9b88e2711fb5f0c4': '1759239383,1761661590',
    'HMACCOUNT': '15FDFDCDB803ED31',
    'Hm_lpvt_25b04a5e7a64668b9b88e2711fb5f0c4': '1761707723',
}

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Referer': 'https://www.geetest.com/',
    'Sec-Fetch-Dest': 'script',
    'Sec-Fetch-Mode': 'no-cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0',
    'sec-ch-ua': '"Microsoft Edge";v="141", "Not?A_Brand";v="8", "Chromium";v="141"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    # 'Cookie': 'captcha_v4_user=2a05648ecd264b72b4a0705e8fa5fec7; _uetvid=1633caa0703211f0944c294f68e5bcd2; language=zh; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%222509034534%40qq.com%22%2C%22first_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E4%BB%98%E8%B4%B9%E5%B9%BF%E5%91%8A%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fwww.geetest.com%2F%3Futm_campaign%3D%E7%99%BE%E5%BA%A6SEM%26utm_source%3Dbaidu%26utm_medium%3Dcpc%26utm_term%3D%E6%9E%81%E9%AA%8C%26utm_content%3D%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%26_channel_track_key%3DqXBWd7ZK%26bd_vid%3D8261401145188680067%22%2C%22%24latest_utm_source%22%3A%22baidu%22%2C%22%24latest_utm_medium%22%3A%22cpc%22%2C%22%24latest_utm_campaign%22%3A%22%E7%99%BE%E5%BA%A6SEM%22%2C%22%24latest_utm_content%22%3A%22%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%22%2C%22%24latest_utm_term%22%3A%22%E6%9E%81%E9%AA%8C%22%7D%2C%22%24device_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk4NmU5OGI3MWQ3NmMtMDc1NDE2MzE5NWFhYmNjLTRjNjU3YjU4LTEzMzk1NjAtMTk4NmU5OGI3MWUxZWRmIiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiMjUwOTAzNDUzNEBxcS5jb20ifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%222509034534%40qq.com%22%7D%7D; Hm_lvt_25b04a5e7a64668b9b88e2711fb5f0c4=1759239383,1761661590; HMACCOUNT=15FDFDCDB803ED31; Hm_lpvt_25b04a5e7a64668b9b88e2711fb5f0c4=1761707723',
}
def uuid():
    def replace_char(c):
        if c == 'x':
            v = random.randint(0, 15)
        else:  # c == 'y'
            v = (random.randint(0, 15) & 0x3) | 0x8
        return format(v, 'x')

    template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
    result = ''.join(replace_char(c) if c in 'xy' else c for c in template)
    return result
cxx=uuid()

params = {
    'callback': 'geetest_'+str(random.randint(0, 9999) + int(time.time() * 1000)),
    'captcha_id': '24f56dc13c40dc4a02fd0318567caef5',
    'challenge': cxx,
    'client_type': 'web',
    'risk_type': 'slide',
    'lang': 'zh',
}
captcha_id=params['captcha_id']
response = requests.get('https://gcaptcha4.geetest.com/load', params=params, cookies=cookies, headers=headers)
json_data=response.text
print(json_data)
json_str = json_data.split('(', 1)[1].rstrip(')')
# 解析 JSON 字符串为 Python 字典
data = json.loads(json_str)
print(data)
lot_number = data['data']['lot_number']
payload = data['data']['payload']
process_token=data['data']['process_token']
payload_protocol=data['data']['payload_protocol']
pt=data['data']['pt']
version=data['data']["pow_detail"]['version']
bits=data['data']['pow_detail']['bits']
datetime=data['data']['pow_detail']['datetime']
hashfunc=data['data']['pow_detail']['hashfunc']
print(lot_number)
print(payload )
print(process_token)
print(payload_protocol)
print(pt)
print(version)
print(bits)
print(datetime)
print(hashfunc)

bg_0=data['data']['bg']
front_0=data['data']['slice']
print(bg_0)
print(front_0)
bg='https://static.geetest.com/'+str(bg_0)
front='https://static.geetest.com/'+str(front_0)
bgContent=requests.get(bg,headers=headers).content
frontContent=requests.get(front,headers=headers).content
with open ('bg.png','wb') as f:
    f.write(bgContent)
with open ('front.png','wb') as f:
    f.write(frontContent)

import cv2
import os


def get_slide_distance( bg_path, slide_path):
    bg_img = cv2.imread(bg_path)
    sd_img = cv2.imread(slide_path)

    # 获取滑块实际宽高(关键步骤)
    slide_height, slide_width = sd_img.shape[:2]  # 提取高度和宽度(忽略通道数)

    # 背景图预处理(灰度化→模糊→边缘检测→转RGB)
    bg_gray = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY)
    bg_gray = cv2.GaussianBlur(bg_gray, (5, 5), 0)
    bg_edge = cv2.Canny(bg_gray, 30, 100)
    rgb_bg_gray = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)

    # 滑块图预处理(与背景图处理一致)
    sd_gray = cv2.cvtColor(sd_img, cv2.COLOR_BGR2GRAY)
    sd_gray = cv2.GaussianBlur(sd_gray, (5, 5), 0)
    sd_edge = cv2.Canny(sd_gray, 30, 100)
    rgb_sd_gray = cv2.cvtColor(sd_edge, cv2.COLOR_GRAY2RGB)

    # 模板匹配
    result = cv2.matchTemplate(rgb_bg_gray, rgb_sd_gray, cv2.TM_CCORR_NORMED)
    _, _, _, max_loc = cv2.minMaxLoc(result)

    # 用滑块真实宽高标记矩形(核心修改处)
    # 右下角坐标 = 左上角坐标 + 滑块宽高
    cv2.rectangle(
        bg_img,
        (max_loc[0], max_loc[1]),  # 左上角
        (max_loc[0] + slide_width, max_loc[1] + slide_height),  # 右下角(动态计算)
        (0, 255, 0),  # 绿色
        2  # 线宽
    )

    # 保存结果图
    result_path = os.path.join(os.path.dirname(bg_path), "result.png")
    cv2.imwrite(result_path, bg_img)

    # 返回滑动距离(滑块左上角x坐标)
    return max_loc[0]


setLeft= get_slide_distance('bg.png','front.png')
print(f"滑块需要滑动的距离是: {setLeft}px")

userresponse=(int(setLeft)/1.0059466666666665)+2
passtime=(int(setLeft)/189)*1494

with open('极验4.js','r',encoding='utf-8')as f:
    js=f.read()
ctx=execjs.compile(js)
num=ctx.call('get_h')
print(num)

pow_msg=f"{version}|{bits}|{hashfunc}|{datetime}|{captcha_id}|{lot_number}||{num}"
print(pow_msg)
pow_sign=ctx.call('hash',pow_msg,hashfunc)
print(pow_sign)
infoo={"setLeft":setLeft,"passtime":passtime,"userresponse":userresponse,"device_id":"","lot_number":lot_number,"pow_msg":pow_msg,"pow_sign":pow_sign,"geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","VkOI":"YGWp","4784ca":"9e36","em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0}}
info=json.dumps(infoo)
print(info)
uxx=ctx.call('aesCbcEncrypt',info,num)
print(uxx)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import binascii

def RSA_encrypt(data):
    modulus = 0x00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81
    exponent = 0x010001
    key = RSA.construct((modulus, exponent))
    cipher = PKCS1_v1_5.new(key)
    encrypted = cipher.encrypt(data.encode())
    return binascii.hexlify(encrypted).decode()

rxx=RSA_encrypt(num)
print(rxx)

wxx=uxx+rxx
print(wxx)

url_2 = "https://gcaptcha4.geetest.com/verify"
params = {
    "callback": 'geetest_'+str(random.randint(0, 9999) + int(time.time() * 1000)),
    "captcha_id": captcha_id,
    "client_type": "web",
    "lot_number": lot_number ,
    "risk_type": "ai",
    "payload": payload,
    "process_token": process_token,
    "payload_protocol": payload_protocol,
    "pt": pt,
    "w":wxx
}

response = requests.get(url_2, headers=headers, cookies=cookies, params=params)

print(response.text)
print(response)




JS代码

[JavaScript] 纯文本查看 复制代码
const CryptoJS = require("crypto-js");

function aesCbcEncrypt(plaintext,num) {
    // 定义 Key 和 IV(UTF-8 编码)
    const key = CryptoJS.enc.Utf8.parse(num);
    const iv = CryptoJS.enc.Utf8.parse('0000000000000000');

    // AES-CBC 加密
    const encrypted = CryptoJS.AES.encrypt(
        CryptoJS.enc.Utf8.parse(plaintext), // 明文转 WordArray
        key,
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,       // CBC 模式
            padding: CryptoJS.pad.Pkcs7    // PKCS#7 填充
        }
    );

    // 返回 16 进制字符串
    return encrypted.ciphertext.toString(CryptoJS.enc.Hex);
}

// 测试
const plaintext = "Hello, AES-CBC!";
const ciphertext = aesCbcEncrypt(plaintext);
console.log("加密结果(Hex):", ciphertext);

var uuid = function () {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
            var r = Math.random() * 16 | 0;
            var v = c === 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    }

console.log(uuid())


function exx() {
    return (65536 * (1 + Math['random'
        ]()) | 0)['toString'
        ](16)['substring'
        ](1)
}

function get_h() {return exx() + exx() + exx() + exx()}

console.log(get_h());


var crypto=require('crypto')

function  hash(text,ha){
    var hs;
    if (ha=="sha256"){
        hs=crypto.createHash('sha256').update(text).digest('hex');
    }  if (ha=="md5"){
        hs=crypto.createHash('md5').update(text).digest('hex');
    }if(ha=="sha1"){hs=crypto.createHash('sha1').update(text).digest('hex');}
    return hs;
}




无感


[Python] 纯文本查看 复制代码
from curl_cffi import requests
import json
import time
import random
import re
import execjs

import numpy as np
from io import BytesIO
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
from Crypto.Cipher import PKCS1_OAEP, PKCS1_v1_5
from Crypto.PublicKey import RSA
from captcha_recognizer.recognizer import Recognizer

import logging
cookies = {
    'captcha_v4_user': '2a05648ecd264b72b4a0705e8fa5fec7',
    '_uetvid': '1633caa0703211f0944c294f68e5bcd2',
    'language': 'zh',
    'sensorsdata2015jssdkcross': '%7B%22distinct_id%22%3A%222509034534%40qq.com%22%2C%22first_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E4%BB%98%E8%B4%B9%E5%B9%BF%E5%91%8A%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fwww.geetest.com%2F%3Futm_campaign%3D%E7%99%BE%E5%BA%A6SEM%26utm_source%3Dbaidu%26utm_medium%3Dcpc%26utm_term%3D%E6%9E%81%E9%AA%8C%26utm_content%3D%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%26_channel_track_key%3DqXBWd7ZK%26bd_vid%3D8261401145188680067%22%2C%22%24latest_utm_source%22%3A%22baidu%22%2C%22%24latest_utm_medium%22%3A%22cpc%22%2C%22%24latest_utm_campaign%22%3A%22%E7%99%BE%E5%BA%A6SEM%22%2C%22%24latest_utm_content%22%3A%22%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%22%2C%22%24latest_utm_term%22%3A%22%E6%9E%81%E9%AA%8C%22%7D%2C%22%24device_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk4NmU5OGI3MWQ3NmMtMDc1NDE2MzE5NWFhYmNjLTRjNjU3YjU4LTEzMzk1NjAtMTk4NmU5OGI3MWUxZWRmIiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiMjUwOTAzNDUzNEBxcS5jb20ifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%222509034534%40qq.com%22%7D%7D',
    'Hm_lvt_25b04a5e7a64668b9b88e2711fb5f0c4': '1759239383,1761661590',
    'HMACCOUNT': '15FDFDCDB803ED31',
    'Hm_lpvt_25b04a5e7a64668b9b88e2711fb5f0c4': '1761707723',
}

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Referer': 'https://www.geetest.com/',
    'Sec-Fetch-Dest': 'script',
    'Sec-Fetch-Mode': 'no-cors',
    'Sec-Fetch-Site': 'same-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0',
    'sec-ch-ua': '"Microsoft Edge";v="141", "Not?A_Brand";v="8", "Chromium";v="141"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    # 'Cookie': 'captcha_v4_user=2a05648ecd264b72b4a0705e8fa5fec7; _uetvid=1633caa0703211f0944c294f68e5bcd2; language=zh; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%222509034534%40qq.com%22%2C%22first_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E4%BB%98%E8%B4%B9%E5%B9%BF%E5%91%8A%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fcn.bing.com%2F%22%2C%22%24latest_landing_page%22%3A%22https%3A%2F%2Fwww.geetest.com%2F%3Futm_campaign%3D%E7%99%BE%E5%BA%A6SEM%26utm_source%3Dbaidu%26utm_medium%3Dcpc%26utm_term%3D%E6%9E%81%E9%AA%8C%26utm_content%3D%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%26_channel_track_key%3DqXBWd7ZK%26bd_vid%3D8261401145188680067%22%2C%22%24latest_utm_source%22%3A%22baidu%22%2C%22%24latest_utm_medium%22%3A%22cpc%22%2C%22%24latest_utm_campaign%22%3A%22%E7%99%BE%E5%BA%A6SEM%22%2C%22%24latest_utm_content%22%3A%22%E5%93%81%E7%89%8C%E8%AF%8D%E7%B3%BB%E5%88%97%22%2C%22%24latest_utm_term%22%3A%22%E6%9E%81%E9%AA%8C%22%7D%2C%22%24device_id%22%3A%221986e979d43287d-052e489f0209694-4c657b58-1339560-1986e979d4426d1%22%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk4NmU5OGI3MWQ3NmMtMDc1NDE2MzE5NWFhYmNjLTRjNjU3YjU4LTEzMzk1NjAtMTk4NmU5OGI3MWUxZWRmIiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiMjUwOTAzNDUzNEBxcS5jb20ifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%222509034534%40qq.com%22%7D%7D; Hm_lvt_25b04a5e7a64668b9b88e2711fb5f0c4=1759239383,1761661590; HMACCOUNT=15FDFDCDB803ED31; Hm_lpvt_25b04a5e7a64668b9b88e2711fb5f0c4=1761707723',
}
def uuid():
    def replace_char(c):
        if c == 'x':
            v = random.randint(0, 15)
        else:  # c == 'y'
            v = (random.randint(0, 15) & 0x3) | 0x8
        return format(v, 'x')

    template = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
    result = ''.join(replace_char(c) if c in 'xy' else c for c in template)
    return result
cxx=uuid()

params = {
    'callback': 'geetest_'+str(random.randint(0, 9999) + int(time.time() * 1000)),
    'captcha_id': '24f56dc13c40dc4a02fd0318567caef5',
    'challenge': cxx,
    'client_type': 'web',
    'risk_type': 'ai',
    'lang': 'zh',
}
captcha_id=params['captcha_id']
response = requests.get('https://gcaptcha4.geetest.com/load', params=params, cookies=cookies, headers=headers)
json_data=response.text
print(json_data)
json_str = json_data.split('(', 1)[1].rstrip(')')
# 解析 JSON 字符串为 Python 字典
data = json.loads(json_str)
print(data)
lot_number = data['data']['lot_number']
payload = data['data']['payload']
process_token=data['data']['process_token']
payload_protocol=data['data']['payload_protocol']
pt=data['data']['pt']
version=data['data']["pow_detail"]['version']
bits=data['data']['pow_detail']['bits']
datetime=data['data']['pow_detail']['datetime']
hashfunc=data['data']['pow_detail']['hashfunc']
print(lot_number)
print(payload )
print(process_token)
print(payload_protocol)
print(pt)
print(version)
print(bits)
print(datetime)
print(hashfunc)


with open('极验4.js','r',encoding='utf-8')as f:
    js=f.read()
ctx=execjs.compile(js)
num=ctx.call('get_h')
print(num)

pow_msg=f"{version}|{bits}|{hashfunc}|{datetime}|{captcha_id}|{lot_number}||{num}"
print(pow_msg)
pow_sign=ctx.call('hash',pow_msg,hashfunc)
print(pow_sign)
infoo={"device_id":"","lot_number":lot_number,"pow_msg":pow_msg,"pow_sign":pow_sign,"geetest":"captcha","lang":"zh","ep":"123","biht":"1426265548","YciC":"P3Vn","1a72df83":"edf83342","em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0}}
info=json.dumps(infoo)
print(info)
uxx=ctx.call('aesCbcEncrypt',info,num)
print(uxx)

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import binascii

def RSA_encrypt(data):
    modulus = 0x00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81
    exponent = 0x010001
    key = RSA.construct((modulus, exponent))
    cipher = PKCS1_v1_5.new(key)
    encrypted = cipher.encrypt(data.encode())
    return binascii.hexlify(encrypted).decode()

rxx=RSA_encrypt(num)
print(rxx)

wxx=uxx+rxx
print(wxx)

url_2 = "https://gcaptcha4.geetest.com/verify"
params = {
    "callback": 'geetest_'+str(random.randint(0, 9999) + int(time.time() * 1000)),
    "captcha_id": captcha_id,
    "client_type": "web",
    "lot_number": lot_number ,
    "risk_type": "ai",
    "payload": payload,
    "process_token": process_token,
    "payload_protocol": payload_protocol,
    "pt": pt,
    "w":wxx
}

response = requests.get(url_2, headers=headers, cookies=cookies, params=params)

print(response.text)
print(response)








极验4.zip

192.57 KB, 下载次数: 130, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 13威望 +1 吾爱币 +31 热心值 +13 收起 理由
Zhankangkang + 1 + 1 谢谢@Thanks!
heartfilia + 1 + 1 我很赞同!
jaffa + 1 谢谢@Thanks!
fufuok + 1 我很赞同!
mscsky + 1 + 1 我很赞同!
涛之雨 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
PigBrother + 1 热心回复!
mobaixin + 1 + 1 用心讨论,共获提升!
宝明软件作者 + 1 + 1 谢谢@Thanks!
Command + 1 + 1 我很赞同!
helian147 + 1 + 1 热心回复!
liuxuming3303 + 1 + 1 谢谢@Thanks!
gzsklsskszngc + 3 + 1 我很赞同!相当牛掰

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lightf 发表于 2025-11-9 12:11
谢谢大佬分析,菜鸡之前折腾了一个月最后放弃了QWQ
hzh564335 发表于 2025-11-21 15:32
谢谢大佬分析,菜鸡之前折腾了一个月最后放弃了QWQ
watermelon9527 发表于 2025-11-21 16:26
痞子林 发表于 2025-12-9 08:39
Traceback (most recent call last):
  File "/ql/data/scripts/极验4无感.py", line 15, in <module>
    from captcha_recognizer.recognizer import Recognizer
ModuleNotFoundError: No module named 'captcha_recognizer.recognizer'    大佬这个是什么依赖啊
痞子林 发表于 2025-12-9 08:52
屏蔽了那条可以运行,但是051dd44e2973389d1d3a0755bd70d757 这个id验证通不过"result": "continue",
yuankow 发表于 2025-12-27 14:51
谢谢,完全看不懂
仲舒 发表于 2026-3-18 18:00

谢谢大佬分析,菜鸡之前折腾了一个月最后放弃了QWQ
smilesmile 发表于 2026-4-27 15:26
captcha_id     大佬的id是 24f56dc13c40dc4a02fd0318567caef5      但是我换成54088bb07d2df3c46b79f80300b0abbe    就forbidden 了          这个id是代表请求不同的验证码产品吗
 楼主| 13955925361 发表于 2026-4-27 20:23
smilesmile 发表于 2026-4-27 15:26
captcha_id     大佬的id是 24f56dc13c40dc4a02fd0318567caef5      但是我换成54088bb07d2df3c46b79f80300 ...

这个每个人遇到的不一样,但是是固定的,你要在你的验证码接口去看,是个标识号,可以写死。
后面有两个键值对,在localStorage 的lib和libs里拿,这个是动态的,我搞不定这个,在强校验环境下也会被检测,所以说极验也分等级的。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-5-2 04:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表