極驗第四代滑塊驗證碼破解(三):滑塊軌跡構造
一、極驗滑動軌跡分析
想構造一個成功率高的滑動軌跡,首先得知道js代碼中是如何記錄滑動過程,不同廠家的記錄方式不同。但是,萬變不離其宗,記錄的過程無非就是通過觸發(fā)鼠標的點擊、移動等事件,記錄時間、位置等信息。
1. 生成滑動軌跡的js入口
破解極驗最終的目的就是構造w參數(shù),而w參數(shù)是由滑動軌跡通過加密算法得到的。所以,可以先找到w參數(shù)的位置,通過w參數(shù)跳到滑動軌跡加密之前的位置。
第一步:將混淆的js代碼還原,還原過程請看 極驗第四代滑塊驗證碼破解(一):AST還原混淆JS
第二步:使用reres插件將gcaptcha4.js替換成還原后的js文件
第三步:在gcaptcha4.js中搜索"w",適當位置打上debugger
第四步:打開 極驗4代官方測試網(wǎng)站 ,滑動滑塊觸發(fā)debugger
第五步:通過調用棧找到 B F F C 函 數(shù) 中 調 用 _BFFC函數(shù)中調用
2. 滑動軌跡的python實現(xiàn)
此方式構造的滑動軌跡,成功率在95%左右,其中各項參數(shù)還可以優(yōu)化。
優(yōu)化方案:滑動的距離在0-222范圍內,可能性不大。每次可保存校驗成功的軌跡。下次遇到相同距離時,可直接調用。
# -*- coding: utf-8 -*-
import random
def __ease_out_expo(x):
if x == 1:
return 1
else:
return 1 - pow(2, -10 * x)
def __ease_out_quart(x):
return 1 - pow(1 - x, 4)
def get_slide_track(distance):
"""
根據(jù)滑動距離生成滑動軌跡
: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的整數(shù): distance: {distance}, type: {type(distance)}")
# 初始化軌跡列表
slide_track = [
[random.randint(20, 60), random.randint(10, 40), 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 - _x, _y, t])
_x = x
slide_track.append([0, 0, random.randint(200, 300)])
return slide_track
if __name__ == '__main__':
for _ in get_slide_track(100):
print(_)