Install
$ agentstack add skill-kings0527-web-reverse-engineering-skill-web-reverse-engineering-skill ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo 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.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
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 →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
核心原则
- Observe-First(观察优先):先用CDP/抓包/DevTools收集完整行为数据,再开始分析。不猜测,用证据驱动。
- Evidence-Based(证据驱动):所有结论必须基于trace日志、网络包、字节码等可验证证据,拒绝推测。
- Minimum-Patch(最小修补):环境修补只补目标代码实际访问的API,不做多余伪造,减少被检测面。
- Layer-by-Layer(分层击破):组合保护按层级逐击破,先破外层(TLS/请求层),再破内层(JS/VM层)。
- Reproduce-Then-Optimize(先复现再优化):先完整复现目标算法(哪怕效率低),再优化性能和成功率。
- Tool-Appropriate(工具适配):根据反爬等级选择匹配工具,避免过度工程(简单混淆不必上JSVMP分析)。
- 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://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分析 + 上下文推断
- 字符串关联法:变量在字符串拼接/模板字符串中使用时,根据上下文推断含义
- API调用推断法:
_0x1a2b3c.call(null, "click")→ 推断为事件派发函数 - 类型推断法:通过操作符推断类型(
>>>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):
- 匹配模式:识别
const sequence = "数字串".split("|")+while(true) { switch(sequence[iterator++]) { case "0": ... } } - 提取序列:从字符串字面量中提取执行顺序,如
"2|4|3|0|1"→[2,4,3,0,1] - 重排分支:按序列顺序重新排列switch case中的语句
- 移除包装:去除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.
- Author: kings0527
- Source: kings0527/web-reverse-engineering-skill
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.