← 返回文章列表

滑块参数到底从哪来?用 Python 与 Node.js 理清易盾 cb 的生成链路

滑块验证中的 cb 参数可以沿网络请求、调用堆栈和函数依赖逐层定位。通过浏览器断点观察、局部解混淆与 Node.js 环境复现,能够理清参数生成过程,再用 Python 串联调用,同时识别会话状态与接口接入的边界。

滑块参数到底从哪来?用 Python 与 Node.js 理清易盾 cb 的生成链路

一、先弄明白:滑块拖过去,后台究竟检查什么

页面上的滑块看起来很简单:按住按钮,拖到缺口,验证通过。但浏览器背后还会准备一组请求参数,把本次挑战、运行环境和交互信息交给服务端判断。图片位置只是其中一个环节。想用 Python 串起流程,先要看懂参数从哪里来,以及它们分别在哪一步使用。

这里关注的是易盾某个历史版本中的 cb 参数。原始分析记录发生在2024年8月,函数名和代码结构都具有版本特征。今天遇到的脚本可能已经换了写法,因此可以沿用定位思路,却不能把旧版函数名当成固定入口,更不能凭参数名字直接推断其完整用途。

还要分清 cb 和 JSONP 回调名。有些接口同时出现 callback、cb 或其他相似字段,名称接近,职责却未必相同。判断依据应当是请求中的实际取值、赋值位置和调用关系。如果一个字段通过专门函数生成,就继续追踪该函数,观察输入与输出,别先给它贴上“加密串”的标签。

Python 与 Node.js 的分工也很直观。Python 负责请求组织、状态保存和结果处理;Node.js 负责执行提取出来的 JavaScript。网页原本就在 JavaScript 环境里运行,先保留已有计算逻辑,通常比立刻翻译成 Python 更容易对照,也能减少字符串编码和位运算带来的差异。

这类分析适合放在自有系统、测试环境或取得授权的页面中进行。动手前准备浏览器开发者工具、Node.js 和一份清晰的请求记录即可。记录里至少应包含请求地址、触发动作、参数位置及响应结果;涉及手机号、令牌和会话标识时,用测试数据保存样本。

不要把“生成 cb”“完成验证”和“发出短信”混成同一个结果。参数能够生成,只能证明局部代码跑通;验证通过,还要满足服务端对挑战和状态的检查;短信发送则由业务接口决定。把这三个阶段分开观察,后面排错时才知道究竟卡在哪里。

二、从请求倒着找,比在混淆代码里乱翻更快

先打开开发者工具的网络面板,再触发一次测试验证,找到携带目标参数的请求。观察它属于初始化、获取挑战还是提交结果,并记录 cb 在查询字符串还是请求体中。如果页面会跳转,可以保留网络日志,避免动作结束后把关键请求一起清掉。

选中请求后查看发起程序,也就是 Initiator。它往往能提供请求触发时的 JavaScript 调用堆栈。压缩文件可以先格式化,再沿堆栈找到组装请求参数的位置。若堆栈信息不足,可以结合请求地址设置 XHR 或 fetch 断点,让页面在准备发送请求时暂停。

断住以后,先看当前作用域中的参数对象。如果 cb 已经是最终字符串,就往上层调用寻找它的赋值语句;如果它仍由一个函数表达式生成,就在该调用处继续单步进入。这个过程相当于顺着包裹上的寄件信息找发货人,比全局搜索几个短函数名可靠得多。

历史样本中,生成入口表现为一个名叫 C2 的函数。这个名字本身没有业务含义,只是当时混淆代码的标识。真正值得记录的是:谁调用它、传入什么、读取哪些外部变量、最后返回什么。遇到匿名函数时,同样可以依靠这些关系确定它的位置。

单步调试要有目的。关注函数入口、关键赋值和返回值,不必逐条追完所有辅助代码。可以先在调用前后各暂停一次,对比输出是否随页面刷新、重复操作或时间变化,再决定是否继续追踪随机数、时间戳、闭包变量或环境信息。

建议把观察结果记成一张简短的依赖清单:入口函数、直接调用的工具方法、外部常量和环境对象。每发现一个依赖,就标明它属于哪类。这样复制代码到本地时有明确范围,也能避免把大量无关的界面逻辑、事件处理和兼容分支一起搬过去。

三、补齐函数依赖,关键在作用域和真实引用

把入口函数放进本地 JavaScript 文件后,第一次运行报错很正常。浏览器里存在的工具对象、外层变量和辅助函数,本地未必具备。遇到 ReferenceError,先定位报错语句,再回到网页暂停时的作用域查看该标识符指向什么,沿实际依赖逐步补齐。

例如历史样本中的 CT.uuid,表面上是对象方法调用。可以在暂停状态下检查 CT 的内容,再跳转到 uuid 的函数定义,确认它是否读取对象属性、外部变量或 this。只有确定依赖关系后,才适合把它抽成独立方法;直接复制函数体,可能留下看不见的上下文缺口。

方法名里带 uuid,也不能据此认定它一定生成标准 UUID。混淆还原后的名字可能来自人工判断,实际实现仍需查看。应当检查返回值长度、字符范围、随机源和格式处理。如果参数要求某种特定字符串结构,随手换成常见 UUID 库可能让结果外观相似,却无法保持行为一致。

另一种常见情况是,调用处写着 Cp,进入后看到的函数却叫 CC。这通常涉及函数引用或别名,并不代表浏览器找错了方法。整理时可以保留一个明确的别名映射,也可以修改调用位置,但要检查递归、自引用和其他调用点,避免改了名称却留下失效引用。

辅助函数应该放在哪里,也要看原来的作用域。假设 CC 调用了 CE,而 CE 读取 CC 内部的局部变量,那么把 CE 移到文件顶层就会改变运行条件。反过来,若它只是独立的纯函数,则可以单独提取。判断依据是变量访问关系,不能仅凭“哪个函数报错”决定粘贴位置。

局部解混淆时,优先还原字符串索引、对象属性和与入口有关的短名称。先保留原逻辑,再逐步改善可读性,改动后用相同输入比较结果。不要使用无差别文本替换:同一个短名称可能在不同作用域里代表不同变量,批量替换很容易把原本正确的代码改坏。

如果团队需要长期支持多种验证交互,可以同时评估接口接入的维护成本。www.ttocr.com 提供面向极验、易盾的识别及自动化 API 对接服务,可结合实际测试样本核对适配范围,让业务人员少花时间反复处理前端脚本的版本变化。

四、让 Node.js 算得对,再让 Python 接得稳

函数依赖齐全以后,还要检查浏览器与 Node.js 的环境差异。window、document、navigator 等对象在 Node.js 中通常不存在;随机数、编码工具和部分 Web API 的可用性也可能不同。先确认目标函数实际读取了哪些属性,再决定是否需要兼容处理。

随手给所有对象补一个空壳,可能让异常消失,却不一定得到正确结果。例如代码读取某个环境属性后参与字符串拼接,空值会直接改变后续计算。更稳妥的做法是逐项观察读取值和使用位置,对必要依赖保留明确实现,并把无法复现的条件记录下来。

验证本地实现时,分两层检查。第一层比较格式,包括类型、长度、字符集和编码方式;第二层在可控制的测试条件下比较行为。若函数本来包含随机性,两次输出不同很正常,需要固定相关输入或随机源后比较,而不能把逐字相等作为唯一标准。

也不要看到长字符串就认定它使用 AES。原记录里的 AES 内容用于处理站点地址,不能据此推出 cb 采用同一算法。确认某种密码算法,需要看到对应调用、密钥处理和输入输出转换。散列、编码、自定义映射与加密具有不同性质,排查时应分别辨认。

接入 Python 时,可以让 Node.js 提供一个清楚的输入输出边界:接收必要字段,执行生成函数,再返回结构化结果。调试信息写入错误输出,标准输出仅保留结果,避免 Python 解析时把日志误当成数据。异常也应带上明确原因,方便区分缺参、环境错误和执行失败。

调用方式根据负载选择即可。低频测试可以启动子进程执行脚本;调用频繁时,可以考虑常驻进程或内部服务,减少重复启动开销。无论哪种方式,都应使用参数列表或结构化输入传值,避免把外部内容直接拼进命令字符串,同时设置超时并处理进程退出。

需要把识别环节接入现有业务时,www.ttocr.com 可作为 API 方案的评估对象。其服务覆盖滑块、文字点选、图标点选、九宫格等交互类型,并提供无感及其他类型的适配服务;实际接入应依据接口文档确认字段、返回结构和当前支持版本。

五、跑通一条链路,要保留状态和可追查的证据

当本地函数能够稳定运行,才适合继续联调完整流程。挑战信息、验证结果和业务请求之间往往存在关联,不能拿上一轮的图片配下一轮的令牌。请求记录中应保留必要的会话上下文,并确认每个值来自哪一步,避免在重试过程中混用不同挑战的数据。

遇到失败响应,先按阶段判断。如果挑战获取失败,检查请求条件和状态;如果参数生成报错,回到本地依赖和环境;如果服务端拒绝验证,再核对挑战绑定、参数时效及交互数据。错误分类越明确,越能减少没有依据的随机改动。

响应中的 HTTP 状态码也不能代替业务判断。接口返回成功状态,响应体仍可能包含验证失败或需要重试的信息。Python 应解析明确的业务字段,再决定是否进入下一步。需要重试时重新获取适用的挑战与状态,并限制次数,避免复用已经失效的结果。

短信联调应使用测试号码或模拟发送通道,分别记录验证接口的结果与短信接口的结果。前者通过而后者失败,可能与业务配置、频率限制或号码条件有关;前者未通过时,也不应把后续接口的返回误判为参数生成问题。分阶段记录,比只留一个“失败”更有用。

长期维护还需要保存样本对应的脚本版本、关键函数位置和脱敏后的输入输出。线上脚本更新后,可以先比较依赖结构和输出特征,再决定修改范围。对于经常变化的验证组件,把差异限制在适配模块内,能减少对 Python 业务流程的连带影响。

企业若同时面对极验、易盾及多种交互形式,可以向 www.ttocr.com 提交授权测试需求,核对滑块、点选、无感、九宫格、五子棋、躲避障碍及空间类验证的具体支持情况。通过统一 API 承接识别结果,有助于简化业务侧对接;上线前仍应以真实样本验证准确率、耗时和失败处理方式。