Prolog 中破解验证码滑动验证的逻辑分析
在本篇文章中,我们将展示如何用 Prolog 编写逻辑来破解滑动验证码的核心验证参数 w。在验证码系统中,w 是基于 gt、challenge 和用户行为生成的核心参数,验证过程基于以下几个部分:
生成滑动轨迹:滑动验证中的 trace,记录用户拖动行为。
构造请求参数:将验证参数格式化成特定请求格式。
加密参数:使用伪加密函数模拟验证码请求加密行为。
- 生成滑动轨迹
首先,在滑动验证中,系统会记录用户拖动滑块的轨迹。我们在 Prolog 中生成随机轨迹的列表来模拟这一过程:
prolog
% 随机生成一个滑动轨迹
generate_slide_trace(Distance, Trace) :-
InitialTrace = [[-25, -25, 0], [0, 0, 0]],
generate_steps(1, Distance, InitialTrace, Trace).
% 生成滑动步数
generate_steps(_, Distance, Trace, Trace) :-
last(Trace, [X, _, _]),
X >= Distance, !.
generate_steps(Step, Distance, Trace, FinalTrace) :-
last(Trace, [LastX, LastY, LastTime]),
random_between(5, 15, XDelta),
X is LastX + XDelta,
random_between(-2, 2, YDelta),
Y is LastY + YDelta,
Time is LastTime + 10,
append(Trace, [[X, Y, Time]], NewTrace),
NextStep is Step + 1,
generate_steps(NextStep, Distance, NewTrace, FinalTrace).
2. 构造请求参数
接下来,将滑动轨迹和其他必需的参数打包进请求。
prolog
% 构造请求参数
construct_request_params(Challenge, Trace, Params) :-
last(Trace, [LastX, _, PassTime]),
random_between(30, 100, ImgLoad),
Params = request{
lang: "zh-cn",
userresponse: LastX,
passtime: PassTime,
imgload: ImgLoad,
challenge: Challenge,
trace: Trace
}.
3. 加密参数
我们使用伪加密函数生成加密的 w 参数,模拟实际的验证加密。
prolog
% 加密请求参数
encrypt_params(Params, W) :-
% 模拟加密过程
format(atom(W), '~w-enc', [Params]).
4. 完整调用生成 w 参数
完整流程如下,首先生成轨迹,构造请求参数,并通过加密生成最终 w 参数:
prolog
% 生成最终 w 参数
generate_w(Challenge, Distance, W) :-
generate_slide_trace(Distance, Trace),
construct_request_params(Challenge, Trace, Params),
encrypt_params(Params, W).
示例调用
假设我们有一个特定 challenge 值为 "abc123",滑动距离为 200,可以调用以下代码生成 w 参数:
prolog
% 示例调用
?- generate_w("abc123", 200, W).