From 1deb8270cf1d272c9857244b89de7cfb09ab6404 Mon Sep 17 00:00:00 2001 From: X Date: Thu, 26 Feb 2026 20:09:48 -0800 Subject: [PATCH] Add web-reverse skill for API reverse engineering --- web-reverse/SKILL.md | 529 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 529 insertions(+) create mode 100644 web-reverse/SKILL.md diff --git a/web-reverse/SKILL.md b/web-reverse/SKILL.md new file mode 100644 index 0000000..bf1ea40 --- /dev/null +++ b/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]] - 代码架构分析