当前位置: 首页 > news >正文

保姆级教程:手把手教你逆向分析PerimeterX Bot Defender (PX3) 的混淆与解密

保姆级教程:手把手教你逆向分析PerimeterX Bot Defender (PX3) 的混淆与解密

当你面对一个采用PerimeterX PX3防护的网站时,那些经过层层混淆的JavaScript代码就像是被锁在迷宫中的宝藏。本文将带你从零开始,一步步拆解这个迷宫,找到关键加密函数的秘密。不同于简单的记录性文章,这里提供的是一套可复现、可操作的实战指南,适合那些希望在JS逆向领域深耕的安全研究员和爬虫工程师。

1. 逆向前的准备工作

在开始逆向之前,我们需要搭建一个合适的工作环境。首先确保你的电脑上安装了最新版本的Node.js(建议v16+),这将为我们提供运行JavaScript代码的基础环境。接下来,安装几个关键工具:

npm install esprima estraverse escodegen -g npm install babel-parser -g

这些工具构成了我们解混淆的基础工具链。Esprima用于将JavaScript代码解析为抽象语法树(AST),Estraverse用于遍历和修改AST,而Escodegen则负责将修改后的AST重新生成为可读的JavaScript代码。

为什么选择AST解混淆?因为PerimeterX PX3使用的字符串混淆、控制流平坦化等技术,本质上都是对AST的特定修改。直接在AST层面操作,可以绕过很多表面上的混淆手段。

提示:建议使用VS Code作为代码编辑器,配合JavaScript调试插件,可以大幅提升逆向效率。

2. 初步分析与参数定位

当我们访问受PX3保护的网站时,通常会看到向/collector接口发送的请求,其中包含几个关键参数:

  • p6: 由cookie返回的值
  • seq,rsc: 自增的序列号
  • payloadpc: 两个采用不同算法加密的核心参数

为了定位这些参数的生成位置,我们需要先获取PX3的防护脚本。通常可以通过以下方式找到:

  1. 在浏览器开发者工具中搜索PX3PerimeterX关键字
  2. 查找包含initPX3或类似初始化函数的脚本
  3. 定位到主防护脚本后,将其保存为本地文件以便分析

关键步骤:

  1. 使用浏览器调试工具在脚本加载时设置断点
  2. 观察网络请求,找到第一个包含pc参数的请求
  3. 回溯调用栈,定位参数生成函数

3. AST解混淆实战

PX3 v8.5.4的字符串混淆相对容易还原,不像早期版本那样复杂。下面是一个典型的解混淆流程:

const fs = require('fs'); const esprima = require('esprima'); const estraverse = require('estraverse'); const escodegen = require('escodegen'); // 读取混淆后的代码 const code = fs.readFileSync('px3_obfuscated.js', 'utf-8'); // 解析为AST const ast = esprima.parseScript(code); // 遍历AST并解混淆 estraverse.traverse(ast, { enter: function(node, parent) { // 处理字符串混淆 if (node.type === 'CallExpression' && node.callee.type === 'MemberExpression' && node.callee.property.name === 'split') { // 解混淆逻辑... } // 处理控制流平坦化 if (node.type === 'SwitchStatement' && node.discriminant.type === 'Identifier' && node.discriminant.name === '控制变量') { // 解控制流平坦化... } } }); // 生成解混淆后的代码 const deobfuscated = escodegen.generate(ast); fs.writeFileSync('px3_deobfuscated.js', deobfuscated);

解混淆后,我们能够更清晰地看到代码逻辑,这时可以快速定位到加密位置。通常pc参数的加密代码就在payload加密位置的上方不远处。

4. 关键对象分析与函数扣取

PX3中有两个核心对象需要特别关注:

  1. t对象:一个数组,每次请求时内容都会变化
  2. S对象:包含版本信息、应用ID等固定字段

典型的t对象结构如下:

[ { "t": "PX12095", "d": { "PX11645": "https://www.example.com/", "PX12207": 0, "PX12458": "Win32", "PX11902": 0, "PX11560": 269, "PX12248": 3600, "PX11385": 1688690961524, "PX12280": 1688690961526, "PX11496": "1c796520-1c60-11ee-9c74-d7cdd48cc772", "PX12564": null, "PX12565": -1, "PX11379": true } } ]

而S对象的结构则类似于:

{ "tag": "v8.5.4", "appID": "PXDl82I3Ui", "cu": "f3136670-1e3c-11ee-806a-59aba21d5838", "pc": "6149997752707771" }

扣取加密函数的技巧:

  1. 先定位到加密函数调用处
  2. 回溯函数定义,确保获取完整的函数体
  3. 注意函数依赖的其他工具函数
  4. 将相关函数一并扣取,保持功能完整

5. 参数逆向与指纹分析

PX3的指纹收集是一个动态过程,主要体现在t对象的变化上。要完整逆向,需要分析t对象中各个参数的含义:

参数代码可能含义采集方式
PX11645当前页面URLwindow.location.href
PX12458平台信息navigator.platform
PX11385时间戳Date.now()
PX11496会话ID随机生成UUID
PX12248超时设置固定值3600秒

对于payloadpc参数的加密,通常遵循以下流程:

  1. 收集环境指纹信息(存储在t对象中)
  2. 序列化数据并进行初步编码
  3. 应用特定的加密算法(通常是AES或自定义算法)
  4. 对结果进行二次编码(Base64等)

在逆向过程中,特别要注意第二次请求时S对象中新增的vid参数。这个参数通常由It()函数返回,可以通过以下方式定位:

// 在浏览器调试器中设置条件断点 (function() { var oldIt = It; It = function() { debugger; return oldIt.apply(this, arguments); }; })();

当断点触发时,通过调用栈分析可以找到vid的设置位置,通常是在第一次返回结果解密后得到的。

6. 实战中的常见问题与解决方案

在实际逆向PX3的过程中,可能会遇到以下几个典型问题:

问题1:解混淆后代码仍难以理解

解决方案:

  • 使用AST可视化工具(如AST Explorer)辅助分析
  • 重点关注函数调用关系,忽略无关细节
  • 对关键函数进行重命名,提高可读性

问题2:加密函数依赖浏览器环境

解决方案:

  • 使用puppeteer或playwright模拟完整浏览器环境
  • 补全必要的全局变量和API
  • 对于特别复杂的依赖,考虑直接调用原脚本中的函数

问题3:参数生成存在时间敏感性

解决方案:

  • 记录完整的时间戳生成逻辑
  • 在本地实现相同的时间计算方式
  • 对于服务器时间依赖,可能需要同步时间或获取时间偏移量

注意:PX3的防护策略会定期更新,逆向方法也需要相应调整。建议保持对防护脚本变化的关注。

7. 进阶技巧与性能优化

当掌握了基本的逆向方法后,可以考虑以下进阶技巧提升效率和成功率:

  1. 自动化脚本:将解混淆、函数扣取等步骤编写成自动化脚本
  2. 缓存机制:对不变的指纹信息进行缓存,减少重复计算
  3. 并行处理:对多个独立模块采用并行分析策略
  4. 差异分析:对比不同版本的防护脚本,快速定位变化点

一个典型的自动化解混淆流程可能包含以下步骤:

# 伪代码示例 def auto_deobfuscate(script_path): # 1. 预处理:移除无用代码 cleaned_code = preprocess(script_path) # 2. AST解混淆 ast = parse_to_ast(cleaned_code) simplified_ast = remove_obfuscation(ast) # 3. 关键函数提取 crypto_funcs = extract_crypto_functions(simplified_ast) # 4. 环境模拟准备 env = prepare_browser_environment() # 5. 验证函数正确性 test_cases = generate_test_cases() verify_functions(crypto_funcs, env, test_cases) return crypto_funcs

在实际项目中,逆向PX3只是第一步。真正的挑战在于理解其背后的风控逻辑,特别是并发请求时的防护策略。这需要长期的观察和大量的测试数据积累。

http://www.jsqmd.com/news/598204/

相关文章:

  • 手把手教你用VSCode+DevEco Device Tool玩转OpenHarmony Hi3861开发板(Windows保姆级教程)
  • 告别暴力搜索:深入浅出解析FAISS的三种核心索引(IndexFlatL2/IVFFlat/IVFPQ)该怎么选
  • AI 日报 - 2026年4月6日
  • Keil5从零开始:手把手教你安装与配置(含必备工具包)
  • 实战指南:利用快马ai规划openclaw在ubuntu生产环境的全链路部署与运维
  • GridPlayer多视频同步播放工具高效实战指南
  • 2026届毕业生推荐的五大AI辅助写作助手实测分析
  • 重新定义电子阅读:KOReader打造个性化阅读环境的革新体验
  • 大语言模型时代的无监督学习:聚类与降维全解析
  • 振荡电路笔记
  • 如何突破输入法壁垒?输入法词库转换全攻略
  • 无障碍设计全面解析:构建包容性Vant Weapp组件库界面
  • 深入Aurix TC3xx SMU模块:从Alarm到安全状态机的汽车功能安全设计核心
  • 春秋云境CVE-2016-6802
  • 活字格低代码实战:快速搭建企业级 OA 与 CRM 系统
  • 4个高效步骤掌握BilibiliDown无损音频下载
  • 新手必看:用快马AI学习安卓隐私权限开发,避免相册访问雷区
  • 终极解锁NCM音乐自由:从加密困境到全设备畅听的技术破局指南
  • 9篇8章3节:MIMIC 数据伦理申请中的贝尔蒙报告与受试者研究伦理
  • Vue3数据大屏开发踩坑记:Canvas标尺的缩放、平移与精准坐标拾取
  • 突破数据壁垒的语音合成革命:GPT-SoVITS全解析
  • AI工具学习之Claude Code
  • 3步实现Vant Weapp无障碍颜色方案:打造包容性小程序界面
  • open_agb_firm:基于3DS GBA硬件加速的原生运行方案
  • 从理论到实战:基于快马平台打造一个高仿真的社区论坛数据库系统
  • 从需求到实现:基于快马AI生成电商订单系统数据库实战案例详解
  • 锐龙处理器终极调优指南:如何用RyzenAdj释放隐藏性能
  • 从Matlab到QT:我如何重构一个DBC/Excel转换工具,并开源了核心框架
  • 利用CycleGAN实现无监督图像风格迁移:从理论到自定义数据集实战
  • 快速原型实践:利用快马平台与openclaw tavily十分钟搭建智能信息检索demo