Add web-reverse skill for API reverse engineering
这个提交包含在:
529
web-reverse/SKILL.md
普通文件
529
web-reverse/SKILL.md
普通文件
@@ -0,0 +1,529 @@
|
|||||||
|
---
|
||||||
|
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]] - 代码架构分析
|
||||||
在新工单中引用
屏蔽一个用户