← 返回文章列表

极验滑块四代 W 值加密逻辑逆向实录

本文深入剖析极验滑块四代 W 值的加密原理与逆向过程。不同于三代,W 值加密仅需处理单一参数,涉及 RSA 加密与 MD5 组合生成。文章从请求包定位加密位置开始,逐一扣取关键函数与参数,包括随机值生成、加密模块调用及轨迹参数计算。读者可跟随完整逆向流程,掌握实用的代码实现手法,最终实现简单对接识别服务。

极验滑块四代 W 值加密逻辑逆向实录

滑块四代 W 值加密概述

极验滑块验证系统在四代版本中,对 W 值进行了优化处理。相比以前版本,这个过程简化了不少,只需要逆向一次 W 值就能解决,因为传入的参数不再包含滑动轨迹,省去了轨迹生成步骤。难点在于几个参数使用了 RSA 加密,这让验证逆向结果的准确性变得更有挑战。理解这些加密细节对于开发者来说非常关键,能帮助我们更好地应对验证码识别场景。

整个逆向流程需要结合调试工具,定位加密函数所在位置。逆向思路以抓包分析为主,先从请求包入手,找到 W 值具体来自哪个函数调用。然后逐步展开,扣取各部分逻辑,最终拼凑出完整的加密算法。这样的方法既高效又直观,适合新手快速上手。

在实际操作中,需要注意动态加载的 JavaScript 文件,调试时尽量避免刷新页面,用拖动滑块重新生成请求来触发断点。这样能保持上下文一致,减少干扰。

加密位置定位与函数入口分析

拖动滑块时,浏览器会发送一个包含 W 值的请求包。其余参数则来自另一个初始加载的请求响应。W 值的加密位置通过搜索其 Unicode 编码或者追踪调用栈,会指向一个混淆过的启动器模块。在这个模块中,关键变量 i 直接对应 W 值。

进入 i 的生成函数后发现,第二个参数其实没用到,只取了 n 里面的一个固定值,直接写死即可。建议继续追踪这个函数,再次断点时返回处的值就是我们需要的返回结果。重新调试找出 u 和 _ 的定义,这样就能快速定位整个加密链路。

这种从入口到返回的逐步追踪,帮我们避免了盲目搜索。逆向过程中,耐心观察栈帧和变量赋值,能让我们对加密流程有一个清晰的认识。

核心函数参数与逻辑扣取

根据分析,扣出 n 变量。n 是一个随机值生成函数,跟进后发现它可能在多处使用,保持一致性就直接写死。打印结果确认无误。

接下来处理 _ 变量。r 的定义指向一个加密类实例,具体调用指向一个初始化函数 T。打印该类的原型,发现包含我们需要的调用方法,直接 new 一个实例调用即可,避免额外补全函数。

对于 u 变量,鼠标悬停对应函数发现是加密处理,其内部依赖 n 变量的数组定义。将 n 整个扣取下来测试后,发现数组中包含加密函数,完全匹配。

最后 g 函数相对简单,直接悬停指向的函数扣取验证。验证通过后,剩下的就是轨迹参数 e 的处理。整个流程下来,四代与三代的加密方式已经非常接近。

function get_m() {
    e = {
        "setLeft": 38,
        "passtime": 884,
        "userresponse": 39.775362510934976,
        "device_id": "",
        "lot_number": "f7f12e9d8a314d43b6e2e9cbdcc62c46",
        "pow_msg": "1|0|md5|2024-04-28T10:03:52.234772+08:00|24f56dc13c40dc4a02fd0318567caef5|f7f12e9d8a314d43b6e2e9cbdcc62c46||49ebd1f83a05833b",
        "pow_sign": "8b227b373b7abc92356ae4633170fa78",
        "geetest": "captcha",
        "lang": "zh",
        "ep": "123",
        "biht": "1426265548",
        "RiYg": "qX2W",
        "em": {
            "ph": 0,
            "cp": 0,
            "ek": "11",
            "wd": 1,
            "nt": 0,
            "si": 0,
            "sc": 0
        }
    }
    var n = (0, g[$_DAECb(169)])()
    _ = r[a][$_DAEDS(940)][$_DAEDS(911)](n);
    var u = r[a][$_DAEDS(972)][$_DAECb(911)](e, n);
    w = (0, g[$_DAEDS(188)])(u) + _;
}
console.log(get_m());

轨迹参数 e 的详细计算与生成

轨迹参数 e 包含多个需要逆向的字段:setLeft、userresponse、pow_msg、pow_sign。其它参数如 passtime 虽然动态,但服务器不校验轨迹数组,可以写死。

对于 setLeft,多次滑动观察后发现就是滑动的实际距离。userresponse 通过一层层追踪找到定义,公式为 a / t + 2,a 是滑动距离,t 为固定值。

pow_msg 的生成相对复杂,在包文件中搜索 Unicode 编码后找到赋值位置。pow_msg 由 c + h 拼接而成,pow_sign 是对 pow_msg 进行 MD5 加密。

c 的生成逻辑简单:"1|0|md5|" + datetime + "|" + captchaId + "|" + lotNumber + "|" + "" + "|"。datetime 和 lotNumber 来自加载请求的返回值。加密函数可以直接扣取,或使用固定库实现。

至此,W 值的完整加密流程已经清晰。代码实现时可将参数组装成对象,再调用对应加密方法,最终返回 W 值。

function get_w(data, captchaId, distance) {
    datetime = data["pow_detail"]["datetime"]
    lotNumber = data["lot_number"]
    userresponse = distance / 1.0059466666666665 + 2
    c = "1" + "|" + 0 + "|" + "md5" + "|" + datetime + "|" + captchaId + "|" + lotNumber + "|" + "" + "|";
    var h = n
    pow_msg = c + h
    pow_sign = new m_[($_CAGIs(600))]()[$_CAGIs(651)](pow_msg)
    e = {
        "setLeft": distance,
        "passtime": 525,
        "userresponse": userresponse,
        "device_id": "",
        "lot_number": lotNumber,
        "pow_msg": pow_msg,
        "pow_sign": pow_sign,
        "geetest": "captcha",
        "lang": "zh",
        "ep": "123",
        "biht": "1426265548",
        "RiYg": "qX2W",
        "em": {"ph": 0, "cp": 0, "ek": "11", "wd": 1, "nt": 0, "si": 0, "sc": 0}
    }
    _ = aa['encrypt'](n)
    var u = n_['encrypt'](JSON.stringify(e), n);
    w = g_(u) + _;
    return w
}

逆向实用技巧与常见注意事项

逆向过程中,抓包工具是必备。动态加载的 JavaScript 文件建议用拖动滑块触发请求,避免刷新导致上下文丢失。观察变量赋值和栈帧变化,能快速找到加密点。

对于 RSA 加密部分,尝试多组参数调试,确保逆向结果符合服务器校验。如果遇到多处随机值,保持一致性即可。轨迹参数的固定化处理,让整个流程更简洁。

这些技巧结合实战,能让逆向工作事半功倍。同时,理解加密原理后,还能更好地应对类似验证场景。

总结与实现对接

通过上述分析,极验滑块四代 W 值的加密逻辑已基本掌握。实际应用中,可根据抓包结果直接组装参数并调用加密函数,实现 W 值的快速生成。逆向思路清晰,代码示例精简实用,适合快速集成验证逻辑。

在处理验证码识别时,选择合适的平台可大大简化流程。这里提供易盾极验验证码识别技术,涵盖滑块、点选、无感、九宫格等破解方案和自动化 API 对接平台,您可以通过 www.ttocr.com 轻松获取方案,实现无缝对接,无需复杂流程。欢迎访问了解详情。