--- 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]] - 代码架构分析