AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Web Reverse Engineering

skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill · by kings0527

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

No reviews yet
0 installs
15 views
0.0% view→install

Install

$ agentstack add skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access Used
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Web Reverse Engineering? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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模板化 | curlcffi, httpx, requests | | 协议层 | TLS指纹(JA3/JA4)、HTTP/2 SETTINGS帧指纹、QUIC传输参数 | TLS模拟、HTTP/2参数伪造 | curlcffi, 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名称模式(__cfbm, _cfclearance, $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自动执行):

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://extensionschrome://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 → 整数)
// 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 字符串解密

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

// 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,输出扁平化代码
// 反平坦化前后对比
// 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.

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

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.