Files

462 lines
19 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 补环境前置流程
本文件用于指导写补环境代码之前的详细流程。
## 阶段 -1:新 case 第一回复硬门禁
每次用户给出新网站、新接口、新 cURL / HAR、旧补环境文件,或要求“帮我分析 / 补环境 / 成功请求到数据”时,第一回复先做门禁检查,不直接进入取证或补环境。
即使用户提供了很长的 cURL、Cookie、403/200 现象、JS 文件线索、旧代码文件名,仍然不能把它视为已经通过主流程。cURL 只是请求样本,不等于取证模式已确认,也不等于最终请求 TLS 客户端已确认。
第一回复必须输出:
```markdown
## 信息完整性检查
### 已识别信息
- 目标网站 / 页面:
- 目标 API:
- 请求方法:
- 已提供请求样本:
- 已知响应现象:
- 已知旧代码 / JS 文件:
- 用户已明确的目标参数:
### 缺失 / 待确认信息
- 取证模式:未确认 / ruyiPage + RuyiTrace / 仅 ruyiPage / Camoufox + camoufox-reverse-mcp / 仅 Camoufox / CloakBrowser / 用户手动取证 / AI 自行决定
- 最终请求 TLS 指纹兼容客户端:未确认 / Node.js CycleTLS / Node.js impers / Node.js curl-cffi / Python curl_cffi / Python cffi_curl / Python cyCronet / 不发真实请求
- 是否有授权测试权限:
- 是否需要登录:
- 本次确认要分析的加密 / 风控参数:
- 是否允许创建 case 目录和阶段报告:
### 初步发现的可疑参数候选
| 参数名 | 位置 | 疑似原因 | 是否等待用户确认 |
|---|---|---|---|
| | Query / Header / Body / Cookie | | 是 |
### 暂停说明
在你确认取证模式、最终请求客户端和本次分析参数前,我不会启动浏览器取证、下载 JS、运行 Hook、修改或运行旧补环境代码、复用 cURL 中的动态参数,也不会发送真实请求。
```
如果缺少取证模式或最终请求 TLS 客户端,第一回复必须停在本阶段和阶段 0.5 / 0.6;只能继续做离线整理、列缺失项和生成 `case/阶段报告/01-需求信息确认.md`,不能进入请求验证、JS 收集、入口定位、Node trace 或补环境代码。
## 阶段 0:范围确认
确认以下事项:
- 目标是网页端 / 浏览器端 JavaScript。
- 用户要求的是 Node.js 补环境。
- 排除 App、移动端、小程序、Windows、Native 等方向。
- 当前目标不是纯算重写。
- 浏览器自动化只用于前置取证,不用于批量采集。
- 用户有授权测试范围。
任一条件不满足时,停止并说明 Skill 边界。
## 阶段 0.5:取证模式确认
在信息校验、请求样本验证、JS 文件收集、Hook、断点、截图、RuyiTrace 日志采集等任何取证动作之前,必须先让用户选择取证模式:
1. ruyiPage + RuyiTrace(推荐)。
2. 仅 ruyiPage。
3. Camoufox + camoufox-reverse-mcp。
4. 仅 Camoufox。
5. CloakBrowser。
6. 用户手动取证。
7. AI 自行决定。
确认后把选择记录为本 case 的取证模式,并在后续所有浏览器取证动作中沿用。不要等确认有自动化检测后再启用 ruyiPage / RuyiTrace。不要在用户已选择 ruyiPage / CloakBrowser / 手动取证后,自行改用普通 Playwright、Puppeteer 或系统 Firefox。
如果所选工具不可用或后续需要切换工具,暂停并重新让用户确认。
如果用户选择 ruyiPage + RuyiTrace,但检测到 RuyiTrace 未安装或目录不完整,不能自动降级为仅 ruyiPage。必须先提示用户选择“安装 / 提供 RuyiTrace 路径”或“明确降级为仅 ruyiPage”;用户选择安装时,等待用户完成安装并重新检测通过后,才继续需要 NDJSON 的流程。
如果用户没有明确选择取证模式,不能因为用户提供了 cURL、Cookie、目标站 URL、旧代码或“请成功请求到数据”的要求而默认启动任何浏览器工具。只能给出取证模式选项并等待确认;如果用户选择“AI 自行决定”,也必须先检测工具并回报拟用方案,等待用户确认后再启动。
## 阶段 0.6:最终请求 TLS 指纹兼容客户端确认
如果本 case 最终需要发送真实请求或交付 `final.js` / `final.py`,必须在前置阶段就选择最终请求客户端,不要等普通 `fetch` / `requests` 失败后再临时切换。
可选项:
1. Node.js CycleTLS。
2. Node.js impers。
3. Python curl_cffi。
4. Python cffi_curl。
5. Python cyCronet。
6. 不发真实请求,只输出本地 sign / 参数。
确认后立即运行:
```bash
node scripts/check_tls_clients.js --markdown
node scripts/check_tls_clients.js --python python --markdown
```
如果用户选择的库未安装,先让用户确认安装、改选其他已安装客户端,或选择“不发真实请求”。TLS 指纹兼容仅用于授权范围内少量最终验证请求,不用于批量访问、绕过登录、验证码、MFA、付费墙或访问控制。
## 阶段 0.7:阶段报告初始化
从用户提供第一轮需求信息开始,默认创建 `case/阶段报告/01-需求信息确认.md`,记录目标 URL、API、取证选项、加密参数、加密文件 / JS 文件、已提供样本、缺失项和下一步待确认问题。即使信息不完整,也要生成该阶段报告。
推荐命令:
```bash
node scripts/write_stage_report.js --case-dir case --stage 需求信息确认 --data case/notes/需求信息.json --markdown
node scripts/check_stage_reports.js --case-dir case --require-stage 需求信息确认 --markdown
```
后续阶段结束时继续写入 `02-取证方案确认.md`、`03-请求样本与可疑参数确认.md`、`04-JS文件与入口定位.md`、`05-补环境前置分析.md`、`06-补环境实现记录.md`、`07-验证与清理记录.md`。所有 Markdown 文件名必须包含中文。
## 阶段 1:信息完整性检查
必填信息:
1. 目标网站或目标页面 URL。
2. 目标接口 API URL。
3. 请求方法。
4. 目标加密参数名。
5. 参数位置:Query / Header / Body / Cookie。
6. 至少一份成功请求样本,优先 Copy as cURL。
7. 取证模式:ruyiPage + RuyiTrace / 仅 ruyiPage / Camoufox + camoufox-reverse-mcp / 仅 Camoufox / CloakBrowser / 用户手动取证 / AI 自行决定。
8. 最终请求 TLS 指纹兼容客户端:Node.js CycleTLS / Node.js impers / Node.js curl-cffi / Python curl_cffi / Python cffi_curl / Python cyCronet / 不发真实请求。
如果信息不完整,列出缺失项,并使用 `intake-template.md` 让用户补充。
如果信息完整,先整理任务摘要并请求用户确认,不要直接进入分析。
强制阻断项:
- 未确认取证模式:不得打开网页、抓包、Hook、截图、下载 JS 或采集 RuyiTrace。
- 未确认最终请求 TLS 客户端且任务要求成功请求:不得发送真实请求,也不得先用普通 HTTP 客户端试错。
- 未确认本次分析参数:不得只盯用户指定参数进入补环境;必须先列出 Query / Header / Body / Cookie 中所有可疑候选并让用户确认。
- 未确认授权 / 登录状态:不得尝试绕过登录、验证码、MFA、风控或访问控制。
## 阶段 2:请求样本检查
检查内容:
| 检查项 | 目的 |
|---|---|
| URL 是否完整 | 是否包含协议、域名、路径 |
| 请求方法是否明确 | GET / POST / PUT 等 |
| 请求头是否完整 | UA、Content-Type、Cookie、Referer、Origin 等 |
| Body 是否完整 | POST / PUT 请求是否包含请求体 |
| 目标参数是否存在 | 是否能在用户声明的位置找到参数 |
| 响应样本是否成功 | 判断样本是否是有效请求 |
| 取证模式是否一致 | 后续抓包、JS 收集、Hook、截图和日志采集是否都沿用用户选择的工具 |
| Cookie/token 是否过期 | 先判断是登录态授权 Cookie,还是非登录生成型 Cookie |
| 最终请求客户端是否已选 | 从一开始确认 CycleTLS / impers / curl_cffi / cffi_curl / cyCronet / 不发真实请求 |
推荐输出:
```markdown
## 请求样本检查结果
- 请求是否完整:
- 目标参数是否存在:
- 参数位置是否一致:
- 是否缺少关键 Header:
- 是否缺少 Cookie / token:
- Cookie/token 是否过期:
- Cookie 分类:登录态 / 非登录生成型 / 未确认
- 最终请求 TLS 指纹兼容客户端:
- 是否可以进入下一步:
```
## 阶段 2.2:可疑加密参数发现与用户确认
在正式补环境前,必须先从 cURL / HAR / 请求样本中列出所有可疑加密参数,并让用户确认本次要分析哪些。不要只复用用户给出的 `--param`,也不要只盯一个参数。
执行建议:
```bash
node scripts/parse_curl.js --input request.curl --json
node scripts/parse_curl.js --input request.curl --markdown
```
必须覆盖的位置:Query、Header、Body、Cookie。重点关注 sign、token、a_bogus、h5st、x-s、x-t、mtgsig、w_rid、_signature、nonce、hash、设备 Cookie、风控 Cookie、JS 生成 Cookie 等。
输出给用户确认:
```markdown
## 发现的可疑加密参数
| 参数名 | 位置 | 样本值摘要 | 疑似原因 | 是否建议分析 |
|---|---|---|---|---|
| | Query/Header/Body/Cookie | 脱敏 | | 是/否 |
请确认本次要分析哪些参数。确认前我不会进入正式补环境。
```
同时写入 `case/阶段报告/03-请求样本与可疑参数确认.md`,记录候选参数、用户确认状态和未确认项。
确认规则:
- 如果用户已经指定目标参数,也要提示其他候选参数,询问是否需要一并分析。
- 用户未确认目标参数列表前,不进入 `env.js` 编写、Node trace 或补环境阶段。
- cURL 中已有参数值只能作为浏览器真实样本 / fixture expected,不能作为最终产物中的固定值。
- 如果某个候选是登录态 token / Authorization,先回到登录与授权边界,不做绕过。
## 阶段 2.5:Cookie 过期与来源分类
当请求失败疑似由 Cookie/token 过期、Cookie 缺失、Cookie 写入失败或参数位置为 Cookie 引起时,先分类,不要默认要求用户重新给一份新 Cookie。
| 类型 | 处理方式 |
|---|---|
| 登录态 / 授权 Cookie | 不绕过登录;让用户手动登录或提供授权样本 |
| 服务端 `Set-Cookie` 首访 Cookie | 分析是否可通过前置 Node.js / Python 请求刷新,并写入最终请求客户端 |
| `document.cookie` 写入 Cookie | Hook setter 或用 RuyiTrace 查 `document.cookie` / `Document.cookie` 调用栈,定位 writer |
| JS 计算生成 Cookie | 按 `source → entry → builder → writer` 定位生成函数,并纳入补环境 |
| Storage / 指纹 / challenge 派生 Cookie | 分析 localStorage / sessionStorage / 指纹对象 / server seed / timestamp 等依赖 |
| 一次性服务端 challenge 或账号绑定 Cookie | 说明不可或不应复现,要求用户授权交互或离线样本 |
输出模板:
```markdown
## Cookie 过期处理判断
- Cookie 名称:
- 是否需要登录:
- 是否账号 / 授权相关:
- 来源判断:Set-Cookie / document.cookie / JS 计算 / Storage 派生 / challenge / 未确认
- 是否可生成或刷新:
- 生成链路 source / entry / builder / writer:
- 是否纳入补环境:
- 是否需要用户手动登录:是 / 否
```
结论规则:
- 对不需要登录的网站,优先分析非登录 Cookie 如何生成 / 刷新。
- 只有 Cookie 明确属于登录态 / 授权态、服务端一次性下发且无法 / 不应复现、或用户确认只做一次离线样本复现时,才要求用户重新提供有效 Cookie。
## 阶段 3:加密参数画像
仅对用户确认要分析的参数做画像。对未确认的候选参数,只保留在 notes 中作为备选证据,不要擅自进入补环境。
在补环境前先描述参数特征:
| 维度 | 要回答的问题 |
|---|---|
| 参数名 | sign / x-s / a_bogus / h5st / token 等 |
| 参数位置 | Query / Header / Body / Cookie |
| 是否动态 | 每次请求是否变化 |
| 是否依赖请求体 | Body 改变后参数是否变化 |
| 是否依赖 URL | path / query 是否参与签名 |
| 是否依赖 Cookie | 是否受登录态影响 |
| 是否依赖存储 | 是否读取 localStorage / sessionStorage |
| 是否依赖浏览器指纹 | navigator / canvas / WebGL / screen 等 |
| 是否依赖时间或随机数 | timestamp / nonce / random / server seed 等 |
| 是否已有 RuyiTrace 日志 | 是否有 NDJSON 环境访问日志可用于补环境优先级 |
推荐输出:
```markdown
## 加密参数画像
- 参数名:
- 位置:
- 是否动态:
- 已知依赖:
- 疑似依赖:
- 需要补充的样本:
```
## 阶段 4:加密入口定位
目标是找到生成加密参数的函数或模块。
定位必须按 `source → entry → builder → writer` 四层链路记录:
| 层级 | 必须回答 |
|---|---|
| source | 签名输入来自 URL、Body、Cookie、Storage、时间随机数、指纹中的哪些字段 |
| entry | 哪个函数或模块生成签名或中间签名 |
| builder | 哪个请求构造函数把签名拼入请求对象 |
| writer | 最终由 fetch/XHR/Header/Query/Body/Cookie 哪个位置写入网络请求 |
如果只找到 `entry` 但无法确认 `writer`,只能标记为“疑似入口”,不能进入正式补环境。阶段结束时写入 `case/阶段报告/04-JS文件与入口定位.md`。
优先方法:
1. 查看 Network Initiator。
2. 使用 XHR / fetch 断点。
3. 搜索参数名。
4. Hook 关键 API 记录调用栈。
5. 分析 Stack Trace。
6. 如果有 sourcemap,优先结合 sourcemap。
7. 定位 webpack / vite / runtime 模块和动态 chunk。
Hook 模板见 `hook-templates.md`。复杂链路见 `crypto-entry-location.md`。
常用搜索词:
```text
sign
token
x-s
a_bogus
h5st
setRequestHeader
fetch(
XMLHttpRequest
JSON.stringify
localStorage.getItem
document.cookie
crypto
```
推荐输出:
```markdown
## 加密入口定位
- 入口函数:
- 所在 JS 文件:
- 行列号:
- 调用链:
- 输入参数:
- 输出参数:
- 是否依赖浏览器环境:
- 是否需要继续补充 DevTools 信息:
```
## 阶段 5:JS 文件收集
只收集加密链路需要的文件:
- 主 bundle。
- 动态 chunk。
- runtime chunk。
- sourcemap。
- WASM 文件仅限网页端 JS 依赖,不扩展到 Native 逆向。
- 加密入口函数所在文件。
建议 case 目录:
```text
case/
├── js/
│ ├── original/
│ ├── pretty/
│ └── extracted/
├── requests/
├── fixtures/
├── notes/
└── tmp/
```
推荐输出:
```markdown
## JS 文件收集结果
- 已获取 JS 文件:
- 未获取 JS 文件:
- 是否存在 sourcemap:
- 是否存在动态 chunk:
- 是否存在 runtime:
- 是否存在 WASM:
- 是否可以进入补环境准备:
```
## 阶段 5.2:动态 HTML / JS 资源保鲜检查
下载或保存 HTML、JS bundle、动态 chunk、challenge JS、403/风控页面和内联脚本后,先判断这些资源是长期静态文件,还是会随时间、会话、Cookie、seed、nonce、地域或 TLS 指纹变化的动态资源。
强制规则:
- 本地动态 HTML / JS 只能作为分析快照,不得直接进入最终产物主路径。
- 对每个资源记录 URL、请求时间、状态码、响应头、Set-Cookie、body sha256、Cache-Control、Expires、ETag、Last-Modified、依赖 Cookie / seed / nonce、动态性判定、最终使用方式。
- 将清单写入 `case/notes/resource-manifest.json`。
- 命中 `no-store/no-cache/private/max-age=0`、短 TTL、随机 query、同 URL 多次 hash 变化、HTML 内 seed / nonce / challenge 变化、403 challenge JS、会话绑定 Cookie 时,最终入口必须实现运行时刷新。
- 最终入口应先重新请求当前 HTML / JS / challenge / seed,再运行补环境生成参数和发送请求。
推荐命令:
```bash
node scripts/check_dynamic_resources.js --case-dir case --markdown
node scripts/check_dynamic_resources.js --case-dir case --require-runtime-refresh --markdown
```
推荐输出:
```markdown
## 动态资源保鲜检查
- 动态 HTML / JS:有 / 无
- 分析快照目录:
- 资源 manifest:
- 影响最终生成参数的动态资源:
- 最终运行时刷新模块:
- 是否允许进入补环境准备:
```
如果动态资源影响目标参数生成,但尚未设计运行时刷新链路,不得进入最终交付;如果因此请求失败,先刷新资源和 seed,再判断是否继续补 WebAPI。
## 阶段 5.5:RuyiTrace NDJSON 优先分析
如果取证模式为 ruyiPage + RuyiTrace,本阶段必须在进入 Node.js 补环境前执行。不要等 Node.js 报错后才临时查看日志。
1. 确认是否已有 RuyiTrace NDJSON。
- 如果 RuyiTrace 未安装或目录不完整,先回到“阶段 0.5:取证模式确认”,要求用户安装 / 提供路径或明确降级;不得直接跳过本阶段进入 Node trace。
2. 尚未导入时先执行:
```bash
node scripts/import_ruyitrace_log.js --input <trace.ndjson> --case-dir case --markdown
```
3. 阅读 `notes/ruyitrace-summary.md`,按目标参数生成、目标 API 请求发起、writer 写入附近的 `api` 和 `stack.file / line / col` 汇总环境依赖。
4. 将结论写入:
- `notes/ruyitrace-summary.md`
- `notes/missing-env-priority.md`
- `notes/entry-chain.md`
5. 只有日志缺失、未覆盖当前逻辑或结论不足时,才把 Node trace / Proxy trace 作为主要发现来源。
遇到后续环境问题时,也先回到本阶段复查 NDJSON,再决定是否补充 Node trace。
推荐输出:
```markdown
## RuyiTrace NDJSON 优先分析
- 日志状态:已导入 / 未提供 / 未覆盖当前逻辑
- 摘要文件:
- 目标参数生成附近 API:
- 关键调用栈:
- 优先补齐环境模块:
- 需要 Node trace 补充的原因:
```
## 阶段 6:前置总结
在真正写 `env.js` 前,再次让用户确认:
```markdown
补环境前置任务已完成,请确认:
- 目标网站 URL:
- 目标 API:
- 发现的可疑加密参数:
- 用户确认要分析的参数:
- 参数位置:
- 加密入口:
- source / entry / builder / writer:
- 相关 JS 文件:
- 样本数量:
- 当前判断的依赖:
- 取证模式:
- 最终请求 TLS 指纹兼容客户端:
- TLS 客户端可用性:已安装 / 未安装需用户确认 / 不发真实请求
- 是否需要切换取证工具:否 / 是,原因:
- RuyiTrace 日志:已导入并优先分析 / 未提供 / 未覆盖当前逻辑 / 不需要
- RuyiTrace 优先证据:api / stack.file / line / col 摘要
- Node 泄露阻断检查:
- 六项纯计算预检:
- 最终交付要求:生成规范项目目录;只有 `result/final.js` 或 `result/final.py` 一个执行入口;入口运行后通过补环境后的目标 JS 入口 / signer 生成加密参数,并使用已确认的 TLS 指纹兼容客户端发送少量授权模拟请求,或按用户选择只输出本地参数;不交付自动化取证代码;不得硬编码或复用 cURL / fixture 中的加密参数样本值。
确认后将进入 Node.js 补环境阶段。
```