极验滑块验证码破解与研究(四):滑块轨迹构造
声明
原创文章,请勿转载!
本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。
本文关联文章超链接:
- 极验滑块验证码破解与研究(一):AST还原混淆JS
- 极验滑块验证码破解与研究(二):缺口图片还原
- 极验滑块验证码破解与研究(三):滑块缺口识别
- 极验滑块验证码破解与研究(四):滑块轨迹构造
- 极验滑块验证码破解与研究(五):请求分析及加密参数破解
一、极验滑动轨迹分析
想构造一个成功率高的滑动轨迹,首先得知道js代码中是如何记录滑动过程,不同厂家的记录方式不同。但是,万变不离其宗,记录的过程无非就是通过触发鼠标的点击、移动等事件,记录时间、位置等信息。
1. 生成滑动轨迹的js入口
首先将混淆的js代码还原,还原过程请看 极验滑块验证码破解与研究(一):AST还原混淆JS ,使用reres插件将slide.7.8.4.js替换成还原后的js文件。下面介绍两种方式找到js记录的滑块轨迹。
1.1. 参数搜索方式
破解极验最终的目的就是构造w参数,而w参数是由滑动轨迹通过加密算法得到的。所以,可以先找到w参数的位置,通过w参数跳到滑动轨迹加密之前的位置。
控制台输出r[‘LxVe’][‘MEOT’],即为滑动轨迹列表
1.2. 请求调用栈方式
滑块移动完成时,会调用验证请求,通过请求的调用栈,可以找到请求参数的生成过程,因此,也能找到滑动轨迹列表。
2. 滑动轨迹分析
通过多次滑动滑块,观察轨迹数组中每条记录的特征。轨迹是一个n*3的2维数组,每一行有三个值(以下简称[x, y, t])。x为已滑动的横向距离,y为已滑动的纵向距离,t为滑动过程消耗的时间, 单位: 毫秒。
第一行特征: 第一行为鼠标点击在滑块上,点击位置相与滑块的相对位置,其中0>x>65,0>y>65;
第二行特征: 第一行为为统一的[0,0,0];
行间特征: 点击触发滑块时,每隔10毫秒左右记录一次位置和时间(其实是检测鼠标事件的代码执行时间约10毫秒),两次记录间x差值不为0;
最后一行特征: x与上一行相同,t与上一行相差比较大或0。
3. 滑动轨迹的python实现
此方式构造的滑动轨迹,成功率在95%左右,其中各项参数还可以优化。
优化方案:滑动的距离在0-200范围内,可能性不大。每次可保存校验成功的轨迹。下次遇到相同距离时,可直接调用。
# -*- coding: utf-8 -*-
import random
def __ease_out_expo(sep):
if sep == 1:
return 1
else:
return 1 - pow(2, -10 * sep)
def get_slide_track(distance):
"""
根据滑动距离生成滑动轨迹
:param distance: 需要滑动的距离
:return: 滑动轨迹<type 'list'>: [[x,y,t], ...]
x: 已滑动的横向距离
y: 已滑动的纵向距离, 除起点外, 均为0
t: 滑动过程消耗的时间, 单位: 毫秒
"""
if not isinstance(distance, int) or distance < 0:
raise ValueError(f"distance类型必须是大于等于0的整数: distance: {distance}, type: {type(distance)}")
# 初始化轨迹列表
slide_track = [
[random.randint(-50, -10), random.randint(-50, -10), 0],
[0, 0, 0],
]
# 共记录count次滑块位置信息
count = 30 + int(distance / 2)
# 初始化滑动时间
t = random.randint(50, 100)
# 记录上一次滑动的距离
_x = 0
_y = 0
for i in range(count):
# 已滑动的横向距离
x = round(__ease_out_expo(i / count) * distance)
# 滑动过程消耗的时间
t += random.randint(10, 20)
if x == _x:
continue
slide_track.append([x, _y, t])
_x = x
slide_track.append(slide_track[-1])
return slide_track
if __name__ == '__main__':
for _ in get_slide_track(100):
print(_)
二、结语
友情链接:极验滑块验证码破解与研究(五):请求分析及加密参数破解