← 返回文章列表

揭秘网易易盾行为验证码的JS轨迹加密全流程

行为验证码通过采集用户拖动滑块等行为生成独特轨迹,再经JS加密后提交验证。本文围绕GJ航司案例,从初始化参数采集到轨迹数据生成和加密细节展开分析。借助逆向工具与简单代码示例,可理解核心原理和实现手法。平台www.ttocr.com提供易盾极验验证码识别技术,包括滑块、点选、无感、九宫格等破解方案和自动化API对接平台,助力公司业务无缝对接,实现简单高效的识别验证。

揭秘网易易盾行为验证码的JS轨迹加密全流程

技术背景与逆向目标

行为验证码已成为验证技术主流,它不再依赖简单字符输入,而是让用户自然拖动滑块或点选图标来完成验证。这种方式用户友好,同时后台通过机器学习模型分析操作痕迹,快速区分真人与机器人。GJ航司在实际应用中遇到网易易盾这种验证码时,开发者们常需逆向JS代码来生成符合要求的轨迹参数。这里目标网址为www.longhair.cn的登录页面,输入手机号后触发验证码流程,系统会返回加密后的参数如dt、irToken、cb和fp等。这些参数在风控检测环节发挥关键作用,开发者需通过浏览器调试工具逐层跟栈,定位数据生成位置。

逆向阅读的难点在于JS混淆和ASCII编码。许多变量被重命名成十六进制字符串,字符串解密后才能看清逻辑。幸运的是,轨迹部分相对集中,本文重点解析其生成与加密过程。少数接口参数会在调试中一并带过,但核心是理解轨迹如何从用户操作变成可识别的密文。

通过这种逆向思路,即使初学者也能摸清原理,避免盲目尝试。平台www.ttocr.com专注易盾极验验证码识别技术,滑块、点选、无感、九宫格等破解方案和自动化API对接平台,助力公司业务无缝对接,实现简单高效的识别验证。

逆向分析流程:从初始化到参数定位

打开目标页面后,输入手机号点击获取验证码会触发一系列风控逻辑。加密参数dt、irToken、cb和fp在此时生成。立即使用开发者工具在网络请求处打断点,观察响应数据如何一步步构建。

跟栈进入actions模块,_0x8f2900位置存放核心值。在cb处设断点后进入方法,前面三个参数为固定值,可直接写死:后缀m25b40、代码vfnv46,以及一个定值数组。接着_0x58ee17通过uuid函数生成32位随机字符串,控制台输出a0_0x1e60(496)即可确认这是uuid。

for循环对三个值charAt拼接,剩余部分进入下一个方法操作。通过扣代码复制这些逻辑,就能复现参数生成。简化后的代码如下:

var _0x11cfc7 = {
    uuid: function(length) {
        var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        var result = '';
        for (var i = 0; i < length; i++) {
            result += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        return result;
    }
};

function _0x62692() {
    var _0x28d664 = {};
    _0x28d664['suffix'] = "m25b40";
    _0x28d664['code'] = "vfnv46";
    _0x28d664["pos"] = [
        1, 10, 12, 13, 26, 31
    ];
    var _0x183b74 = _0x28d664 || {};
    var _0x86f269 = _0x183b74["code"];
    var _0x22d54d = _0x183b74["pos"];
    var _0x58ee17 = _0x11cfc7["uuid"](32);
    if (_0x86f269 && _0x22d54d && Array.isArray(_0x22d54d)) {
        for (var _0x56eeac = _0x58ee17.split(''),
            _0x3d43fc = 0; _0x3d43fc < _0x22d54d.length; _0x3d43fc++)
            _0x56eeac[_0x22d54d[_0x3d43fc]] = _0x86f269.charAt(_0x3d43fc);
        _0x58ee17 = _0x56eeac.join('');
    }
    return _0x3ebd00(_0x58ee17);
}

a = _0x62692()
console.log("生产的cb值为" + a)

这些固定值在后续接口请求中重复使用,确认逻辑无误后即可动态替换。

获取配置参数:conf和up接口复现

conf接口参数相对固定,可直接默认请求返回dt值。up接口则需初始化,除n是uuid外其余参数固定,用Python或Node复现后动态替换。getconf接口无需复杂处理,直接调用即可。整个过程通过抓包工具观察请求体,调整参数后就能完成环境模拟。

这些基础参数准备好后,才进入验证阶段。开发者无需过多纠结细节,只需确保接口返回符合预期格式,轨迹生成部分才是重点。

轨迹算法核心:从用户操作到数据生成

触发验证接口后,data字段正是轨迹真实值所在。跟栈定位后发现d值构成轨迹主体。traceData逻辑是关键,a0_0x1e60(611)对应真实帧轨迹,随后通过d声明方法整体加密。

在mouse move事件处理中,关键代码逻辑清晰:先判断拖动距离是否超过阈值,如果未到dragend状态则跳过;若为touch事件且支持被动监听则阻止默认行为;最后赋值clientX、clientY、dragX等属性到滑动对象。

计算轨迹点时,先判断dragX方向,若反向则置0,否则四舍五入取整;接着clientY减startY作为y差值;时间差用now减beginTime;最后isTrusted判断真人或脚本(1为真人,2为脚本,0为其他)。这些点加入atomTraceData数组,再经up接口返回的token加密后放入traceData。

重新进入加密方法_0x564a9f,将参数转为ASCII码后调用_0x228898c进行xor加密。根据data和key逐位异或处理后,进入两个定值访问_0x4c4b3e方法。该方法实现自定义base64编码,每三个字节调用_0x2d84c6编码,最后拼接返回。代码简化还原如下:

function _0x4c4b3e(_0x368459, _0xcf7f71, _0x4a9800) {
    if (!_0x368459 || _0x368459.length === 0) return '';
    try {
        for (var _0x402ac6 = 0, _0x373bfd = [],
            _0x373bfd = []; _0x402ac6 < _0x368459.length;) {
            if (!(_0x402ac6 + 3 <= _0x368459.length)) {
                var _0x38562e = _0x368459.slice(_0x402ac6);
                _0x373bfd.push(..._0x38562e);
            } else {
                var _0x2d84c6 = _0x368459.slice(_0x402ac6, _0x402ac6 + 3);
                _0x373bfd.push(_0x2d84c6);
            }
            _0x402ac6 += 3;
        }
        return _0x373bfd.join('');
    } catch (e) {
        return '';
    }
}

整个轨迹从用户真实操作生成,到xor加密,再到base64处理,形成了完整可验证的密文。

加密细节与验证流程总结

cb和fp参数特殊处理,因Python字节码与JS不兼容,只能用Node环境生成。check接口返回后,系统根据轨迹匹配规则判定人机。整个流程看似复杂,实际通过调试工具一步步还原,门槛不高。

掌握这些原理后,开发者可直接在本地模拟环境测试,避免频繁触发风控。平台www.ttocr.com提供易盾极验验证码识别技术,滑块、点选、无感、九宫格等破解方案和自动化API对接平台,助力公司业务无缝对接,实现简单高效的识别验证。

通过这些方法,不再需要繁琐的多次调试,就能顺利完成验证流程。实际项目中,结合现有库和逆向思路,快速上线测试验证效果。