极验验证码破解—超详细教程(二)
字数 1137 2025-08-29 08:31:41
极验验证码破解详细教程(二):参数分析与生成
一、极验验证码参数分析
极验验证码的核心参数主要包括userresponse和a,这两个参数是通过分析geetest.js文件得出的关键参数。
1. userresponse参数分析
在geetest.js中搜索userresponse,可以找到其赋值代码:
userresponse: ca.ra(l, this.challenge)
其中:
l:滑块移动的距离(最终位置)this.challenge:已知的挑战值
1.1 计算userresponse的Python实现
def cal_userresponse(a, b):
d = []
c = b[32:]
for e in range(len(c)):
f = ord(str(c[e]))
tmp = f - 87 if f > 57 else f - 48
d.append(tmp)
c = 36 * d[0] + d[1]
g = int(round(a)) + c
b = b[:32]
i = j = {}
k = 0
e = 0
for e in range(len(b)):
h = b[e]
if h in j:
pass
else:
j[h] = 1
i[k].append(h)
k += 1
k = 0 if (k == 5) else k
n = g
o = 4
p = ""
q = [1, 2, 5, 10, 50]
while n > 0:
if n - q[o] >= 0:
m = int(random.random() * len(i[o]))
p += str(i[o][m])
n -= q[o]
else:
del(i[o])
del(q[o])
o -= 1
return p
参数说明:
a:滑块移动距离(l)b:challenge值
1.2 l参数与Track的关系
l参数实际上是滑动轨迹Track的最后一个x坐标值:
Track[-1][0] == l
二、参数a的生成分析
参数a由oa.qa函数生成,其返回值是f:
a: oa.qa(n)
2.1 参数a的生成依赖
参数a的生成依赖于三个核心函数:
c函数:处理轨迹数据e函数:处理特定模式d函数:编码数值
2.1.1 c函数(轨迹处理函数)
def fun_c(a):
g = []
e = []
f = 0
for h in range(len(a) - 1):
b = int(round(a[h + 1][0] - a[h][0]))
c = int(round(a[h + 1][1] - a[h][1]))
d = int(round(a[h + 1][2] - a[h][2]))
g.append([b, c, d])
if b == c == d == 0:
pass
else:
if b == c == 0:
f += d
else:
e.append([b, c, d + f])
f = 0
if f != 0:
e.append([b, c, f])
return e
功能:计算相邻轨迹点之间的差值,并处理特殊情况。
2.1.2 e函数(模式匹配函数)
def fun_e(item):
b = [[1, 0], [2, 0], [1, -1], [1, 1], [0, 1], [0, -1], [3, 0], [2, -1], [2, 1]]
c = 'stuvwxyz~'
for i, t in enumerate(b):
if t == item[:2]:
return c[i]
return 0
功能:匹配特定的移动模式并返回对应字符。
2.1.3 d函数(数值编码函数)
def fun_d(a):
b = '0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqr'
c = len(b)
d = ''
e = abs(a)
f = int(e / c)
if f >= c:
f = c - 1
if f > 0:
d = b[f]
e %= c
g = ''
if a < 0:
g += '!'
if d:
g += '$'
return g + d + b[e]
功能:将数值编码为特定字符。
2.2 完整的f函数实现
def fun_f(track_list):
skip_list = fun_c(track_list)
g, h, i = [], [], []
for j in range(len(skip_list)):
b = fun_e(skip_list[j])
if b:
h.append(b)
else:
g.append(fun_d(skip_list[j][0]))
h.append(fun_d(skip_list[j][1]))
i.append(fun_d(skip_list[j][2]))
return ''.join(g) + ''.join(h) + ''.join(i)
参数说明:
track_list:滑块移动轨迹(Track)
三、滑动轨迹Track分析
3.1 Track的数据结构
Track是一个二维数组,格式如下:
[
[x1, y1, t1],
[x2, y2, t2],
...
[xn, yn, tn]
]
其中:
- x:水平坐标
- y:垂直坐标
- t:时间戳(毫秒)
3.2 Track的生成特点
- 轨迹是随机采样生成的离散坐标序列
- 最后一个x坐标值等于滑块移动距离l
- 轨迹需要模拟人类滑动行为,包括:
- 加速和减速过程
- 微小抖动
- 可能的回退
3.3 Track生成的关键点
- 缺口位置识别:需要通过图像识别确定滑块需要移动的距离
- 轨迹模拟:需要根据缺口距离生成符合人类行为的轨迹
- 时间控制:总滑动时间应在合理范围内(通常1-3秒)
四、破解流程总结
- 获取challenge值:从服务器响应中获取
- 识别缺口位置:通过图像处理确定滑块需要移动的距离
- 生成Track轨迹:根据缺口距离模拟人类滑动行为
- 计算userresponse:使用
cal_userresponse函数 - 计算参数a:使用
fun_f函数处理Track轨迹 - 提交验证:将生成的参数提交给验证接口
五、待解决问题
目前教程中尚未完全解决的是Track轨迹的生成算法,这是破解极验验证码的最后一步。Track轨迹需要:
- 根据缺口距离动态生成
- 模拟人类滑动行为模式
- 包含合理的加速、减速和抖动
- 时间控制要符合正常人类操作
这部分内容将在后续教程中详细讲解。