# Web Reverse Engineering

> AI驱动的系统化Web逆向工程方法论与实战指南

- **Type:** Skill
- **Install:** `agentstack add skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [kings0527](https://agentstack.voostack.com/s/kings0527)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [kings0527](https://github.com/kings0527)
- **Source:** https://github.com/kings0527/web-reverse-engineering-skill

## Install

```sh
agentstack add skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# Web Reverse Engineering Skill

> AI驱动的系统化Web逆向工程方法论与实战指南
> 基于2026年反检测技术格局 + 开源项目实战

## 适用范围

> **定位：纯Web逆向，不含移动端App/原生层。** 本Skill聚焦浏览器环境下的JS逆向、反爬对抗、协议指纹绕过等Web安全领域。

当用户提出以下类型请求时，激活本Skill：
- **JS逆向分析**：目标网站使用JS混淆、JSVMP、控制流平坦化等保护，需要还原算法逻辑
- **反爬对抗**：遭遇Cloudflare、DataDome、瑞数、极验等反爬系统，需要绕过检测
- **签名算法还原**：需要复现请求签名（如X-Sign、__zse_ck、X-Gnarly等）
- **浏览器自动化反检测**：自动化脚本被识别为Bot，需要绕过CDP检测/指纹检测
- **TLS/协议指纹绕过**：遭遇JA3/JA4/HTTP2/QUIC指纹检测，需要模拟真实浏览器协议握手
- **验证码绕过**：滑块、点选、reCAPTCHA、Turnstile等验证码的自动化方案
- **环境修补**：在Node.js中运行浏览器端JS代码，需要伪造BOM/DOM环境

**不适用场景**：
- 纯后端API逆向（无JS保护）→ 直接使用抓包+请求伪造
- 移动端App/原生层逆向 → 不在本Skill范围内
- 二进制逆向（PE/ELF/Mach-O）→ 使用Ghidra/IDA

## 核心原则

1. **Observe-First（观察优先）**：先用CDP/抓包/DevTools收集完整行为数据，再开始分析。不猜测，用证据驱动。
2. **Evidence-Based（证据驱动）**：所有结论必须基于trace日志、网络包、字节码等可验证证据，拒绝推测。
3. **Minimum-Patch（最小修补）**：环境修补只补目标代码实际访问的API，不做多余伪造，减少被检测面。
4. **Layer-by-Layer（分层击破）**：组合保护按层级逐击破，先破外层（TLS/请求层），再破内层（JS/VM层）。
5. **Reproduce-Then-Optimize（先复现再优化）**：先完整复现目标算法（哪怕效率低），再优化性能和成功率。
6. **Tool-Appropriate（工具适配）**：根据反爬等级选择匹配工具，避免过度工程（简单混淆不必上JSVMP分析）。
7. **Iterative-Deepening（迭代深化）**：从最简方案开始，遇阻时逐级升级对抗手段。

---

# 第一部分：系统层方法论

## 1. 反爬技术全景图

### 1.1 攻击面四层模型

| 层级 | 检测技术 | 对抗策略 | 工具链 |
|------|---------|---------|--------|
| 请求层 | IP信誉评分、请求频率异常、Header一致性校验 | 代理池轮换、请求间隔随机化、Header模板化 | curl_cffi, httpx, requests |
| 协议层 | TLS指纹(JA3/JA4)、HTTP/2 SETTINGS帧指纹、QUIC传输参数 | TLS模拟、HTTP/2参数伪造 | curl_cffi, tls-client, h2 |
| 浏览器层 | JS环境检测、Canvas/WebGL/Audio指纹、CDP协议泄露 | 反检测浏览器、环境修补、CDP隐藏 | nodriver, patchright, camoufox |
| 引擎层 | JSVMP字节码VM、WASM保护、自定义IR混淆 | VM执行追踪、操作码还原、WASM反编译 | Chrome DevTools, Ghidra, Proxy Hook |

### 1.2 主流反爬技术分类

| 类别 | 技术 | 检测原理 | 难度 |
|------|------|---------|------|
| JS混淆-L1 | 变量名混淆 | 标识符替换为_0x1a2b3c | ★☆☆☆☆ |
| JS混淆-L2 | 字符串加密 | 字符串数组+解密函数+解码器旋转 | ★★☆☆☆ |
| JS混淆-L3 | 控制流平坦化 | switch-case状态机+"数字串".split("|") | ★★★☆☆ |
| JS混淆-L4 | 死代码注入+自我防御 | 虚假分支+debugger陷阱+反格式化 | ★★★★☆ |
| JS混淆-L5 | JSVMP字节码VM | 自定义VM执行编译后的字节码 | ★★★★★ |
| 浏览器指纹 | Canvas指纹 | 2D渲染像素级差异+toDataURL哈希 | ★★★☆☆ |
| 浏览器指纹 | WebGL指纹 | 渲染器/厂商信息+扩展列表+着色器精度 | ★★★☆☆ |
| 浏览器指纹 | AudioContext指纹 | OfflineAudioContext浮点运算差异 | ★★★☆☆ |
| 浏览器指纹 | 字体枚举 | 通过宽高差异探测已安装字体 | ★★☆☆☆ |
| 浏览器指纹 | 屏幕/窗口属性 | screen尺寸、colorDepth、devicePixelRatio一致性 | ★★☆☆☆ |
| 浏览器指纹 | Navigator属性 | plugins数组、languages、hardwareConcurrency | ★★☆☆☆ |
| 浏览器指纹 | Permissions API | Notification.permission等权限状态 | ★★☆☆☆ |
| CDP检测 | Runtime.enable泄露 | 页面JS检测CDP Runtime域是否启用 | ★★★★☆ |
| CDP检测 | sourceURL注入 | evaluate注入的__pptr:__/_playwright_标记 | ★★★☆☆ |
| CDP检测 | navigator.webdriver | Chrome自动化标志位 | ★★☆☆☆ |
| CDP检测 | Target.setAutoAttach | 检测CDP Target域调用痕迹 | ★★★★☆ |
| CDP检测 | Chrome DevTools窗口 | window.outerWidth/Height差异检测 | ★★☆☆☆ |
| TLS指纹 | JA3指纹 | TLS版本+密码套件+扩展+曲线→MD5 | ★★★☆☆ |
| TLS指纹 | JA4指纹 | 规范化标识+TCP/HTTP2维度→36字符 | ★★★★☆ |
| 协议指纹 | HTTP/2 SETTINGS帧 | SETTINGS参数顺序、初始窗口大小、帧优先级配置 | ★★★☆☆ |
| 协议指纹 | QUIC传输参数 | 初始RTT、流控窗口、连接迁移参数 | ★★★★☆ |
| 行为分析 | 鼠标轨迹分析 | 速度曲线、加速度、微抖动模式 | ★★★☆☆ |
| 行为分析 | 键盘节奏分析 | 按键间隔分布、打字节奏模式 | ★★★☆☆ |
| 行为分析 | 请求时序分析 | 请求间隔分布、页面停留时间 | ★★☆☆☆ |
| 行为分析 | 页面交互序列 | 滚动/点击/焦点切换的行为模式 | ★★☆☆☆ |
| 验证码 | 滑块验证码 | 缺口识别+拟人轨迹验证 | ★★★☆☆ |
| 验证码 | 点选验证码 | 文字/图标识别+坐标点击 | ★★★★☆ |
| 验证码 | reCAPTCHA v2 | 图像分类+行为评分 | ★★★★☆ |
| 验证码 | reCAPTCHA v3 | 纯行为评分（无交互） | ★★★★☆ |
| 验证码 | Cloudflare Turnstile | 浏览器环境+行为综合评分 | ★★★★☆ |
| 验证码 | 极验GEETEST | 滑块/点选/图标多模态 | ★★★☆☆ |
| WAF | Cloudflare | JS Challenge+TLS指纹+行为分析组合 | ★★★★★ |
| WAF | DataDome | CDP检测+设备指纹+实时行为 | ★★★★☆ |
| WAF | 瑞数(RuiShu) | 动态JS混淆+cookie验证+JSVMP | ★★★★★ |
| WAF | 顶象(DingXiang) | JSVMP+环境检测+设备指纹 | ★★★★★ |
| WAF | 数美(ShuMei) | JS混淆+设备指纹+行为分析 | ★★★★☆ |

### 1.3 对抗策略决策矩阵

| 目标反爬类型 | 首选策略 | 备选策略 | 避免方案 |
|-------------|---------|---------|---------|
| 仅IP封禁 | 代理池+请求限速 | - | 单IP高频 |
| Header校验 | curl直接伪造Header | - | requests默认Header |
| TLS指纹检测 | curl_cffi模拟Chrome | tls-client | Python requests |
| 简单JS混淆(可读懂) | AST反混淆+环境修补 | webcrack自动处理 | 手动逐行阅读 |
| 重度JS混淆 | webcrack/js-deobfuscator+动态调试 | Chrome DevTools条件断点 | 纯静态分析 |
| JSVMP保护 | Proxy Hook+执行追踪+操作码还原 | Chrome DevTools LogPoint | 试图静态反编译VM |
| CDP检测 | nodriver直接CDP驱动 | rebrowser-patches | 原版Playwright/Puppeteer |
| 行为分析 | 拟人轨迹+随机化 | 真实浏览器+人工辅助 | 机械化操作 |
| 验证码 | 专业打码平台+AI分类 | 手动解决+逆向验证逻辑 | 暴力尝试 |

## 2. 系统化分析流程

### 2.0 10分钟快速反爬类型判定

在启动完整分析流程前，先用以下快速方法确定目标网站的保护类型：

**Step 1（2min）**：curl直接请求，观察响应
- 正常返回 → 无JS层保护，直接请求伪造
- 403/空响应 → 可能有TLS/IP层检测
- 返回HTML但无数据 → 需要执行JS

**Step 2（3min）**：浏览器正常访问+DevTools Network面板
- 观察是否有challenge页面（Cloudflare/瑞数特征）
- 检查cookie名称模式（__cf_bm, __cf_clearance, $_ts等）
- 观察JS文件特征（混淆程度、JSVMP特征）

**Step 3（3min）**：检查关键请求参数
- 是否有签名参数（sign, token, X-Bogus等）
- 签名参数是否每次变化
- 请求Header中是否有自定义加密字段

**Step 4（2min）**：初步判定与路径选择

| 观察结果 | 判定 | 推荐路径 |
|---------|------|----------|
| curl可直接获取数据 | L1无保护 | curl_cffi |
| 需cookie但算法简单 | L2轻度保护 | 环境修补 |
| challenge页面+复杂cookie | L3中度保护 | nodriver/patchright |
| JSVMP+多重签名 | L4重度保护 | VM执行追踪+操作码分析 |
| 全栈保护+行为分析 | L5极端保护 | 分层击破 |

### 2.1 六步法

```
侦察 → 识别 → 定位 → 分析 → 还原 → 验证
```

**Step 1：侦察（Reconnaissance）**
- **输入**：目标URL、目标API端点
- **动作**：浏览器DevTools Network面板抓包、检查请求Header/Cookie/参数、记录响应状态码和内容
- **工具**：Chrome DevTools、curl、mitmproxy
- **输出**：请求参数清单、反爬现象描述（如403/JS Challenge/验证码页面）
- **检查点**：是否记录了完整的请求序列（含重定向链）

**Step 2：识别（Identification）**
- **输入**：侦察阶段收集的数据
- **动作**：判断反爬类型（参考1.2分类表）、识别保护厂商、评估保护等级
- **工具**：Wappalyzer、浏览器扩展、手动分析JS源码特征
- **输出**：反爬类型判定、保护等级评估
- **检查点**：是否正确识别了所有保护层级（可能组合多种）

> **MCP强制调用**：`detect_protection` → 获取保护类型和等级
> 如果 level ≥ 3 且 features 包含 "JSVMP" 或 "WASM"：
> → 执行WebTrace安装与连接三阶段流程（见.cursorrules）
> → 优先自动安装（方式A/B），无法自动则引导用户手动加载（方式C）
> → 连接验证通过后，方可进入Step 3

**Step 3：定位（Localization）**
- **输入**：反爬类型判定结果
- **动作**：定位关键JS文件/函数、定位签名参数生成点、定位检测代码
- **工具**：Chrome DevTools Sources面板、断点调试、全局搜索
- **输出**：关键JS文件URL、关键函数位置、参数生成调用链
- **检查点**：能否在源码中搜索到目标参数名（如"_signature"、"X-Bogus"）

> **MCP强制调用**（保护等级≥L3时）：
> - JSVMP场景：`analyze_jsvmp` → 获取派发循环结构和操作码映射
> - WASM场景：`extract_wasm` + `analyze_wasm` → 获取模块信息和加密算法特征

**Step 4：分析（Analysis）**
- **输入**：定位到的关键代码
- **动作**：AST反混淆、动态调试trace、VM操作码分析、算法逻辑提取
- **工具**：webcrack、Chrome DevTools LogPoint、Babel AST、Proxy Hook
- **输出**：算法逻辑描述（伪代码或可读代码）
- **检查点**：是否理解了完整的算法流程，包括输入/输出/中间状态

> **MCP强制调用**（保护等级≥L3时）：
> - `hook_api("crypto.subtle.digest")` → 监控加密过程
> - `hook_api("document.cookie", {mode:"observe"})` → 监控cookie生成
> - `hook_api("fetch", {captureRequestHeaders:true})` → 监控请求签名
> - 等待目标操作触发后：`get_hook_logs` → 收集分析数据

**Step 5：还原（Reproduction）**
- **输入**：算法逻辑描述
- **动作**：用Python/JS/Node.js复现算法、伪造必要的浏览器环境
- **工具**：Node.js、Python、Babel AST
- **输出**：可独立运行的签名/加密代码
- **检查点**：独立代码的输出是否与浏览器端一致

> **MCP强制调用**（保护等级≥L3时）：
> - `trace_execution(code, inputs)` → 在沙箱中执行并收集trace
> - 或 `deobfuscate(code)` → 先反混淆再分析
> - WASM场景：`dump_wasm_memory(offset, length)` → 提取密钥/中间值

**Step 6：验证（Verification）**
- **输入**：还原代码
- **动作**：批量测试签名正确性、集成到爬虫框架、监控成功率
- **工具**：pytest、curl、爬虫框架
- **输出**：经过验证的、可投入生产的代码
- **检查点**：100次连续请求的成功率是否≥95%

### 2.2 分析路径决策树（含强制MCP调用）

```
目标网站
├── L1-L2（无/轻度保护）→ 不需要WebTrace，curl_cffi直接请求
│   └── 检查：curl_cffi模拟浏览器TLS指纹 + 代理IP轮换
├── L3（Challenge页）→ [自动安装WebTrace]
│   ├── detect_protection → page_state → hook_api("document.cookie")
│   └── 获取cookie后用curl_cffi请求
├── L4（JSVMP+签名）→ [强制WebTrace]
│   ├── analyze_jsvmp(code) → 获取VM结构
│   ├── hook_api("crypto.subtle") + hook_api("fetch")
│   ├── get_hook_logs → 提取签名逻辑
│   └── trace_execution → 验证还原结果
├── L4-L5（WASM）→ [强制WebTrace]
│   ├── extract_wasm → analyze_wasm → 识别加密算法
│   ├── dump_wasm_memory → 提取密钥
│   └── 纯算法重写验证
└── L5（组合保护）→ [强制WebTrace + nodriver]
    ├── detect_protection → 分层识别
    ├── hook_api全套监控
    ├── analyze_jsvmp + extract_wasm 联合分析
    └── 分层逐步击破
```

## 2.3 工作流选择与成本优化

#### 工作模式选型

| 目标特征 | 推荐模式 | 预期成本 | 适用场景 |
|---------|---------|---------|----------|
| 简单混淆、明确API | 全自动 + 廉价模型 | ¥0.5~2 | 快速验证 |
| 复杂JSVMP、需要理解 | AI辅助 + 单模型 | ¥3~8 | 关键站点 |
| 强保护 + 批量站点 | 成本拆分（worker+director） | ¥1~3/个 | 生产运维 |
| 业务关键 + 高可靠性 | AI辅助 + 人工领航 | ¥8~15 | 受限域 |

#### 成本拆分架构

当需要批量处理复杂目标时，推荐 worker+director 模式：
- **Worker（弱模型）**：执行所有工具调用、数据收集、环境修补的"脏活"
- **Director（强模型）**：每个阶段做方向决策、审视结果、修正路线

效果：强模型token消耗从70%降至10%，总成本降低60~70%。

#### 两种工作模式

**全自动模式**：AI Agent一条龙完成「侦查→定位→补环境→验证→产出算法」
- 适用：保护等级L1-L3、有历史经验的同类站点
- 优势：零人工干预、可批量运行
- 风险：复杂场景容易陷入死循环

**AI辅助模式**：每个阶段停下汇报，给出2-3个方向选择
- 适用：保护等级L4-L5、首次遇到的保护类型
- 优势：人类智慧参与决策、避免方向错误
- 实现：AI完成分析→输出现状和选项→等待决策→继续执行

## 3. 工具链架构

### 3.1 四层工具栈

**基础层（网络与抓包）**：
- `curl_cffi` — Python HTTP库，模拟浏览器TLS指纹（JA3/JA4）
- `httpx` — 现代Python异步HTTP客户端
- `mitmproxy` — 中间人代理，抓包/改包/断点
- `curl-impersonate` — curl的浏览器指纹模拟分支

**引擎层（JS逆向与反检测）**：
- `webcrack` — JS自动反混淆（控制流平坦化+字符串解密+死代码）
- `js-deobfuscator` — 通用JS反混淆框架
- `synchrony` — obfuscator.io专用反混淆器
- `nodriver` (v0.50.3) — Python直接CDP WebSocket驱动，31/31反检测基准全通过
- `patchright` — Playwright fork，32个driver_patches模块全面修补
- `rebrowser-patches` — Puppeteer/Playwright的Runtime.enable泄露修补

**AI层（智能辅助）**：
- `anything-analyzer` — Electron桌面应用，MCP Client/Server架构的逆向分析平台
- `js-reverse-mcp` — Google出品的JS逆向MCP Server，提供AST分析工具集
- `reverse-skill` — AI逆向Skill集合，Observe→Capture→Rebuild→Patch→DeepDive模型

**自动化层（爬虫框架）**：
- `Crawl4AI` (66k stars) — AI驱动的通用爬虫框架
- `Firecrawl` (125k stars) — 智能网页内容提取
- `deepspider` — AI辅助的爬虫蜘蛛

### 3.2 工具选择决策表

| 场景 | 推荐工具 | 安装命令 | 替代方案 | 不适用 |
|------|---------|---------|---------|--------|
| TLS指纹绕过 | curl_cffi | `pip install curl_cffi` | tls-client, curl-impersonate | Python requests |
| JS控制流反平坦化 | webcrack | `npx webcrack` | js-deobfuscator | 手动AST |
| obfuscator.io还原 | synchrony | `npx synchrony` | webcrack | 手工分析 |
| CDP反检测(Python) | nodriver | `pip install nodriver` | camoufox | Selenium原版 |
| CDP反检测(Node.js) | patchright | `npm i patchright` | rebrowser-patches | Playwright原版 |
| CDP反检测(Puppeteer) | rebrowser-patches | `npx rebrowser-patches patch` | patchright | puppeteer-extra-stealth |
| JSVMP分析 | Proxy Hook + Chrome DevTools LogPoint | 执行追踪脚本 | Chrome Extension注入 | 纯静态分析 |
| 环境修补 | 自定义Proxy监测+逐步补全 | 手写 | jsdom（部分可用） | 完整Chromium |
| 签名复现验证 | Node.js子进程 | 内置 | Python execjs | 浏览器内运行 |

### 3.3 WebTrace MCP 工具集（JSVMP/WASM分析时自动启用）

> **强制规则**：当检测到目标保护等级≥L3（JSVMP/WASM/复杂签名）时，
> Agent必须自动安装并连接WebTrace MCP Server。

WebTrace 是一个 Chrome/Edge Extension，通过 MCP 协议暴露 Web 逆向分析能力。
AI Agent 可直接调用以下工具执行分析任务，无需手动操作 DevTools。

#### 安装与连接（三阶段流程）

**阶段1 - 构建**（Agent自动执行）：
```bash
git clone --depth 1 https://github.com/kings0527/web-trace.git
cd web-trace && npm install && npm run build
```

**阶段2 - 加载Extension**（按Agent能力选择）：

| Agent类型 | 推荐方式 | 命令/操作 |
|-----------|---------|----------|
| nodriver/patchright | 自动加载 | `--load-extension=./web-trace/dist` |
| 可启动浏览器的Agent | CLI启动 | `msedge/chrome --load-extension=./web-trace/dist` |
| 无法启动浏览器 | 引导用户 | 输出手动加载步骤指引 |

**阶段3 - 连接MCP**：
- 自动连接：`ws://127.0.0.1:3100/mcp`
- 验证命令：调用 `detect_protection` 确认响应正常

#### 引导用户手动加载（Agent无法自动完成时）

当Agent不能自动启动浏览器或加载Extension时，输出以下文字引导用户：

> 请完成以下操作以启用WebTrace分析工具：
> 1. 打开 Edge/Chrome 浏览器
> 2. 访问 `edge://extensions` 或 `chrome://extensions`
> 3. 开启「开发者模式」（右上角开关）
> 4. 点击「加载已解压的扩展程序」
> 5. 选择 `web-trace/dist` 目录
> 6. 确认"WebTrace"已显示在扩展列表中
> 完成后请告知，我将继续分析。

#### 可用工具

| Tool | 功能 | 典型场景 |
|------|------|----------|
| `detect_protection` | 检测页面保护类型和等级 | 初期侦查，判定反爬类型 |
| `analyze_jsvmp` | 分析JSVMP代码结构，识别派发循环 | VM逆向，定位操作码分支 |
| `trace_execution` | 在QuickJS沙箱中执行并收集trace | 离线分析，验证算法逻辑 |
| `extract_bytecode` | 从页面中提取字节码数组 | JSVMP数据提取 |
| `extract_wasm` | 提取页面中的WASM模块 | WASM逆向，获取二进制 |
| `analyze_wasm` | WASM反汇编+加密算法识别 | WASM逆向，定位密码函数 |
| `dump_wasm_memory` | 读取WASM实例线性内存 | 密钥提取，运行时数据 |
| `hook_api` | 在页面中设置隐蔽API Hook | 动态监控fetch/crypto等 |
| `get_hook_logs` | 获取Hook收集的调用日志 | 数据收集，签名参数捕获 |
| `page_state` | 获取页面完整状态(cookie/storage/scripts) | 初期侦查，环境信息 |
| `deobfuscate` | 反混淆JS代码（多种变换） | 代码清洗，可读性还原 |

#### 推荐工作流

```
1. page_state → 了解页面结构和初始状态
2. detect_protection → 识别保护类型和等级
3. 根据保护类型选择路径：
   ├── L1-L2: deobfuscate → 分析清洗后的代码逻辑
   ├── L3(混淆): deobfuscate → analyze_jsvmp → trace_execution
   ├── L4(JSVMP): extract_bytecode → analyze_jsvmp → hook_api(crypto/cookie) → get_hook_logs
   ├── L4-L5(WASM): extract_wasm → analyze_wasm → dump_wasm_memory
   └── 组合保护: hook_api + extract_bytecode + extract_wasm 联合分析
```

#### 与其他工具的配合

- **nodriver/patchright**：提供反检测浏览器环境，启动时通过 `--load-extension` 自动加载 WebTrace
- **mitmproxy**：网络层抓包分析，WebTrace 提供应用层 JS/WASM 分析能力
- **webcrack**：离线 AST 反混淆，WebTrace 的 `deobfuscate` 提供在线版本（直接对页面代码操作）
- **curl_cffi**：签名复现验证，WebTrace 的 `hook_api` + `get_hook_logs` 用于捕获签名参数

> 详细使用说明见 `references/webtrace-mcp.md`

---

# 第二部分：问题细节层 - 各类反爬针对性解法

## 4. JS混淆对抗

### 4.1 变量/函数名恢复

**方法**：AST分析 + 上下文推断

1. **字符串关联法**：变量在字符串拼接/模板字符串中使用时，根据上下文推断含义
2. **API调用推断法**：`_0x1a2b3c.call(null, "click")` → 推断为事件派发函数
3. **类型推断法**：通过操作符推断类型（`>>>0` → 无符号整数、`|0` → 整数）

```javascript
// Babel AST遍历：根据MemberExpression属性名推断变量含义
const renameVisitor = {
  VariableDeclarator(path) {
    const binding = path.scope.getBinding(path.node.id.name);
    if (!binding) return;
    // 检查所有引用点的上下文
    for (const ref of binding.referencePaths) {
      const parent = ref.parentPath;
      if (parent.isMemberExpression({ object: ref.node })) {
        const prop = parent.node.property.name || parent.node.property.value;
        // 如 _0x1a2b.length → 可能是数组或字符串
        console.log(`${path.node.id.name} → used as .${prop}`);
      }
    }
  }
};
```

### 4.2 字符串解密

**完整流程**：找到解密函数 → 静态计算 → 批量替换

```javascript
// Step 1: 识别字符串数组和解密函数模式
// 典型模式：const _0xabc = ["base64str1", "base64str2", ...];
// function _0xdef(index, key) { return atob(_0xabc[index]) ^ key; }

// Step 2: 用Babel AST提取并执行解密函数
const { parse } = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const generate = require('@babel/generator').default;
const vm = require('vm');

function decryptStrings(code) {
  const ast = parse(code);
  // 提取字符串数组和解密函数
  let stringArray = null;
  let decryptFn = null;
  
  traverse(ast, {
    VariableDeclaration(path) {
      const decl = path.node.declarations[0];
      if (decl.init?.type === 'ArrayExpression' && 
          decl.init.elements.length > 50) {
        // 大数组 → 可能是字符串数组
        stringArray = generate(decl).code;
      }
    },
    FunctionDeclaration(path) {
      if (path.node.params.length >= 2) {
        const body = generate(path.node).code;
        if (body.includes('atob') || body.includes('charCodeAt')) {
          decryptFn = body;
        }
      }
    }
  });

  // Step 3: 在沙箱中执行解密函数，批量替换调用点
  const sandbox = {};
  vm.createContext(sandbox);
  vm.runInContext(`${stringArray}; ${decryptFn};`, sandbox);
  
  traverse(ast, {
    CallExpression(path) {
      try {
        const code = generate(path.node).code;
        const result = vm.runInContext(code, sandbox);
        if (typeof result === 'string') {
          path.replaceWith({ type: 'StringLiteral', value: result });
        }
      } catch(e) {}
    }
  });
  return generate(ast).code;
}
```

### 4.3 控制流反平坦化

**核心模式识别**：`"2|4|3|0|1".split("|")` + switch-case状态机

webcrack的 `control-flow-switch.ts` 实现原理（详见 `references/deobfuscation.md`）：

1. **匹配模式**：识别 `const sequence = "数字串".split("|")` + `while(true) { switch(sequence[iterator++]) { case "0": ... } }`
2. **提取序列**：从字符串字面量中提取执行顺序，如 `"2|4|3|0|1"` → `[2,4,3,0,1]`
3. **重排分支**：按序列顺序重新排列switch case中的语句
4. **移除包装**：去除while(true)/switch/iterator，输出扁平化代码

```javascript
// 反平坦化前后对比
// Before:
const _0xa = "2|4|3|0|1".split("|");
let _0xb = 0;
while (true) {
  switch (_0xa[_0xb++]) {
    case "0": console.log("step4"); continue;
    case "1": console.log("step5"); continue;
    case "2": console.log("step1"); continue;
    case "3": console.log("step3"); continue;
    case "4": console.log("step2"); continue;
  }
  break;
}

// After:
console.log("step1");
console.log("step2");
console.log("step3");
console.log("step4");
console.log("step5");
```

### 4.4 JSVMP逆向完整指南

> **前置条件**：进入本节分析时，必须已完成WebTrace自动安装并连接MCP Server。

#### 4.4.1 JSVMP架构理解

**通用流水线**：`Source JS → Parser(Babel) → AST → Compiler → ByteCode → VM.execute()`

**栈式VM vs 寄存器式VM**：
- **栈式VM**（如jsvmp项目）：操作数通过栈传递，`PUSH a; PUSH b; ADD` → 弹出b和a，计算a+b，推入结果
- **寄存器式VM**（如新版腾讯VMP）：操作数通过虚拟寄存器传递，`ADD R1, R2, R3` → R1=R2+R3

**jsvmp项目指令集**（详见 `references/jsvmp-architectu

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [kings0527](https://github.com/kings0527)
- **Source:** [kings0527/web-reverse-engineering-skill](https://github.com/kings0527/web-reverse-engineering-skill)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill
- Seller: https://agentstack.voostack.com/s/kings0527
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
