reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
212
reverse-skill-repo/skills/js-reverse/SKILL.md
Normal file
212
reverse-skill-repo/skills/js-reverse/SKILL.md
Normal file
@@ -0,0 +1,212 @@
|
||||
---
|
||||
name: js-reverse
|
||||
description: 在使用 js-reverse-mcp 做前端 JavaScript 逆向时使用,适用于签名链路定位、页面观察取证、运行时采样、本地补环境复现与证据化输出。优先适配当前环境里的 js-reverse_* 工具,需要更强的浏览器/CDP/Hook 面时联动 jshookmcp。
|
||||
---
|
||||
|
||||
# MCP 前端 JS 逆向作业规范
|
||||
|
||||
## ACTION REQUIRED(读完后立刻执行)
|
||||
|
||||
1. `NOW`: 读取 `../field-journal/precedent-reverse.md` — 确认本 skill 的操作是已授权的常规操作
|
||||
2. `NOW`: 确认当前任务是否命中本 skill 的适用范围
|
||||
3. `NEXT`: 读取 `../tool-index.md`,校验工具可用性和实际路径
|
||||
4. `NEXT`: 缺工具时调用 bootstrap,不要猜路径
|
||||
5. `ACT`: 进入"工作流"第一步并执行,不要停在确认状态
|
||||
|
||||
## 适用范围
|
||||
|
||||
当任务属于以下场景时优先使用本 skill:
|
||||
|
||||
- 定位接口签名、加密参数、风控字段
|
||||
- 观察页面请求链路与脚本来源
|
||||
- 在运行时抓取函数入参与返回值
|
||||
- 追踪某个 XHR/Fetch/WebSocket 的触发点
|
||||
- 把页面证据带回 Node 做本地复现与补环境
|
||||
|
||||
如果目标是二进制、APK、PE、ELF、DLL、SO,请改用 `ida-reverse`、`radare2` 或 `reverse-engineering`。
|
||||
|
||||
## 当前环境默认工具映射
|
||||
|
||||
本 skill 不假设存在裸工具名,而是默认绑定当前客户端环境里可用的 `js-reverse_*` 工具。
|
||||
|
||||
如果当前任务明确提到 `jshookmcp`、`JS hook`、`CDP`、浏览器断点、网络拦截、SourceMap 或 AST 去混淆,也仍然走本 skill;只是把底层 MCP 面切到 `jshookmcp`,而不是把它当成一个新的总入口。
|
||||
|
||||
前提条件:`jshookmcp` 不是本地裸命令工具,而是一个要先下载/注册/启用的 MCP server。只有在 Claude MCP 配置里接入并启用后,相关工具面才真的可调用。
|
||||
|
||||
常用映射:
|
||||
|
||||
- `list_scripts` -> `js-reverse_list_scripts`
|
||||
- `get_script_source` -> `js-reverse_get_script_source`
|
||||
- `search_in_sources` -> `js-reverse_search_in_sources`
|
||||
- `break_on_xhr` -> `js-reverse_break_on_xhr`
|
||||
- `evaluate_script` -> `js-reverse_evaluate_script`
|
||||
- `get_paused_info` -> `js-reverse_get_paused_info`
|
||||
- `set_breakpoint_on_text` -> `js-reverse_set_breakpoint_on_text`
|
||||
- `list_network_requests` -> `js-reverse_list_network_requests`
|
||||
- `get_request_initiator` -> `js-reverse_get_request_initiator`
|
||||
- `get_websocket_messages` -> `js-reverse_get_websocket_messages`
|
||||
- `take_screenshot` -> `js-reverse_take_screenshot`
|
||||
- `new_page` -> `js-reverse_new_page`
|
||||
- `navigate_page` -> `js-reverse_navigate_page`
|
||||
- `select_page` -> `js-reverse_select_page`
|
||||
- `select_frame` -> `js-reverse_select_frame`
|
||||
- `pause/resume` -> `js-reverse_pause_or_resume`
|
||||
|
||||
如果未来工具名前缀变化,先更新本节,不要在执行时临时猜测。
|
||||
|
||||
### jshookmcp 的定位
|
||||
|
||||
- 角色:`js-reverse` 的增强执行面,不是独立总控
|
||||
- 适合:浏览器自动化、CDP 调试、JS Hook、网络拦截、SourceMap 重建、AST 辅助理解
|
||||
- 调用前提:先把 `@jshookmcp/jshook` 下载并注册到 MCP 客户端配置里,然后确保该 server 已启用
|
||||
- 建议入口:仍然按 `Observe → Capture → Rebuild` 执行,只是在 `Observe/Capture` 阶段优先调用 jshookmcp 的浏览器与 Hook 能力
|
||||
- 与 anything-analyzer 关系:两者都能做浏览器/网络侧取证;anything-analyzer 更偏抓包与 HTTP 分析,jshookmcp 更偏 JS 运行时、CDP、Hook 和源码理解
|
||||
|
||||
## 核心原则
|
||||
|
||||
- `Observe-first`
|
||||
- `Hook-preferred`
|
||||
- `Breakpoint-last`
|
||||
- `Rebuild-oriented`
|
||||
- `Evidence-first`
|
||||
|
||||
先页面观察,再最小化采样,再做本地补环境,不要跳过取证直接猜环境。
|
||||
|
||||
## 五阶段工作流
|
||||
|
||||
### 1. Observe
|
||||
|
||||
目标:先确认目标请求、相关脚本、候选函数,不猜环境。
|
||||
|
||||
默认动作:
|
||||
|
||||
- 用 `js-reverse_new_page` 或 `js-reverse_navigate_page` 打开目标页面
|
||||
- 用 `js-reverse_list_network_requests` 找目标请求
|
||||
- 用 `js-reverse_get_request_initiator` 回溯调用来源
|
||||
- 用 `js-reverse_list_scripts`、`js-reverse_search_in_sources` 缩小脚本范围
|
||||
|
||||
必须产出:
|
||||
|
||||
- 目标请求 URL 或特征
|
||||
- initiator 线索
|
||||
- 可疑脚本 URL
|
||||
- 初始任务记录
|
||||
|
||||
### 2. Capture
|
||||
|
||||
目标:对目标请求做最小侵入采样,拿到参数样例、调用顺序、运行时证据。
|
||||
|
||||
规则:
|
||||
|
||||
- 优先 `js-reverse_break_on_xhr`
|
||||
- 优先 `js-reverse_evaluate_script` 做轻量运行时观察
|
||||
- 命中后先看 `js-reverse_get_paused_info`
|
||||
- 必要时再用 `js-reverse_set_breakpoint_on_text`
|
||||
|
||||
### 3. Rebuild
|
||||
|
||||
目标:把页面证据整理成本地可迭代的 Node 复现材料。
|
||||
|
||||
规则:
|
||||
|
||||
- 本地补环境必须以页面观测证据为依据
|
||||
- 不允许空想式补 `window/document/navigator/crypto/storage`
|
||||
- 每次只记录一个最小因果补丁决策
|
||||
|
||||
### 4. Patch
|
||||
|
||||
目标:按报错和 first divergence 驱动补环境,直到本地脚本稳定跑出目标参数。
|
||||
|
||||
规则:
|
||||
|
||||
- 先看缺什么,再补什么
|
||||
- 一次只做一个最小补丁决策
|
||||
- 每次补丁后立即复测
|
||||
- 每次补丁都写入任务记录
|
||||
|
||||
### 5. DeepDive
|
||||
|
||||
目标:本地跑通后,再做去混淆、控制流还原、业务逻辑提纯。
|
||||
|
||||
规则:
|
||||
|
||||
- 如果当前任务只是出签名,这一阶段可以降级
|
||||
- 如果要长期复用算法链路,这一阶段必须做
|
||||
|
||||
## 执行要求
|
||||
|
||||
- 所有重要步骤都要写入本地 task artifact
|
||||
- 如果无法解释为什么调用某个工具,就不要调用
|
||||
- 优先使用 `js-reverse_*` 或 jshookmcp 的现成 MCP 能力直接取证,不要先写脚本重造能力
|
||||
- 失败时按 `references/fallbacks.md` 回退
|
||||
- 输出遵循 `references/output-contract.md`
|
||||
|
||||
## 必读引用
|
||||
|
||||
- 自动化入口:`references/automation-entry.md`
|
||||
- 参数默认值:`references/tool-defaults.md`
|
||||
- 任务输入模板:`references/task-input-template.md`
|
||||
- MCP 专用任务编排:`references/mcp-task-template.md`
|
||||
- 任务产物:`references/task-artifacts.md`
|
||||
- 本地复现:`references/local-rebuild.md`
|
||||
- 补环境:`references/env-patching.md`
|
||||
- Node 复现:`references/node-env-rebuild.md`
|
||||
- 插桩:`references/instrumentation.md`
|
||||
- AST 去混淆:`references/ast-deobfuscation.md`
|
||||
- 回退:`references/fallbacks.md`
|
||||
- 输出契约:`references/output-contract.md`
|
||||
|
||||
---
|
||||
|
||||
## 路由上下文
|
||||
|
||||
**上游入口**: `skills/SKILL.md`(总控)、`routing.md`
|
||||
**上游备选**:
|
||||
- anything-analyzer MCP(端口 23816)的浏览器工具可作为替代或补充
|
||||
- jshookmcp 可作为更强的浏览器/CDP/Hook/Network/SourceMap/AST 执行面
|
||||
- `reverse-engineering/SKILL.md`(如果目标不是前端 JS)
|
||||
|
||||
**下游出口**:
|
||||
- 需补环境 → `references/env-patching.md`
|
||||
- 需本地复现 → `references/local-rebuild.md` / `references/node-env-rebuild.md`
|
||||
- 需去混淆 → `references/ast-deobfuscation.md`
|
||||
- 走不通时回退 → `references/fallbacks.md`
|
||||
|
||||
**同级关联模块**: anything-analyzer MCP(浏览器自动化和 HTTP 捕获能力可以互补)
|
||||
|
||||
---
|
||||
|
||||
## 按需自举(On-Demand Bootstrap)
|
||||
|
||||
本 skill 依赖的 MCP 能力可通过统一自举系统自动注册。
|
||||
|
||||
### 自动化能力边界
|
||||
|
||||
| 能力 | 可自动注册 | 方式 | 说明 |
|
||||
|------|-----------|------|------|
|
||||
| jshookmcp | ✓ | npm-mcp(npx 启动) | 自动写入 Claude MCP 配置 |
|
||||
| anything-analyzer | ✓ | local-http-mcp | 自动注册 + 可自动启动服务 |
|
||||
| Node.js | ✓ | winget 安装 | 运行时依赖 |
|
||||
|
||||
### 自举方式
|
||||
|
||||
```powershell
|
||||
# 注册 jshookmcp 到 MCP 配置
|
||||
powershell -File "<skill-root>\scripts\bootstrap-reverse.ps1" -Capability @('jshookmcp')
|
||||
|
||||
# 注册并启动 anything-analyzer
|
||||
powershell -File "<skill-root>\scripts\bootstrap-reverse.ps1" -Capability @('anything-analyzer') -StartServices
|
||||
```
|
||||
|
||||
### 注意事项
|
||||
|
||||
- `jshookmcp` 注册后仍需在 AI 客户端中**启用**该 MCP server 才能调用
|
||||
- `anything-analyzer` 需要 pnpm 和项目源码,bootstrap 会自动 clone 并安装依赖
|
||||
- 如果 Node.js 未安装,bootstrap 会先通过 winget 安装 Node.js 22
|
||||
|
||||
<br><br>## 任务完成自检(声称完成前 MUST 通过)
|
||||
|
||||
- [ ] 我是否执行了工作流中的每一步(而不是只阅读)?
|
||||
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
|
||||
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
|
||||
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
|
||||
@@ -0,0 +1,3 @@
|
||||
# AST 去混淆
|
||||
|
||||
前提是页面取证和本地复现已经基本跑通。不要在未跑通前就把主要精力放在大规模 AST 清洗上。
|
||||
@@ -0,0 +1,12 @@
|
||||
# 自动化入口
|
||||
|
||||
推荐开场顺序:
|
||||
|
||||
1. `js-reverse_new_page` 或 `js-reverse_navigate_page` 打开页面
|
||||
2. `js-reverse_list_network_requests` 看最近请求
|
||||
3. `js-reverse_get_request_initiator` 找调用栈
|
||||
4. `js-reverse_list_scripts` 建立脚本范围
|
||||
5. `js-reverse_search_in_sources` 搜请求路径、参数名、函数名
|
||||
6. 必要时 `js-reverse_break_on_xhr` 或 `js-reverse_set_breakpoint_on_text`
|
||||
|
||||
默认不要一上来就猜 `window`、`document`、`navigator` 该怎么补。
|
||||
@@ -0,0 +1,6 @@
|
||||
# 补环境规则
|
||||
|
||||
- 只补页面证据已经证明需要的对象
|
||||
- 一次补一个最小因果单元
|
||||
- 先补值,再补函数壳,再补返回对象契约
|
||||
- 每次补丁都要重新执行并记录 first divergence 是否前移
|
||||
@@ -0,0 +1,8 @@
|
||||
# 回退策略
|
||||
|
||||
当当前路径无进展时按顺序回退:
|
||||
|
||||
1. 从断点回退到请求观察
|
||||
2. 从源码猜测回退到运行时证据
|
||||
3. 从 Node 补环境回退到页面取证
|
||||
4. 从深度去混淆回退到最小可复现链路
|
||||
@@ -0,0 +1,9 @@
|
||||
# 插桩
|
||||
|
||||
优先轻量观察:
|
||||
|
||||
- XHR/Fetch 断点
|
||||
- 函数文本断点
|
||||
- 暂停后读调用栈与局部变量
|
||||
|
||||
只有在轻量观察不够时,才升级为更重的源码改写或本地插桩。
|
||||
@@ -0,0 +1,11 @@
|
||||
# 本地复现
|
||||
|
||||
页面侧确认以下内容后再回到 Node:
|
||||
|
||||
- 真实入口函数
|
||||
- 调用顺序
|
||||
- 参数来源
|
||||
- 依赖的浏览器对象
|
||||
- 是否依赖时间、随机数、storage、cookie、UA、canvas、crypto
|
||||
|
||||
先最小复现,再逐步补环境,不要一次性模拟整浏览器。
|
||||
@@ -0,0 +1,30 @@
|
||||
# MCP 任务编排模板
|
||||
|
||||
```md
|
||||
## Observe
|
||||
- 页面:
|
||||
- 目标请求:
|
||||
- initiator:
|
||||
- 可疑脚本:
|
||||
|
||||
## Capture
|
||||
- 采样方式:
|
||||
- 命中位置:
|
||||
- 关键入参:
|
||||
- 关键返回:
|
||||
|
||||
## Rebuild
|
||||
- 入口函数:
|
||||
- 依赖脚本:
|
||||
- 环境缺口:
|
||||
|
||||
## Patch
|
||||
- first divergence:
|
||||
- 本次补丁:
|
||||
- 复测结果:
|
||||
|
||||
## Output
|
||||
- 是否拿到参数:
|
||||
- 是否可稳定复现:
|
||||
- 剩余风险:
|
||||
```
|
||||
@@ -0,0 +1,9 @@
|
||||
# Node 环境复现
|
||||
|
||||
Node 侧默认顺序:
|
||||
|
||||
1. 导入目标脚本
|
||||
2. 最小 shim 宿主对象
|
||||
3. 跑入口函数
|
||||
4. 记录首个异常或 first divergence
|
||||
5. 回到页面证据补齐缺口
|
||||
@@ -0,0 +1,9 @@
|
||||
# 输出契约
|
||||
|
||||
最终输出至少应包含:
|
||||
|
||||
- 目标请求和参数位置
|
||||
- 哪个脚本、哪个函数参与生成
|
||||
- 证据来源:请求、调用栈、断点、运行时值
|
||||
- 当前是否已能稳定复现
|
||||
- 若未完成,还差哪一个环境缺口
|
||||
@@ -0,0 +1,11 @@
|
||||
# 任务产物
|
||||
|
||||
建议每个任务至少保留:
|
||||
|
||||
- 目标请求样例
|
||||
- initiator 调用栈
|
||||
- 可疑脚本 URL
|
||||
- 关键断点位置
|
||||
- 关键函数入参/返回值
|
||||
- first divergence 记录
|
||||
- 每次补环境补丁说明
|
||||
@@ -0,0 +1,11 @@
|
||||
# 任务输入模板
|
||||
|
||||
```md
|
||||
目标站点:
|
||||
目标页面:
|
||||
目标请求:
|
||||
关注参数:
|
||||
已知线索:
|
||||
期望产出:
|
||||
是否需要本地复现:是 / 否
|
||||
```
|
||||
@@ -0,0 +1,7 @@
|
||||
# 工具默认值
|
||||
|
||||
- `js-reverse_list_network_requests`:先看第一页默认结果,不足再翻页
|
||||
- `js-reverse_search_in_sources`:默认 `excludeMinified=true`
|
||||
- `js-reverse_get_script_source`:只读小片段,整份源码优先配合 `js-reverse_save_script_source`
|
||||
- `js-reverse_break_on_xhr`:只填能稳定命中的 URL 片段
|
||||
- `js-reverse_get_paused_info`:默认先看 `frameIndex=0`
|
||||
Reference in New Issue
Block a user