462 lines
19 KiB
Markdown
462 lines
19 KiB
Markdown
# 补环境前置流程
|
||
|
||
本文件用于指导写补环境代码之前的详细流程。
|
||
|
||
## 阶段 -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 补环境阶段。
|
||
```
|