From 59e52c549006e6f5cf326fdd7c20b638976e8e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=A4=9C?= Date: Sun, 19 Apr 2026 16:13:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=91=BD=E4=B8=AD=E6=A1=88=E4=BE=8B?= =?UTF-8?q?=E4=B8=8D=E8=B7=B3=E8=BF=87Phase=E2=80=94=E2=80=94Phase=200.5?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=8A=A0=E9=80=9F=E6=8C=87=E5=BC=95=E8=80=8C?= =?UTF-8?q?=E9=9D=9E=E6=9B=BF=E4=BB=A3=E6=B5=81=E7=A8=8B=EF=BC=8Ccase?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8B=86=E5=88=86=E6=96=B9=E6=A1=88=E6=96=B9?= =?UTF-8?q?=E5=90=91/=E5=8A=A0=E9=80=9F=E6=8C=87=E5=BC=95/=E8=B8=A9?= =?UTF-8?q?=E5=9D=91=E8=AE=B0=E5=BD=95=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=BB=8F?= =?UTF-8?q?=E9=AA=8C=E6=B3=95=E5=88=99#11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SKILL.md | 14 ++++++++--- cases/jsvmp-xhr-interceptor-env-emulation.md | 25 +++++++++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/SKILL.md b/SKILL.md index 9e87b9e..c6add4f 100644 --- a/SKILL.md +++ b/SKILL.md @@ -221,9 +221,16 @@ AI 输出格式(必须以此结构复述并填空): #### 0.5.1 命中某个 case 的行为 ``` -readFile("cases/<命中的 case>.md") # 详读已验证定位路径 -按该 case 的 Phase 1-5 执行(不要自创流程) -如果目标站点有本 case 没覆盖的变体 → 分析结束时追加到该 case 的"变体章节" +readFile("cases/<命中的 case>.md") # 读取方案方向 + 踩坑记录 + +案例提供每个 Phase 的加速指引,不替代 Phase: + Phase 1: 仍然执行侦察,用 scripts(action='save') 保存 SDK 脚本到本地 config/ + Phase 2: 仍然执行源码分析 + Phase 3: 仍然执行动态验证(确认需要补哪些环境项后再写补丁) + Phase 4: 参考案例踩坑记录编码,环境补丁逐项添加逐项验证 + Phase 5: 验证 + +⚠️ 命中案例 = 知道终点在哪,不等于跳过路上的步骤 ``` #### 0.5.2 未命中任何 case 的行为 @@ -302,6 +309,7 @@ search_code(keyword="acw_sc__v2") # Aliyun WAF 8. **case 中的"可验证事实清单"是经验资产**:在 case 文件列出最小可验证事实,下次同站升级时逐条手动核对找出"哪些变了" 9. **verify_signer_offline 是协议代码的 unit test**:用 N 个真实样本离线验证,字符级定位首偏差点;每次改完代码先跑一次,别请真服务端猜 10. **想放弃时先回查 cases/ 和 common-pitfalls.md**:绝大多数"想放弃"的场景,是踩了已知反模式或漏读了相似 case +11. **命中案例不等于跳过分析流程**:案例提供方案方向和踩坑经验,Phase 1-5 仍然正常走,SDK 脚本仍要保存到本地,环境补丁仍要逐项验证后再添加 --- diff --git a/cases/jsvmp-xhr-interceptor-env-emulation.md b/cases/jsvmp-xhr-interceptor-env-emulation.md index 106af67..2178d9b 100644 --- a/cases/jsvmp-xhr-interceptor-env-emulation.md +++ b/cases/jsvmp-xhr-interceptor-env-emulation.md @@ -72,7 +72,30 @@ --- -## 已验证定位路径(Phase 0.5 命中后直接执行) +## 方案方向 + +jsdom 环境伪装,喂入-截出策略截获 a_bogus。环境值必须与 UA 自洽。 + +## 各 Phase 加速指引 + +- **Phase 1**: `search_code(keyword="_SdkGlueInit")` 定位配置;`scripts(action='save')` 保存三件套(webmssdk.es5.js / bdms.js / sdk-glue.js)到 `config/` +- **Phase 2**: 加载顺序 webmssdk → bdms → sdk-glue → `_SdkGlueInit`;签名在 XHR send 阶段追加 +- **Phase 3**: 用 Camoufox `compare_env` + `evaluate_js` 分批采集真实环境,与 jsdom 逐项 diff,**确认需要补的环境项范围后再写补丁** +- **Phase 4**: jsdom 配置需 `resources:'usable'`;XHR Hook 必须在 SDK 加载前安装;`scanPrototypeChain` 的 `Object.prototype` 边界不能突破 +- **Phase 5**: 连续 ≥5 次请求验证,200 + 空 body = 环境指纹不对不是算法错 + +## 踩坑记录 + +- **不要对 Object.prototype / Array.prototype 做 markNative**,会破坏 JSVMP 自身运行 +- **SDK 脚本必须保存到本地**(`scripts(action='save')`),不要每次从 CDN 下载 +- 签名 192 字符但服务端返回空 body = 环境指纹不对,不是算法错 +- **环境补丁逐项添加逐项验证**,不要批量添加后排查 +- Firefox 和 Chrome 环境都可以工作,关键是所有值与 UA 自洽 +- XHR Hook 顺序:我方 Hook → SDK 加载(保存 Hook 后的引用)→ JSVMP 调用时经过我方 Hook + +## 原始定位路径(参考,不要跳过 Phase 直接照做) + +> 以下是首次分析时的实际步骤记录,供理解方案演进过程。实战时仍需走 Phase 1-5。 ### Phase 1:网络捕获定位接口