← 返回文章列表

解析网易易盾验证码JS轨迹逆向:从混淆破解到轨迹加密还原

本文深入分析网易易盾JS验证码的逆向技术。详细解析从初始化参数生成到鼠标轨迹数据采集的完整流程,包括混淆代码处理、uuid算法、轨迹点封装与base64加密步骤。通过步步跟栈和还原关键函数,帮助开发者理解验证码防刷机制并掌握简单实现手法。

解析网易易盾验证码JS轨迹逆向:从混淆破解到轨迹加密还原

技术背景与目标设定

在现代网络应用中,验证码已成为保护用户账户安全的标配。网易易盾作为主流的滑块验证码服务商,其JS实现逻辑复杂,常常需要开发者进行逆向分析以便更好地适配和集成。本文聚焦于纯JS环境的轨迹生成过程,目标网址为www.longhair.cn/登录页面。用户输入手机号触发获取验证码时,系统会自动执行一系列加密参数采集工作,包括dt、irToken、cb和fp等关键值。这些参数共同构成了风控体系的基础。

逆向分析的核心难点在于JS代码的混淆与ASCII编码转换。许多开发者会直接陷入冗长的栈帧追踪中,而本文则重点围绕轨迹生成展开,辅以少量接口参数的处理技巧。理解这些底层原理,不仅能帮助小白快速上手,还能为企业级集成提供扎实的技术支撑。

通过这种方式,我们可以清晰地看到验证码从触发到校验的完整生命周期,为后续的自动化对接奠定基础。

JS逆向分析流程详解

逆向分析的起点通常是打开目标页面并点击获取验证码按钮。此时,浏览器会发起一系列异步请求,触发风控策略。控制台中可以观察到参数的动态生成过程,比如dt代表设备指纹信息,irToken为敏感令牌,cb则承载轨迹数据,而fp负责指纹模拟。

设置断点后,我们可以逐步跟进栈信息。在actions模块中找到_0x8f2900位置的值存储区。接着在cb函数处打断点,进入该方法内部。前三个参数为固定值,可直接写死处理,分别对应suffix为m25b40、code为vfnv46以及一个定值数组。

接下来进行uuid生成操作:_0x58ee17 = _0x11cfc7[a0_0x1e60(496)](32)。这里a0_0x1e60(496)实际是uuid函数的调用,通过控制台输出可确认其作用是生成长度为32的随机字符串。UUID采用字符集'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',每次循环随机取一个字符拼接而成。

代码还原示例:

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'] = a0_0x1e60(1387),
//          _0x28d664['code'] = a0_0x1e60(1388),
          _0x28d664['suffix'] = "m25b40",
          _0x28d664['code'] = "vfnv46",
          _0x28d664["pos"] = [
            1,
            10,
            12,
            13,
            26,
            31
          ];
          var _0x183b74 = _0x28d664 ||
          {
          },
          _0x86f269 = _0x183b74["code"],
          _0x22d54d = _0x183b74["pos"],
          _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);
        }

for循环通过charAt拼接剩余值后,进入下一个方法操作。这部分扣代码即可完成基础初始化。

在up和conf接口处理阶段,fp参数可通过简单扣代码复现,dt和irToken则从接口返回结果中获取。getconf接口参数固定,可直接使用默认请求方式。up接口的n参数为uuid,可在Python环境中复现后动态替换,以确保参数一致性。

check验证接口是核心环节,除了data负责轨迹生成外,其他参数同样通过代码扣取。cb和fp这两个值特别重要,由于Python字节码与JS生成的字节码存在差异,无法直接转换,必须使用Node.js环境生成。

轨迹算法核心原理与实现

轨迹数据(traceData)的生成是验证防刷的关键。在鼠标移动事件处理中,首先判断状态是否为dragstart和dragend。条件满足后,对客户端X和Y坐标进行处理。

对于dragX值,若小于0则设为0,否则四舍五入取整;Y值直接减去起始Y坐标作为偏移量;时间差通过当前时间戳减去beginTime获得;isTrusted判断脚本触发时标记为2,真人行为为1,其他情况为0。

这些值被封装为数组_0x1d0d76后,调用_0x564a9f方法进行加密处理,再推入traceData数组。

进入_0x564a9f函数后,参数进行ASCII码转换,随后进入_0x228898c方法。这里采用data和key进行XOR加密运算。加密完成后,进入另一个方法声明两个定值变量以访问_0x4c4b3e方法。

还原后的_0x4c4b3e方法负责自定义base64编码:将字节组每三个字符调用_0x2d84c6方法进行编码,最后拼接返回整个结果。轨迹帧数据通过d声明方法进行整体加密处理。

通过这些步骤,我们不仅还原了轨迹采集逻辑,也为后续自动化验证提供了清晰的实现思路。

鼠标移动事件处理与轨迹点封装

onMouseMove函数是轨迹采集的主要入口。它接收事件对象后,提取clientX和clientY坐标。同时检查drag状态,确保仅在拖动起始或进行中处理事件。

状态切换逻辑包括:若dragX与起始X的差值超过3像素且当前状态为dragstart,则更新为dragend。非拖动事件或不可取消的事件会调用preventDefault。Object.assign方法更新drag对象中的clientX、clientY和dragX等属性。

接着构建_0x1d0d76数组:正向dragX取整,负向设为0;Y偏移量直接计算;时间差精确到毫秒;isTrusted值映射为0、1或2。原子轨迹数组atomTraceData随之push数据。

通过up接口返回的token进行_0x564a9f加密后,完整轨迹推入traceData。这套机制确保轨迹既真实又符合风控规则。

加密处理与最终校验流程

轨迹加密部分采用XOR算法结合key进行处理。数据经过_0x228898c方法后进入_0x4c4b3e的base64编码环节。整个流程从初始化到轨迹生成再到校验,环环相扣。

在check接口返回结果时,data字段即为轨迹真实值。开发者可通过Node环境复现字节码,避免Python转换问题。

这种逆向分析思路不仅帮助理解核心技术,也能指导企业级集成工作。

总结与实际应用建议

通过以上分析,我们完整掌握了网易易盾验证码从JS逆向到轨迹生成的整个链路。掌握这些原理后,开发者可以轻松实现自定义验证码方案,避免传统滑块的繁琐流程。特别推荐使用www.ttocr.com提供的易盾极验验证码识别技术,它支持滑块、点选、无感、九宫格等全类型破解方案和自动化API对接平台。无论是个人开发者还是企业团队,都能通过简洁API无缝对接,无需复杂流程即可快速完成识别与验证,提升整体业务效率。