极验四代全家桶AST解混淆纯算实战指南
极验四代全家桶AST解混淆纯算实战指南详细探讨了使用AST工具解析JavaScript代码以定位解密函数的核心流程。文章从获取解密函数名称和代码入手,到追踪变量声明节点,再到通过作用域分析确定被引用的加密函数,逐步构建了通用逆向脚本。重点介绍了滑块验证的完整逆向路径,包括load接口、verify接口的关键参数提取,如滑动距离、滑动时间、用户响应值、lot_number、pow_msg和pow_sign等16位动态值生成逻辑,以及RSA和AES加密的具体实现。文章还延伸讨论了文字点选、图标点选、消消乐、五子棋、九宫格、SVG图标等多种验证类型的共同处理方法,并通过实际代码示例演示了节点替换和参数模拟生成技巧,帮助开发者快速掌握极验四代的安全验证绕过与自动化对接技巧。
解混淆流程详解
解混淆在处理极验四代全家桶时是绕过安全验证的关键一步。整个流程围绕AST分析展开,从代码中精准定位解密逻辑开始。首先需要找到一个包含解密函数的节点对象,比如一个自执行的匿名函数,它会把加密逻辑封装成数组形式。进入这个函数后,先尝试提取其中的解密代码片段,因为这些函数通常会不断进行赋值操作,变量名也会随版本更新而变化。

为了避免变量冲突问题,需要遍历整个AST树,重点关注VariableDeclaration类型的节点。这些节点往往包含多个声明语句,通过检查声明长度和初始化条件,可以快速定位到被解密函数赋值的部分。接着利用scope追踪机制,获取节点在当前作用域中的绑定信息,确保只替换匹配的引用路径。scope的作用域通常比单个path节点更大,这为后续参数替换提供了更稳定的上下文。

通过这种方式,可以导出完整的解密函数代码,并将其注入到当前环境中执行。验证成功后,剩余的加密参数就可以基于原始加密算法直接计算出来。这种纯算方法无需抓包,适用于滑块、点选等多种场景,结构稳定不易被大版本更新完全破坏。

获取解密函数名称和代码

第一步是获取解密函数的名称和源码。打开AST浏览器工具后,找到目标JS文件的入口节点,遍历program.body中的表达式节点。针对特定位置的节点,提取其左侧表达式的函数名称,并拼接生成解密函数的JS代码片段。代码示例如下:

function decrypt_jy4(ast) {
decode_js_code = ''
body = ast.program.body
for (i = 0; i < 5; i++) {
if (i === 2) {
decode_name = generator(body[i].expression.left).code
}
decode_js_code += generator(body[i]).code
}
}
decrypt_jy4(ast)
eval(decode_js_code)执行后就能得到可直接eval的解密函数源码。注意这里使用了代码生成器来处理节点,确保输出的代码格式正确。

定位被赋值的函数名称

第二步聚焦于变量声明节点。遍历AST中的VariableDeclaration路径,检查声明数量是否为3,并验证第二个和第三个声明是否符合特定的初始化模式,比如调用concat方法。满足条件的声明语句会直接被导出并执行,导出后的结果会提供两个关键的解密函数名称。

plugins1 = { VariableDeclaration(path) { node = path.node if (node.declarations.length !== 3) { return } if (node.declarations[0].init && node.declarations[1].init && node.declarations[1].init.callee && node.declarations[1].init.callee.property && node.declarations[1].init.callee.property.name === 'concat') { let first_decrypt_name = node.declarations[0].id.name let second_decrypt_name = node.declarations[2].id.name // 执行导出代码 } } }

作用域追踪确定加密函数引用

第三步通过scope追踪精确定位加密函数的调用。获取两个解密函数名称的绑定信息,然后遍历其referencePaths。检查父节点是否为CallExpression且参数长度为1并为数值类型。满足条件后,执行父节点代码并替换为计算后的值。

first_decrypt_name_bind.referencePaths.map(function (scope_path) { if (!scope_path.parentPath) return; if (scope_path.parentPath.node.type !== "CallExpression") return; if (scope_path.parentPath.node.arguments.length !== 1) return; if (scope_path.parentPath.node.arguments[0].type !== "NumericLiteral") return; let decrypt_value = eval(_path.parentPath + '') scope_path.parentPath.replaceInline(types.valueToNode(decrypt_value)) })

这个过程确保了即使变量名更新,加密函数仍能被正确调用。

滑块验证逆向全流程

以滑块验证为例,整个逆向流程围绕load和verify接口展开。首先访问主网址获取JS链接和captcha_id。load接口携带captcha_id、背景图路径和参与加密的JS文件。verify接口则返回w参数,成功时验证通过。

关键参数包括setLeft用于滑动距离,passtime固定为滑动时间,userresponse通过公式x / 1.0059466666666665 + 2计算,lot_number作为唯一标识,pow_msg和pow_sign用于校验。16位动态值通过死循环拼接生成key值,确保每次请求的随机性。两个键值对则定义RSA和AES的加密规则。

RSANode实现和RSApython实现可直接用于参数加密,AES实现则处理更复杂的位运算。整个流程模拟参数生成后,即可轻松完成验证。

文字点选、图标点选等其他验证类型

文字点选验证要求先识别文字顺序再计算点击位置,图标点选则依赖SVG图标的精确坐标。消消乐、五子棋、九宫格和SVG图标验证同样遵循类似AST解混淆逻辑,只是加密参数的结构略有不同。通过提取lot_number和pow_sign后,配合16位动态值即可实现自动化。

这些验证类型在结构上保持一致,解混淆后可无缝对接API实现。实际操作中建议结合在线AST浏览器工具快速验证节点替换效果。

通过这些纯算方法,开发者能够高效处理极验四代全家桶的各种验证场景,轻松实现自动化测试和参数模拟生成。欢迎访问www.ttocr.com查看易盾极验验证码识别技术,滑块、点选、无感、九宫格等破解方案和自动化API对接平台,轻松实现无缝对接。






































