Files
hello_js_reverse_skill/references/workflow-overview.md
T
白夜 fb14cf7916 refactor: 将文件从子目录提升到仓库根目录
所有文件从 hello_js_reverse_skill/ 子目录移至仓库根目录,
使项目结构更清晰,便于作为 Skill 直接引用。

Made-with: Cursor
2026-03-18 22:55:27 +08:00

129 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JS 逆向工作流总览
## 解法模式决策树
```
目标网站数据接口
│
├─ 能否抓到明确的数据接口?
│ ├─ 否 → WebSocket?→ 场景7
│ │ 页面渲染数据?→ 场景8(字体反爬/CSS干扰)
│ └─ 是 ↓
│
├─ 请求中有加密参数?
│ ├─ 否 → 直接请求即可,检查是否有 Cookie/Header 校验
│ └─ 是 ↓
│
├─ 加密逻辑在哪里?
│ ├─ 明文 JS(可直接定位)→ 模式A:纯 Node.js 还原
│ ├─ 混淆 JS(OB/CFF/eval)→ 反混淆后 → 模式A 或 模式B
│ ├─ 服务端返回 JS 动态执行 → 模式B:VM 沙箱执行
│ ├─ WASM 二进制 → 模式C:WASM 加载
│ ├─ JSVMP 虚拟机保护 → 先尝试 I/O 定位,失败则 → 模式D
│ └─ 无法脱离浏览器环境 → 模式D:浏览器自动化
│
├─ 纯请求方案是否可行?
│ ├─ 请求成功 → 完成
│ └─ 请求失败(token failed / 403)↓
│
└─ TLS 指纹 / HTTP/2 检测?
├─ 是 → 切换到模式D 或使用 HTTP/2
└─ 否 → 检查 Cookie、时间戳、参数拼接错误
```
## 模式详解
### 模式 A:纯 Node.js 算法还原
**适用条件**:
- 加密算法可用标准库实现(MD5/SHA/AES/DES/RSA/HMAC)
- 无浏览器环境检测
- 无 TLS 指纹校验
**技术栈**:
- `crypto`(Node.js 内置)— MD5/SHA/AES/DES/HMAC
- `crypto-js` — CryptoJS 兼容实现
- `node-rsa` / `node-forge` — RSA 加解密
- `axios` / `node-fetch` — HTTP 请求
- `http2`(Node.js 内置)— HTTP/2 请求
**模板**:`templates/node-request/`
### 模式 B:Node vm 沙箱执行
**适用条件**:
- 服务端返回混淆 JS,需要 eval 执行生成 Cookie/Token
- 加密逻辑依赖大量上下文,手动还原成本过高
**技术栈**:
- `vm`(Node.js 内置)— 沙箱执行
- `vm2` — 更安全的沙箱(可选)
- `jsdom` — 模拟 DOM 环境(可选)
**注意事项**:
- 必须构造最小沙箱环境(document、navigator、location 等)
- Cookie setter 需要拦截
- setTimeout/setInterval 需要提供但可能需要限制
**模板**:`templates/vm-sandbox/`
### 模式 C:WASM 加载还原
**适用条件**:
- 加密函数通过 WebAssembly 实现
- WASM 有明确的导出函数接口
**技术栈**:
- `fs`(Node.js 内置)— 读取 .wasm 文件
- `WebAssembly`(Node.js 内置)— 加载和实例化
**注意事项**:
- 先验证 I/O,不要先反编译 WASM
- 检查 `WebAssembly.Module.imports()` 了解环境依赖
- wasm-bindgen 生成的 WASM 需要补 `Window` 类和 DOM
- `unreachable` panic 通常是环境缺失
**模板**:`templates/wasm-loader/`
### 模式 D:浏览器自动化
**适用条件**:
- TLS 指纹检测,纯请求无法通过
- 复杂环境依赖(window 蜜罐、Canvas 指纹等)
- 加密逻辑过于复杂,还原成本远大于自动化
**技术栈**:
- `playwright` / `puppeteer` — 浏览器自动化
- chrome-devtools MCP — 直接操作已有 Chrome
**注意事项**:
- 复用本机 Chrome 实例避免指纹差异
- 注入脚本截取中间数据
- 控制请求频率避免触发风控
**模板**:`templates/browser-auto/`
## 通用调试流程
```
1. 打开 Network 面板
↓
2. 触发目标操作(搜索/翻页/登录)
↓
3. 找到数据接口,分析参数
↓
4. 搜索参数名定位 JS 源码
↓
5. 设置 XHR 断点追踪调用栈
↓
6. 在关键函数设置断点
↓
7. 单步调试确认加密逻辑
↓
8. 还原算法并对比中间值
↓
9. 编写 Node.js 脚本
↓
10. 运行验证
```