530 行
14 KiB
Markdown
530 行
14 KiB
Markdown
---
|
||
name: web-reverse
|
||
description: 网页逆向工程 - 接口签名/加密/解密自动化定位与复现,支持 MCP 工具链协作
|
||
domain: security
|
||
version: 1.0.0
|
||
tags: [reverse, web, api, sign, encrypt, decrypt, mcp, chrome]
|
||
triggers:
|
||
keywords:
|
||
primary: [逆向, reverse, 签名, sign, 加密, encrypt, 解密, decrypt, 接口逆向]
|
||
secondary: [抓包, webpack, js逆向, 爬虫, sign生成, 接口分析]
|
||
context_boost: [api, fetch, xhr, crypto, webpack, obfuscate]
|
||
priority: high
|
||
---
|
||
|
||
# Web Reverse Engineering
|
||
|
||
将一次"逆一个接口"的临时工作,升级为一套**可复用、可扩展、可自动化**的逆向项目执行流程。
|
||
|
||
---
|
||
|
||
## 四要素分工
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 四要素协作模型 │
|
||
│ │
|
||
│ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ 人 (决策者) │ ←→ │ Skill (模板) │ │
|
||
│ │ │ │ │ │
|
||
│ │ - 目标选择 │ │ - 流程模板 │ │
|
||
│ │ - 风险边界 │ │ - 判断节点 │ │
|
||
│ │ - 关键决策 │ │ - 产出定义 │ │
|
||
│ │ - 结果验收 │ │ │ │
|
||
│ └─────────────┘ └─────────────┘ │
|
||
│ ↑ ↑ │
|
||
│ │ │ │
|
||
│ ↓ ↓ │
|
||
│ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ MCP (工具) │ ←→ │ LLM (大脑) │ │
|
||
│ │ │ │ │ │
|
||
│ │ - 浏览器交互 │ │ - 上下文理解 │ │
|
||
│ │ - 抓包 │ │ - 模式识别 │ │
|
||
│ │ - 文件操作 │ │ - 步骤拆解 │ │
|
||
│ │ - 沙箱运行 │ │ - 证据串联 │ │
|
||
│ └─────────────┘ └─────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
| 角色 | 职责 | 核心价值 |
|
||
|------|------|----------|
|
||
| 人 | 决策、边界、验收 | 把经验抽象成可复用流程 |
|
||
| Skill | 流程模板、判断节点 | 一次写好,长期复用 |
|
||
| MCP | 工具能力 | 把体力活交给工具 |
|
||
| LLM | 理解、分析、串联 | 不靠瞎猜,靠拆步骤+证据链 |
|
||
|
||
---
|
||
|
||
## 执行流程(6阶段)
|
||
|
||
### 阶段 A:任务定义与边界确认
|
||
|
||
#### Step 1: 明确目标接口与成功标准
|
||
|
||
```yaml
|
||
输入:
|
||
- 站点/页面/功能点描述
|
||
- 期望获取的数据或能力
|
||
|
||
关键问题:
|
||
- 要"一个接口能用"还是"形成可复用能力"?建议后者
|
||
- 成功标准是什么?
|
||
|
||
产出:
|
||
- 目标描述(1段话)
|
||
- 成功标准清单(可验收)
|
||
```
|
||
|
||
#### Step 2: 确认加密/签名位置
|
||
|
||
```yaml
|
||
判断点:
|
||
- 请求是否包含 sign 字段
|
||
- 请求体是否加密
|
||
- 响应是否加密
|
||
|
||
产出:
|
||
- 接口画像卡(见模板)
|
||
```
|
||
|
||
---
|
||
|
||
### 阶段 B:现场取证
|
||
|
||
#### Step 3: 触发目标请求
|
||
|
||
```yaml
|
||
MCP操作:
|
||
- 打开页面
|
||
- 刷新/点击/滚动
|
||
- 触发目标请求
|
||
|
||
产出:
|
||
- 完整请求记录:
|
||
- URL
|
||
- Method
|
||
- Headers
|
||
- Query
|
||
- Body
|
||
- Response 片段
|
||
```
|
||
|
||
#### Step 4: 锁定关键字段
|
||
|
||
```yaml
|
||
观察点:
|
||
- sign 是否每次变化?
|
||
- 请求体/响应体加密字段有哪些?
|
||
- 是否存在时间戳/随机数/设备指纹?
|
||
|
||
产出:
|
||
- 关键字段表:
|
||
| 字段名 | 来源 | 是否变化 | 猜测角色 | 证据 |
|
||
|--------|------|----------|----------|------|
|
||
| sign | ? | 是 | 签名 | ... |
|
||
```
|
||
|
||
---
|
||
|
||
### 阶段 C:拆解任务
|
||
|
||
#### Step 5: 拆成可验证步骤
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 逆向任务树(三主链) │
|
||
│ │
|
||
│ ┌─────────────┐ │
|
||
│ │ 目标接口 │ │
|
||
│ └──────┬──────┘ │
|
||
│ ┌───────────────┼───────────────┐ │
|
||
│ ▼ ▼ ▼ │
|
||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
||
│ │ A. Sign链 │ │ B. 请求链 │ │ C. 响应链 │ │
|
||
│ │ │ │ │ │ │ │
|
||
│ │ 如何生成 │ │ 如何加密 │ │ 如何解密 │ │
|
||
│ │ sign │ │ 请求体 │ │ 响应 │ │
|
||
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
|
||
│ │ │ │ │
|
||
│ ▼ ▼ ▼ │
|
||
│ 输入/输出/验证 输入/输出/验证 输入/输出/验证 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**原则:AI 不适合"瞎猜",适合系统化分析**
|
||
|
||
---
|
||
|
||
### 阶段 D:AI + MCP 自动化定位
|
||
|
||
#### Step 6: 定位加密/签名入口
|
||
|
||
```yaml
|
||
常见线索:
|
||
- 请求发起点(fetch/xhr 封装)
|
||
- sign 生成函数调用链
|
||
- 加密库/webpack 模块
|
||
|
||
产出:
|
||
- 入口函数/文件/模块 ID
|
||
- 调用链路(从请求发起点回溯到签名/加密)
|
||
```
|
||
|
||
#### Step 7: 抽取最小可复现上下文
|
||
|
||
```yaml
|
||
目标:
|
||
- 不是把全站代码搬下来
|
||
- 而是抽取能跑通的最小集合
|
||
|
||
产出:
|
||
- 关键模块代码片段:
|
||
- 签名模块
|
||
- 加密模块
|
||
- 依赖模块
|
||
- 依赖清单:
|
||
- 全局变量
|
||
- window/document
|
||
- crypto
|
||
- 环境检测
|
||
```
|
||
|
||
#### Step 8: Webpack 模块解包
|
||
|
||
```yaml
|
||
操作:
|
||
- AI 自动对 webpack 模块解包
|
||
- 拿到签名与加密模块代码
|
||
|
||
产出:
|
||
- 可阅读/可引用的模块源码
|
||
- 提取后的函数集合
|
||
```
|
||
|
||
---
|
||
|
||
### 阶段 E:本地沙箱复现
|
||
|
||
#### Step 9: Node 沙箱跑通关键函数
|
||
|
||
```yaml
|
||
目标:
|
||
- 明文输出 sign
|
||
- 明文生成请求体
|
||
- 解密响应得到业务 JSON
|
||
|
||
常见补齐项:
|
||
- document / window 环境模拟
|
||
- polyfill(TextEncoder、atob/btoa 等)
|
||
- 环境检测绕过
|
||
|
||
产出:
|
||
- sign() 最小实现
|
||
- encryptPayload() 最小实现
|
||
- decryptResponse() 最小实现
|
||
- 可直接运行的脚本(demo)
|
||
```
|
||
|
||
#### Step 10: 端到端验证
|
||
|
||
```yaml
|
||
做法:
|
||
- 用导出的函数直接构造一次真实请求
|
||
- 验证返回数据
|
||
|
||
产出:
|
||
- 可运行 PoC(Proof of Concept)
|
||
- 对照证据:与浏览器抓包结果一致
|
||
```
|
||
|
||
---
|
||
|
||
### 阶段 F:工程化封装
|
||
|
||
#### Step 11: 封装为可复用模块
|
||
|
||
```yaml
|
||
产出:
|
||
- 代码模块:
|
||
- sign.ts/js
|
||
- crypto.ts/js
|
||
- client.ts/js
|
||
- Skill 更新:
|
||
- 把本次新增的判断点/补齐技巧/陷阱写入模板
|
||
```
|
||
|
||
---
|
||
|
||
## 关键原则
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 核心原则 │
|
||
│ │
|
||
│ 1. 不要"一句话逆完接口" │
|
||
│ 逆向必须拆步骤,每步有证据、有验证 │
|
||
│ │
|
||
│ 2. AI 是放大器(scale),不是替代者 │
|
||
│ 人负责判断与抽象;体力活交给 AI + 工具 │
|
||
│ │
|
||
│ 3. 真正有价值的是"方法/能力体系",不是某个接口 │
|
||
│ 把经验沉淀为可复用 Skill,长期收益最大 │
|
||
│ │
|
||
│ 4. 不靠瞎猜,靠拆步骤 + 证据链 + 逐步验证 │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 里程碑与验收
|
||
|
||
| 里程碑 | 标准 | 产出 |
|
||
|--------|------|------|
|
||
| M1 | 抓包完成 | 目标请求 + sign/加密证据 |
|
||
| M2 | 定位完成 | 入口 + 调用链 + 关键模块 |
|
||
| M3 | 函数复现 | sign/encrypt/decrypt 至少跑通 1 个 |
|
||
| M4 | 端到端 PoC | 真实请求 + 解密得到业务数据 |
|
||
| M5 | 工程化封装 | 模块化 + 文档 + Skill 沉淀 |
|
||
|
||
---
|
||
|
||
## 模板
|
||
|
||
### 接口画像卡 (Interface Profile)
|
||
|
||
```yaml
|
||
# 基本信息
|
||
页面入口:
|
||
目标行为:
|
||
请求标识:
|
||
Method:
|
||
|
||
# 加密情况
|
||
是否有 sign: 是/否
|
||
- 字段名:
|
||
请求体是否加密: 是/否
|
||
- 字段名:
|
||
响应是否加密: 是/否
|
||
- 字段名:
|
||
|
||
# 请求特征
|
||
关键 Header:
|
||
关键 Cookie:
|
||
变化字段:
|
||
|
||
# 初步分析
|
||
初步猜测:
|
||
- [ ] 时间戳
|
||
- [ ] 随机数
|
||
- [ ] 设备指纹
|
||
- [ ] 会话标识
|
||
|
||
# 验收标准
|
||
成功标准:
|
||
```
|
||
|
||
### 逆向任务树
|
||
|
||
```yaml
|
||
# A. Sign 生成链
|
||
A_sign:
|
||
输入:
|
||
输出:
|
||
验证:
|
||
状态: pending
|
||
|
||
# B. 请求体加密链
|
||
B_encrypt:
|
||
输入:
|
||
输出:
|
||
验证:
|
||
状态: pending
|
||
|
||
# C. 响应解密链
|
||
C_decrypt:
|
||
输入:
|
||
输出:
|
||
验证:
|
||
状态: pending
|
||
```
|
||
|
||
### 三函数交付清单
|
||
|
||
```yaml
|
||
functions:
|
||
- name: sign(input)
|
||
type: string
|
||
status: pending
|
||
|
||
- name: encryptPayload(payload)
|
||
type: string | bytes
|
||
status: pending
|
||
|
||
- name: decryptResponse(resp)
|
||
type: object
|
||
status: pending
|
||
|
||
files:
|
||
- demo.js: 端到端请求示例
|
||
- README.md: 如何运行 + 验证点
|
||
```
|
||
|
||
---
|
||
|
||
## 执行清单
|
||
|
||
```markdown
|
||
## 阶段 A: 任务定义
|
||
- [ ] 明确目标接口与成功标准
|
||
- [ ] 确认加密/签名位置(接口画像卡)
|
||
|
||
## 阶段 B: 现场取证
|
||
- [ ] 抓包拿到目标请求
|
||
- [ ] 关键字段表完成
|
||
|
||
## 阶段 C: 拆解任务
|
||
- [ ] 拆成三链(sign / req / resp)
|
||
- [ ] 定义每链的输入/输出/验证
|
||
|
||
## 阶段 D: 定位与抽取
|
||
- [ ] AI + MCP 定位入口与调用链
|
||
- [ ] 抽取最小可复现上下文
|
||
- [ ] Webpack 模块解包(如适用)
|
||
|
||
## 阶段 E: 沙箱复现
|
||
- [ ] Node/沙箱补齐环境
|
||
- [ ] 跑通关键函数
|
||
- [ ] 端到端 PoC 验证
|
||
|
||
## 阶段 F: 工程化
|
||
- [ ] 模块化封装 + 文档
|
||
- [ ] 将新增经验写回 Skill
|
||
```
|
||
|
||
---
|
||
|
||
## MCP 工具清单
|
||
|
||
### Chrome 相关
|
||
|
||
```yaml
|
||
chrome_navigate:
|
||
用途: 打开目标页面
|
||
参数: url, wait_for
|
||
|
||
chrome_click:
|
||
用途: 点击触发请求
|
||
参数: selector
|
||
|
||
chrome_evaluate:
|
||
用途: 执行 JS 获取数据
|
||
参数: script
|
||
|
||
chrome_screenshot:
|
||
用途: 截图取证
|
||
参数: selector (optional)
|
||
```
|
||
|
||
### 网络相关
|
||
|
||
```yaml
|
||
network_capture:
|
||
用途: 抓取请求
|
||
参数: url_pattern, method
|
||
|
||
network_get_requests:
|
||
用途: 获取请求列表
|
||
参数: filter
|
||
|
||
network_get_response:
|
||
用途: 获取响应内容
|
||
参数: request_id
|
||
```
|
||
|
||
### 文件相关
|
||
|
||
```yaml
|
||
file_write:
|
||
用途: 写入代码文件
|
||
参数: path, content
|
||
|
||
file_read:
|
||
用途: 读取代码文件
|
||
参数: path
|
||
```
|
||
|
||
### 沙箱相关
|
||
|
||
```yaml
|
||
sandbox_run:
|
||
用途: 执行 Node 代码
|
||
参数: code, context
|
||
|
||
sandbox_eval:
|
||
用途: 执行表达式
|
||
参数: expression
|
||
```
|
||
|
||
---
|
||
|
||
## 常见技巧
|
||
|
||
### Webpack 模块定位
|
||
|
||
```javascript
|
||
// 查找 webpack 模块
|
||
// 方法1: 全局搜索模块 ID
|
||
webpackJsonp.forEach(chunk => {
|
||
chunk[1].forEach((module, id) => {
|
||
if (module.toString().includes('sign')) {
|
||
console.log('Found sign module:', id);
|
||
}
|
||
});
|
||
});
|
||
|
||
// 方法2: 覆写 fetch/xhr 捕获调用栈
|
||
const originalFetch = window.fetch;
|
||
window.fetch = function(...args) {
|
||
console.trace('fetch called:', args);
|
||
return originalFetch.apply(this, args);
|
||
};
|
||
```
|
||
|
||
### 环境补齐
|
||
|
||
```javascript
|
||
// Node 环境补齐
|
||
global.window = global;
|
||
global.document = {
|
||
createElement: () => ({ getContext: () => null }),
|
||
getElementById: () => null,
|
||
querySelector: () => null,
|
||
};
|
||
global.navigator = { userAgent: 'Mozilla/5.0...' };
|
||
global.location = { href: 'https://example.com' };
|
||
```
|
||
|
||
### 常见加密库识别
|
||
|
||
```yaml
|
||
CryptoJS:
|
||
特征: CryptoJS.AES, CryptoJS.MD5, CryptoJS.enc.Base64
|
||
|
||
Node-forge:
|
||
特征: forge.md, forge.cipher, forge.util
|
||
|
||
Sm-crypto:
|
||
特征: sm2.doEncrypt, sm3, sm4
|
||
|
||
自定义:
|
||
特征: 分析混淆模式,通常是 Base64 + 自定义变换
|
||
```
|
||
|
||
---
|
||
|
||
## 相关技能
|
||
|
||
- [[simple-llm]] - 简单文本分析任务
|
||
- [[programming-architecture]] - 代码架构分析
|