【验证码逆向专栏】某验四代滑块验证码逆向分析
字数 1359 2025-08-11 17:40:05
某验四代滑块验证码逆向分析教学文档
一、验证码概述
某验四代滑块验证码是一种常见的反爬机制,相比三代主要改进在于底图未做混淆。验证流程涉及两个关键接口:
load?captcha_id=xxx:初始化验证码verify?captcha_id=xxx:验证滑动结果
二、关键参数分析
1. captcha_id参数
- 来源:
adaptive-captcha-demo.js文件生成 - 特点:每个网站固定值,由极验后台申请得到
- 定位方法:全局搜索
captcha_id
2. challenge参数
- 来源:
gt4.js文件生成 - 生成方式:由
uuid函数生成 - 位置:在
captcha_id参数定义的下一行
3. w参数(核心加密参数)
w参数由多个子参数加密组合而成,包含轨迹、滑动时间、滑动距离等信息。
w参数组成结构:
{
"passtime": 滑动时间,
"track": 滑动轨迹,
"setLeft": 识别出的缺口距离,
"userresponse": a / 1.0059466666666665 + 2,
"device_id": 固定值,
"lot_number": load接口返回,
"pow_msg": 复合参数,
"pow_sign": pow_msg的MD5值,
"em": {...},
"kqg5": "1557244628" // 定期变化的值
}
三、关键加密流程分析
1. pow_msg生成
_ = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|";
h = 16位随机数字符串;
pow_msg = _ + h;
其中:
- i: l["version"]
- r: l["bits"]
- n: l["hashfunc"]
- s: l["datetime"]
- t: h["captchaId"]
- e: h["lotNumber"]
- o: ""
2. pow_sign生成
pow_sign = MD5(pow_msg)
3. kqg5参数生成
- 生成方法:
_gct方法生成 - 位置:
gct4.js文件 - 特点:每隔几小时会改变
4. 最终w参数加密
w参数最终由两部分组成:
w = d[$_DIEHS(177)](c) + u
其中:
- c: AES加密结果数组
- u: RSA加密结果
(1) AES加密部分
- 加密内容:e参数(包含所有滑块信息)
- 加密密钥:随机数i
- 加密模式:CBC
- 初始向量:iv
- 位置:
s[a]["symmetrical"]["encrypt"]
(2) RSA加密部分
- 加密内容:随机数i
- 位置:
l["default"]["encrypt"]
四、逆向实现步骤
-
获取初始化参数:
- 从
load接口获取lot_number、payload、process_token等参数
- 从
-
生成challenge:
- 扣取
uuid函数生成challenge
- 扣取
-
构造滑块信息对象e:
- 包含滑动时间、轨迹、缺口距离等
- 计算
userresponse = setLeft / 1.0059466666666665 + 2 - 生成
pow_msg和pow_sign - 通过
_gct方法生成kqg5
-
AES加密:
- 使用随机密钥加密e对象
- 模式为CBC,使用初始向量iv
-
RSA加密:
- 加密随机密钥
-
组合最终w参数:
- 将AES加密结果和RSA加密结果拼接
五、关键代码片段
1. pow_msg生成
function generatePowMsg(version, bits, hashfunc, datetime, captchaId, lotNumber) {
const _ = `${version}|${bits}|${hashfunc}|${datetime}|${captchaId}|${lotNumber}||`;
const h = generateRandomString(16);
return _ + h;
}
2. AES加密
function aesEncrypt(data, key) {
const iv = CryptoJS.enc.Utf8.parse("..."); // 初始向量
const encrypted = CryptoJS.AES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
3. RSA加密
function rsaEncrypt(data, publicKey) {
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey);
return encrypt.encrypt(data);
}
六、注意事项
-
参数时效性:
kqg5参数每隔几小时会变化,需要定期更新lot_number等参数每次验证都会变化
-
加密算法:
- 确保AES使用CBC模式和正确的初始向量
- RSA使用正确的公钥
-
轨迹模拟:
- 滑动轨迹需要模拟人类行为,包含适当的随机性
-
调试技巧:
- 使用浏览器开发者工具断点调试
- 重点关注
$_BCFj、$_BHIH等关键函数
通过以上分析,可以完整实现某验四代滑块验证码的逆向流程。实际应用中还需结合具体网站的参数进行调整和完善。