14 KiB
14 KiB
name, description, domain, version, tags, triggers
| name | description | domain | version | tags | triggers | |||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| web-reverse | 网页逆向工程 - 接口签名/加密/解密自动化定位与复现,支持 MCP 工具链协作 | security | 1.0.0 |
|
|
Web Reverse Engineering
将一次"逆一个接口"的临时工作,升级为一套可复用、可扩展、可自动化的逆向项目执行流程。
四要素分工
┌─────────────────────────────────────────────────────────────┐
│ 四要素协作模型 │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 人 (决策者) │ ←→ │ Skill (模板) │ │
│ │ │ │ │ │
│ │ - 目标选择 │ │ - 流程模板 │ │
│ │ - 风险边界 │ │ - 判断节点 │ │
│ │ - 关键决策 │ │ - 产出定义 │ │
│ │ - 结果验收 │ │ │ │
│ └─────────────┘ └─────────────┘ │
│ ↑ ↑ │
│ │ │ │
│ ↓ ↓ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ MCP (工具) │ ←→ │ LLM (大脑) │ │
│ │ │ │ │ │
│ │ - 浏览器交互 │ │ - 上下文理解 │ │
│ │ - 抓包 │ │ - 模式识别 │ │
│ │ - 文件操作 │ │ - 步骤拆解 │ │
│ │ - 沙箱运行 │ │ - 证据串联 │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘
| 角色 | 职责 | 核心价值 |
|---|---|---|
| 人 | 决策、边界、验收 | 把经验抽象成可复用流程 |
| Skill | 流程模板、判断节点 | 一次写好,长期复用 |
| MCP | 工具能力 | 把体力活交给工具 |
| LLM | 理解、分析、串联 | 不靠瞎猜,靠拆步骤+证据链 |
执行流程(6阶段)
阶段 A:任务定义与边界确认
Step 1: 明确目标接口与成功标准
输入:
- 站点/页面/功能点描述
- 期望获取的数据或能力
关键问题:
- 要"一个接口能用"还是"形成可复用能力"?建议后者
- 成功标准是什么?
产出:
- 目标描述(1段话)
- 成功标准清单(可验收)
Step 2: 确认加密/签名位置
判断点:
- 请求是否包含 sign 字段
- 请求体是否加密
- 响应是否加密
产出:
- 接口画像卡(见模板)
阶段 B:现场取证
Step 3: 触发目标请求
MCP操作:
- 打开页面
- 刷新/点击/滚动
- 触发目标请求
产出:
- 完整请求记录:
- URL
- Method
- Headers
- Query
- Body
- Response 片段
Step 4: 锁定关键字段
观察点:
- sign 是否每次变化?
- 请求体/响应体加密字段有哪些?
- 是否存在时间戳/随机数/设备指纹?
产出:
- 关键字段表:
| 字段名 | 来源 | 是否变化 | 猜测角色 | 证据 |
|--------|------|----------|----------|------|
| sign | ? | 是 | 签名 | ... |
阶段 C:拆解任务
Step 5: 拆成可验证步骤
┌─────────────────────────────────────────────────────────────┐
│ 逆向任务树(三主链) │
│ │
│ ┌─────────────┐ │
│ │ 目标接口 │ │
│ └──────┬──────┘ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ A. Sign链 │ │ B. 请求链 │ │ C. 响应链 │ │
│ │ │ │ │ │ │ │
│ │ 如何生成 │ │ 如何加密 │ │ 如何解密 │ │
│ │ sign │ │ 请求体 │ │ 响应 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ 输入/输出/验证 输入/输出/验证 输入/输出/验证 │
└─────────────────────────────────────────────────────────────┘
原则:AI 不适合"瞎猜",适合系统化分析
阶段 D:AI + MCP 自动化定位
Step 6: 定位加密/签名入口
常见线索:
- 请求发起点(fetch/xhr 封装)
- sign 生成函数调用链
- 加密库/webpack 模块
产出:
- 入口函数/文件/模块 ID
- 调用链路(从请求发起点回溯到签名/加密)
Step 7: 抽取最小可复现上下文
目标:
- 不是把全站代码搬下来
- 而是抽取能跑通的最小集合
产出:
- 关键模块代码片段:
- 签名模块
- 加密模块
- 依赖模块
- 依赖清单:
- 全局变量
- window/document
- crypto
- 环境检测
Step 8: Webpack 模块解包
操作:
- AI 自动对 webpack 模块解包
- 拿到签名与加密模块代码
产出:
- 可阅读/可引用的模块源码
- 提取后的函数集合
阶段 E:本地沙箱复现
Step 9: Node 沙箱跑通关键函数
目标:
- 明文输出 sign
- 明文生成请求体
- 解密响应得到业务 JSON
常见补齐项:
- document / window 环境模拟
- polyfill(TextEncoder、atob/btoa 等)
- 环境检测绕过
产出:
- sign() 最小实现
- encryptPayload() 最小实现
- decryptResponse() 最小实现
- 可直接运行的脚本(demo)
Step 10: 端到端验证
做法:
- 用导出的函数直接构造一次真实请求
- 验证返回数据
产出:
- 可运行 PoC(Proof of Concept)
- 对照证据:与浏览器抓包结果一致
阶段 F:工程化封装
Step 11: 封装为可复用模块
产出:
- 代码模块:
- 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)
# 基本信息
页面入口:
目标行为:
请求标识:
Method:
# 加密情况
是否有 sign: 是/否
- 字段名:
请求体是否加密: 是/否
- 字段名:
响应是否加密: 是/否
- 字段名:
# 请求特征
关键 Header:
关键 Cookie:
变化字段:
# 初步分析
初步猜测:
- [ ] 时间戳
- [ ] 随机数
- [ ] 设备指纹
- [ ] 会话标识
# 验收标准
成功标准:
逆向任务树
# A. Sign 生成链
A_sign:
输入:
输出:
验证:
状态: pending
# B. 请求体加密链
B_encrypt:
输入:
输出:
验证:
状态: pending
# C. 响应解密链
C_decrypt:
输入:
输出:
验证:
状态: pending
三函数交付清单
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: 如何运行 + 验证点
执行清单
## 阶段 A: 任务定义
- [ ] 明确目标接口与成功标准
- [ ] 确认加密/签名位置(接口画像卡)
## 阶段 B: 现场取证
- [ ] 抓包拿到目标请求
- [ ] 关键字段表完成
## 阶段 C: 拆解任务
- [ ] 拆成三链(sign / req / resp)
- [ ] 定义每链的输入/输出/验证
## 阶段 D: 定位与抽取
- [ ] AI + MCP 定位入口与调用链
- [ ] 抽取最小可复现上下文
- [ ] Webpack 模块解包(如适用)
## 阶段 E: 沙箱复现
- [ ] Node/沙箱补齐环境
- [ ] 跑通关键函数
- [ ] 端到端 PoC 验证
## 阶段 F: 工程化
- [ ] 模块化封装 + 文档
- [ ] 将新增经验写回 Skill
MCP 工具清单
Chrome 相关
chrome_navigate:
用途: 打开目标页面
参数: url, wait_for
chrome_click:
用途: 点击触发请求
参数: selector
chrome_evaluate:
用途: 执行 JS 获取数据
参数: script
chrome_screenshot:
用途: 截图取证
参数: selector (optional)
网络相关
network_capture:
用途: 抓取请求
参数: url_pattern, method
network_get_requests:
用途: 获取请求列表
参数: filter
network_get_response:
用途: 获取响应内容
参数: request_id
文件相关
file_write:
用途: 写入代码文件
参数: path, content
file_read:
用途: 读取代码文件
参数: path
沙箱相关
sandbox_run:
用途: 执行 Node 代码
参数: code, context
sandbox_eval:
用途: 执行表达式
参数: expression
常见技巧
Webpack 模块定位
// 查找 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);
};
环境补齐
// 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' };
常见加密库识别
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 - 代码架构分析