v3.3.0: 核心层回归扩容 + 案例层强化
SKILL.md: - Phase 1-5 详细动作从 references/ 拉回核心层 - 10 个场景速查回迁 - 经验法则扩到 24 条(含环境伪装编码纪律) - 工具名全部对齐 MCP v1.0.0 API - 版本记录移至 README.md cases/jsvmp-xhr-interceptor-env-emulation.md: - 追加禁动清单(5 个禁动对象) - 追加 UA 分支矩阵(Firefox/Chrome 必补/禁补) - 追加 6 条踩坑记录 + env-patch 最小化原则 cases/_template.md: - 追加禁动清单 + UA 分支矩阵可选段骨架 README.md: - MCP 工具表对齐 v1.0.0 API - 项目结构补充 cases/ 和完整 references/ - 追加版本记录 - 删除 skill不保存什么 段 references/: - phase-details.md / mcp-cookbook.md / experience-rules-full.md 顶部加以SKILL.md为准提示
This commit is contained in:
@@ -62,17 +62,30 @@ hello_js_reverse_skill/
|
||||
├── SKILL.md # 技能定义(AI Agent 读取的核心文件)
|
||||
├── README.md # 项目文档
|
||||
│
|
||||
├── references/ # 参考文档(知识库)
|
||||
├── references/ # 参考文档(深度背景,按需读取)
|
||||
│ ├── workflow-overview.md # 工作流总览与解法模式决策树
|
||||
│ ├── crypto-patterns.md # 加密算法识别与 Node.js/Python 双语言还原代码
|
||||
│ ├── obfuscation-guide.md # JS 混淆类型识别与还原策略
|
||||
│ ├── hook-techniques.md # Hook 技术大全(13种 Hook 模板)
|
||||
│ ├── anti-debug.md # 反调试对抗手册(7种绕过方案)
|
||||
│ ├── environment-patch.md # 环境补全指南(VM沙箱/WASM/jQuery/XHR)
|
||||
│ ├── protocol-analysis.md # 协议层分析(TLS/HTTP2/UA/频率限制)
|
||||
│ ├── mcp-cookbook.md # MCP 工具使用手册(5大场景操作步骤)
|
||||
│ ├── jsvmp-analysis.md # JSVMP 虚拟机保护专项分析指南(三板斧方法论)
|
||||
│ └── troubleshooting.md # 错误排查指南(请求失败/签名不一致/环境问题)
|
||||
│ ├── phase-details.md # Phase 0-5 详细操作(v3.3.0 起以 SKILL.md 为准)
|
||||
│ ├── mcp-cookbook.md # MCP 工具场景手册(v3.3.0 起以 SKILL.md 为准)
|
||||
│ ├── mcp-tool-reference.md # MCP 工具名迁移映射
|
||||
│ ├── experience-rules-full.md # 经验法则完整版(v3.3.0 起以 SKILL.md 为准)
|
||||
│ ├── path-a-four-tools.md # 路径 A 四板斧详细步骤
|
||||
│ ├── path-b-env-emulation.md # 路径 B 环境伪装六步法
|
||||
│ ├── jsvmp-analysis.md # JSVMP 字节码分析
|
||||
│ ├── jsvmp-source-instrumentation.md # 源码级插桩专项
|
||||
│ ├── jsdom-env-patches.md # jsdom 环境补丁模板
|
||||
│ ├── common-pitfalls.md # 反模式清单
|
||||
│ ├── crypto-patterns.md # 加密算法识别与还原代码
|
||||
│ ├── obfuscation-guide.md # JS 混淆类型识别与还原策略
|
||||
│ ├── hook-techniques.md # Hook 技术大全
|
||||
│ ├── anti-debug.md # 反调试对抗手册
|
||||
│ ├── environment-patch.md # 环境补全指南
|
||||
│ ├── protocol-analysis.md # 协议层分析
|
||||
│ └── troubleshooting.md # 错误排查指南
|
||||
│
|
||||
├── cases/ # 经验案例库(唯一经验库)
|
||||
│ ├── README.md # 高频站点速查表
|
||||
│ ├── _template.md # 新案例模板
|
||||
│ └── *.md # 各站点/场景案例
|
||||
│
|
||||
├── scripts/ # 工具脚本
|
||||
│ ├── check-deps.sh # 环境依赖检查(Node.js + Python)
|
||||
@@ -172,8 +185,8 @@ python main.py
|
||||
|
||||
## MCP 工具集成
|
||||
|
||||
本 Skill 只围绕 [`camoufox-reverse` MCP](https://github.com/WhiteNightShadow/camoufox-reverse-mcp) 服务器组织能力(Camoufox 反检测浏览器,**65 个工具,v0.5.0 签名型反爬兼容改造**):
|
||||
- 源码级插桩 `instrument_jsvmp_source(mode="ast")` — MCP 侧 esprima 实现,挑战页可用
|
||||
本 Skill 围绕 [`camoufox-reverse` MCP](https://github.com/WhiteNightShadow/camoufox-reverse-mcp) 服务器组织能力(Camoufox 反检测浏览器,**32 个核心工具,v1.0.0 统一 API**):
|
||||
- 源码级插桩 `instrumentation(action='install', mode="ast")` — MCP 侧 esprima 实现,挑战页可用
|
||||
- 签名安全观察 `hook_jsvmp_interpreter(mode="transparent")` — 仅 prototype getter 替换
|
||||
- Cookie 归因 `analyze_cookie_sources` — 区分 Set-Cookie 与 document.cookie
|
||||
- 响应链追踪 `navigate` 返回 `redirect_chain`/`final_status`,秒识反爬类型
|
||||
@@ -181,33 +194,24 @@ python main.py
|
||||
| 核心工具 | 用途 |
|
||||
|---------|------|
|
||||
| `launch_browser` / `navigate` | 启动反检测浏览器并导航到目标页面 |
|
||||
| `search_code` / `search_code_in_script` | 在所有 JS 中搜索关键词 / 在指定脚本中精确搜索 |
|
||||
| `set_breakpoint_via_hook` | 通过 JS Hook 设置伪断点,捕获参数和返回值(支持持久化) |
|
||||
| `trace_function` | 追踪函数调用,自动记录参数和返回值(支持持久化) |
|
||||
| `hook_function` | 注入自定义 Hook(before/after/replace,支持 non_overridable 防覆盖) |
|
||||
| `inject_hook_preset` | 一键预设 Hook(xhr/fetch/crypto/websocket/debugger_bypass,默认持久化) |
|
||||
| `freeze_prototype` | 冻结原型方法防止页面 JS 覆盖 Hook |
|
||||
| `hook_jsvmp_interpreter` | **一键插桩 JSVMP 解释器**(追踪 Function.prototype.apply + 30+ 敏感属性) |
|
||||
| `get_jsvmp_log` / `dump_jsvmp_strings` | 获取 JSVMP 分析日志 / 提取字符串数组 |
|
||||
| `compare_env` | 全面收集浏览器环境,用于补环境对照 |
|
||||
| `trace_property_access` | Proxy 级别属性访问追踪 |
|
||||
| `add_init_script` | 页面加载前注入脚本(支持 persistent 跨导航重注入) |
|
||||
| `get_request_initiator` | 获取发起请求的 JS 调用栈(改进 URL 匹配 + 诊断信息) |
|
||||
| `start_network_capture` | 启动网络捕获(支持 capture_body 捕获响应体) |
|
||||
| `search_code(keyword, script_url=None)` | 在所有/指定 JS 中搜索关键词 |
|
||||
| `scripts(action='list'\|'get'\|'save')` | 列出/获取/保存脚本 |
|
||||
| `hook_function(mode='intercept'\|'trace')` | 自定义 Hook / 函数追踪(支持 non_overridable 防覆盖) |
|
||||
| `inject_hook_preset` | 一键预设 Hook(xhr/fetch/crypto/websocket/debugger_bypass/cookie/runtime_probe) |
|
||||
| `hook_jsvmp_interpreter` | 一键插桩 JSVMP 解释器(proxy / transparent 两种模式) |
|
||||
| `instrumentation(action='install'\|'log'\|'stop'\|'reload')` | 源码级插桩:HTTP 层改写 VMP + 日志 + 重载 |
|
||||
| `network_capture(action='start'\|'stop')` | 网络捕获(支持 capture_body) |
|
||||
| `list_network_requests` / `get_network_request` | 列出/获取捕获的请求 |
|
||||
| `get_request_initiator` | 获取发起请求的 JS 调用栈(黄金路径) |
|
||||
| `intercept_request` | 拦截/修改/Mock 网络请求 |
|
||||
| `check_detection` / `get_fingerprint_info` | 反检测验证与指纹查看 |
|
||||
| `bypass_debugger_trap` | 一键绕过反调试陷阱 |
|
||||
| `cookies(action='get'\|'set'\|'delete')` | Cookie 管理 |
|
||||
| `compare_env` | 全面收集浏览器环境,用于补环境对照 |
|
||||
| `verify_signer_offline` | 用真实样本离线验证签名代码 |
|
||||
| `evaluate_js` | 在页面执行任意 JS |
|
||||
| `export_state` / `import_state` | 保存/恢复浏览器状态 |
|
||||
| `find_dispatch_loops` | **[v2.5.0 新]** 扫描脚本定位字节码分发函数(while+switch,case 数过滤) |
|
||||
| `instrument_jsvmp_source` | **[v2.5.0 新]** 源码级插桩:在 HTTP 层改写 VMP,对每个 obj[key]/fn(args) 插入 tap(通用 VMP 利器) |
|
||||
| `get_instrumentation_log` / `get_instrumentation_status` / `stop_instrumentation` | **[v2.5.0 新]** 源码插桩日志(hot_keys/hot_methods/hot_functions)/ 状态 / 停止 |
|
||||
| `reload_with_hooks` | **[v2.5.0 新]** 重载让 persistent hook 先于页面 JS 执行(+ 清日志) |
|
||||
| `analyze_cookie_sources` | **[v2.5.0 新]** Cookie 归因:HTTP Set-Cookie vs JS document.cookie 融合分析 |
|
||||
| `get_runtime_probe_log` | **[v2.5.0 新]** 获取 runtime_probe 预设的广谱事件日志(xhr/fetch/canvas/WebGL/nav) |
|
||||
| `navigate(pre_inject_hooks=[...], via_blank=True)` | **[v2.5.0 增强]** 首屏挑战页预注入 hook + 返回 initial_status/final_status/redirect_chain |
|
||||
| `inject_hook_preset("cookie" | "runtime_probe")` | **[v2.5.0 增强]** 新增两个预设 |
|
||||
| `check_environment` / `reset_browser_state` | 环境自检 / 清理残留状态 |
|
||||
|
||||
详见 `references/mcp-cookbook.md`。
|
||||
详见 SKILL.md 的「核心武器」和「工具使用最佳实践」章节。
|
||||
|
||||
## 逆向场景覆盖
|
||||
|
||||
@@ -228,8 +232,8 @@ python main.py
|
||||
| 环境检测 | webdriver/蜜罐/指纹 | `environment-patch.md` |
|
||||
| 反检测站点 | Cloudflare/RS/JY绕过 | SKILL.md |
|
||||
| **请求失败排查** | **Cookie/Header/时间戳/签名对比** | **`troubleshooting.md`** |
|
||||
| **通用 JSVMP 源码级插桩** | **HTTP 层源码改写 + hot_keys 指纹学习法(v2.5.0 新增)** | **`jsvmp-source-instrumentation.md`** |
|
||||
| **Cookie 归因分析** | **HTTP Set-Cookie vs JS document.cookie 融合分析** | **`mcp-cookbook.md` 场景 7** |
|
||||
| **通用 JSVMP 源码级插桩** | **HTTP 层源码改写 + hot_keys 指纹学习法** | **`jsvmp-source-instrumentation.md`** |
|
||||
| **Cookie 归因分析** | **HTTP Set-Cookie vs JS document.cookie 融合分析** | **SKILL.md 场景速查** |
|
||||
|
||||
## 技术栈
|
||||
|
||||
@@ -253,4 +257,14 @@ python main.py
|
||||
- **curl_cffi**: 带浏览器 TLS 指纹模拟的 HTTP 客户端
|
||||
|
||||
### 调试工具
|
||||
- **[camoufox-reverse MCP](https://github.com/WhiteNightShadow/camoufox-reverse-mcp) v0.4.0+**: 反检测浏览器逆向分析(65 个工具,含 JSVMP 源码级插桩 + Cookie 归因分析)
|
||||
- **[camoufox-reverse MCP](https://github.com/WhiteNightShadow/camoufox-reverse-mcp) v1.0.0**: 反检测浏览器逆向分析(32 个核心工具,统一 API,含源码级插桩 + Cookie 归因分析)
|
||||
|
||||
## 版本记录
|
||||
|
||||
| 版本 | 日期 | 要点 |
|
||||
|------|------|------|
|
||||
| v3.3.0 | 2026-04-19 | 核心层回归扩容:Phase 1-5 详细动作 + 10 个场景速查 + 经验法则 24 条回迁核心层;案例层强化(禁动清单 + UA 分支矩阵) |
|
||||
| v3.2.1 | 2026-04-19 | Phase 0.5.1 强化案例复用策略;经验法则第 11 条重写 |
|
||||
| v3.2.0 | 2026-04-18 | 移除 MCP session 依赖,Checklist 压缩到三项,cases/ 成为唯一经验库 |
|
||||
| v3.1.0 | 2026-04-18 | SKILL.md 瘦身,references/ 拆分子文档,工具引用对齐 MCP 合并 API |
|
||||
| v3.0.0 | 2026-04-18 | 硬约束 Checklist + 红线四条 + 经验法则压缩 |
|
||||
|
||||
@@ -101,6 +101,22 @@
|
||||
|
||||
---
|
||||
|
||||
## 🚫 禁动清单(实战踩过的"不要碰",可选段)
|
||||
|
||||
> 如果本案例有"AI 演绎偏差导致踩坑"的经验,在此列出。每条格式:
|
||||
>
|
||||
> ### ❌ 禁动对象 N:___具体对象___
|
||||
> - **理由**:___为什么禁动(要有实测证据或技术原理)___
|
||||
> - **正确做法**:___如果真需要某种效果,替代方案是什么___
|
||||
|
||||
## 🌐 UA 分支矩阵(如涉及环境伪装,可选段)
|
||||
|
||||
> 如果本案例涉及 jsdom 环境伪装,列出 UA 分支的必补/禁补清单。
|
||||
>
|
||||
> ### UA 分支 1:___(如 Firefox UA)___
|
||||
> **必补**:...
|
||||
> **禁补**:...
|
||||
|
||||
## 踩坑记录
|
||||
|
||||
| # | 坑 | 现象 | 解决方法 |
|
||||
|
||||
@@ -76,6 +76,99 @@
|
||||
|
||||
jsdom 环境伪装,喂入-截出策略截获 a_bogus。环境值必须与 UA 自洽。
|
||||
|
||||
## 🚫 禁动清单(实战踩过的"不要碰")
|
||||
|
||||
> 以下 API / 全局对象 / 原型位置,**未经 `hook_function(mode='trace')` 或 `instrumentation` 证明 JSVMP 真的读了**,严禁在 env-patch 里改动。每一条都源自本案例的真实踩坑——改动后签名正常生成但服务端静默拒绝(HTTP 200 + 空 body)。
|
||||
|
||||
### ❌ 禁动对象 1:`win.Error` 构造函数
|
||||
|
||||
- **理由**:替换 `win.Error` 会让所有 `instanceof Error` 判断走向不确定,JSVMP 内部多处用 Error 做类型分发,替换会连锁打乱内部状态。**没有任何证据证明 JSVMP 读 Error.stack**(本案例实测)
|
||||
- **正确做法**:完全不动。如果担心 Error.stack 里的 Node.js 路径泄露,先用 `hook_function(path='Error', mode='trace')` 确认 JSVMP 真的调用了再说
|
||||
|
||||
### ❌ 禁动对象 2:任何 `constructor.name` 修改
|
||||
|
||||
- **理由**:改 `document.constructor.name = 'HTMLDocument'` 不会让 `document.constructor === window.HTMLDocument` 成立,反而让 `Object.prototype.toString.call(document.constructor)` 返回非标准字符串,得不偿失
|
||||
- **正确做法**:要让 `Object.prototype.toString.call(document) === '[object HTMLDocument]'`,**只走 `Symbol.toStringTag` 路线**(设到 `HTMLDocument.prototype` 和 `Document.prototype` 上)
|
||||
|
||||
### ❌ 禁动对象 3:`Object.prototype` 层的原型链修改
|
||||
|
||||
- **理由**:`Object.getPrototypeOf(Object.getPrototypeOf(doc))` 可能越过预期到达 `Object.prototype`,改那里会破坏全局 `Object.prototype.toString`,JSVMP 任何对象的 toString 调用都会跑进你的代码
|
||||
- **正确做法**:`scanPrototypeChain` 必须有 `if (proto === Object.prototype) break;` 边界
|
||||
|
||||
### ❌ 禁动对象 4:`Symbol.toStringTag` 设在实例上
|
||||
|
||||
- **理由**:`Object.prototype.toString.call(document)` 的算法是**原型链查找** `Symbol.toStringTag`。设在 `doc` 实例上对 `instanceof` / `constructor.name` 等相关检测不生效
|
||||
- **正确做法**:统一设到 prototype 上(`HTMLDocument.prototype` / `Document.prototype` / `Screen.prototype` / `Navigator.prototype` / `Performance.prototype`)
|
||||
|
||||
### ❌ 禁动对象 5:对 `Function.prototype.toString` 做第二次覆盖
|
||||
|
||||
- **理由**:整个 env-patch 只能有**一次** `win.Function.prototype.toString = function() {...}` 赋值。"三层防御"指**单次赋值的函数体内部**有三段检测逻辑(WeakSet + jsdom 源码正则 + 源码 fallback),**不是覆盖三次**。第二次覆盖会让命名函数暴露自身源码给 JSVMP
|
||||
- **正确做法**:写完第一次赋值后**不要**再写第二次"加固"。`grep -c "win.Function.prototype.toString *=" env-patch.js` 应该 = 1
|
||||
|
||||
### 行数自检
|
||||
|
||||
| 文件 | 合理范围 | 警报阈值 |
|
||||
|---|---|---|
|
||||
| env-patch-firefox.js | ~600-650 行 | > 800 行 |
|
||||
| env-patch-chrome.js | ~650-700 行 | > 850 行 |
|
||||
|
||||
超过警报阈值 → 跑上述 5 条禁动清单的 grep 自检,大概率有一条踩了:
|
||||
|
||||
```bash
|
||||
grep -c "win.Function.prototype.toString *=" env-patch.js # 必须 = 1
|
||||
grep -c "win.Error *=" env-patch.js # 必须 = 0
|
||||
grep -c "\.constructor.*name" env-patch.js # 必须 = 0
|
||||
```
|
||||
|
||||
## 🌐 UA 分支矩阵(必须按目标站点 UA 选分支,不跨分支混补)
|
||||
|
||||
> 环境值必须与 `navigator.userAgent` 自洽。Firefox UA 下补 Chrome 独有 API = 立即暴露。
|
||||
|
||||
### Firefox UA 分支(UA 含 `Firefox/XXX`)
|
||||
|
||||
**必补**(jsdom 缺失但真实 Firefox 有):
|
||||
|
||||
- ✅ `Notification`(构造函数 + `permission` + 静态 `requestPermission`)
|
||||
- ✅ `Worker` / `SharedWorker` / `RTCPeerConnection`
|
||||
- ✅ `AudioContext` / `OfflineAudioContext`(至少 stub `createOscillator` / `createDynamicsCompressor` / `startRendering`)
|
||||
- ✅ `matchMedia`(返回 `{matches:false, media:query}`)
|
||||
- ✅ `requestIdleCallback` / `cancelIdleCallback`(`setTimeout` 包装)
|
||||
- ✅ `indexedDB` / `caches` / `speechSynthesis` / `customElements` / `visualViewport`
|
||||
- ✅ `isSecureContext = true` / `clientInformation = navigator`
|
||||
- ✅ `WebSocket`(带静态常量 `CONNECTING / OPEN / CLOSING / CLOSED`)
|
||||
- ✅ `document.fonts` / `document.timeline`
|
||||
- ✅ `navigator.permissions.query`(stub) / `navigator.clipboard.readText/writeText`(stub)
|
||||
- ✅ `IntersectionObserver` / `ResizeObserver` / `PerformanceObserver` / `MessageChannel`(Firefox 有,jsdom 没有)
|
||||
- ✅ `structuredClone`(Firefox 有,jsdom 没有)
|
||||
|
||||
**禁补**(Chrome 独有,Firefox UA 下必须 `undefined`):
|
||||
|
||||
- ❌ `navigator.userAgentData`(Chrome 独有 Client Hints)
|
||||
- ❌ `navigator.connection`(Chrome 独有 Network Information API)
|
||||
- ❌ `navigator.getBattery`(Firefox 已从 Web 移除)
|
||||
- ❌ `window.chrome`(名字都带 chrome)
|
||||
- ❌ `performance.memory`(Chrome 独有)
|
||||
|
||||
### Chrome UA 分支(UA 含 `Chrome/XXX`)
|
||||
|
||||
**必补**(与 Firefox 大部分重合,额外加上):
|
||||
|
||||
- ✅ `navigator.userAgentData`(完整 NavigatorUAData,含 `getHighEntropyValues()`)
|
||||
- ✅ `navigator.connection`(`NetworkInformation` stub)
|
||||
- ✅ `window.chrome.{app, runtime, csi, loadTimes}`(完整 Chrome 对象)
|
||||
|
||||
**禁补**(Firefox 独有):
|
||||
|
||||
- ❌ `navigator.buildID`(Firefox 独有)
|
||||
- ❌ `InstallTrigger`(Firefox 独有标识符)
|
||||
|
||||
### 自检命令(Firefox UA 下)
|
||||
|
||||
```bash
|
||||
grep -c "userAgentData\|navigator\.connection\|getBattery\|window\.chrome\|performance\.memory" env-patch.js
|
||||
# 必须 = 0(Firefox UA 下)
|
||||
```
|
||||
|
||||
## 各 Phase 加速指引
|
||||
|
||||
- **Phase 1**: `search_code(keyword="_SdkGlueInit")` 定位配置;`scripts(action='save')` 保存三件套(webmssdk.es5.js / bdms.js / sdk-glue.js)到 `config/`
|
||||
@@ -298,6 +391,17 @@ function generateABogus(fullUrl, cookieStr) {
|
||||
| 11 | `resources: 'usable'` 是 JSVMP 拦截器激活的必要条件 | 不加 `resources: 'usable'` 时 SDK 加载成功、`byted_acrawler.frontierSign()` 能返回 X-Bogus,但 JSVMP 的 XHR 拦截器不触发(a_bogus 不生成) | jsdom 的 `resources: 'usable'` 选项会启用完整的 XHR 实现(含网络层),JSVMP 拦截器依赖这个完整实现才能正确 Hook `XMLHttpRequest.prototype.open`。不加此选项时 XHR 是简化版,拦截器无法正常工作。副作用是会尝试加载外部脚本导致 `SyntaxError: Unexpected token '<'`,但不影响 SDK 功能 |
|
||||
| 12 | `navigator.permissions` 和 `navigator.clipboard` 缺失 | 环境指纹哈希不匹配 | Firefox 浏览器有这两个 API,jsdom 没有。需要补充存根:`nav.permissions = { query: markNative(function query() { return Promise.resolve({ state: 'prompt' }); }) }` 和 `nav.clipboard = { readText/writeText 存根 }` |
|
||||
|
||||
### 踩坑记录(2026-04-19 抖音 a_bogus 二次复用补充)
|
||||
|
||||
| # | 坑 | 现象 | 解决方法 |
|
||||
|---|---|---|---|
|
||||
| 13 | `Function.prototype.toString` 被覆盖两次("三层防御"被误解为覆盖三段代码)| 签名 192 字符但服务端空 body | 整个 patch 有且仅有一次 `win.Function.prototype.toString = function() {...}` 赋值。三层防御指函数体内部的三段检测逻辑(WeakSet / jsdom 源码正则 / 源码 fallback),不是覆盖三次 |
|
||||
| 14 | `Symbol.toStringTag` 设在 `doc` 实例上而非 `HTMLDocument.prototype` | 签名 192 字符但服务端空 body | 设到 `win.HTMLDocument.prototype` 和 `win.Document.prototype`。不设实例、不 walk 到 `Object.prototype` |
|
||||
| 15 | 替换 `win.Error` 构造函数(为"清洗 stack 中 Node.js 路径")| 签名 192 字符但服务端空 body | 完全不动 Error。没有证据证明 JSVMP 读 stack,先证再动手 |
|
||||
| 16 | 修改 `document.constructor.name = 'HTMLDocument'` | 签名 192 字符但服务端空 body | 不动任何 `constructor.name`。用 `Symbol.toStringTag` 路线 |
|
||||
| 17 | Firefox UA 下补 Chrome 独有 API(`userAgentData / connection / getBattery / window.chrome / performance.memory`)| 签名 192 字符但服务端空 body | UA 与 API 矩阵必须自洽,见"UA 分支矩阵"段 |
|
||||
| 18 | env-patch 代码量爆炸(612 行 → 1030 行)| 签名生成正常但服务端静默拒绝 | 严守行数阈值,每加代码走"先证明需要 → 加 → 验证 → 保留;否则回退"循环,禁止"先加上保险" |
|
||||
|
||||
---
|
||||
|
||||
## 变体说明
|
||||
@@ -556,3 +660,17 @@ JSVMP 用自定义指令集执行,反编译成本极高且版本迭代频繁
|
||||
- **document 实例方法**:`createElement`、`createTextNode`、`createDocumentFragment`、`getElementById`、`getElementsByClassName`、`getElementsByTagName`、`querySelector`、`querySelectorAll`
|
||||
|
||||
遗漏任何一个都可能导致 JSVMP 检测到非原生环境,生成的 a_bogus 被服务端静默拒绝(HTTP 200 + 空 body)。
|
||||
|
||||
### 6. env-patch 最小化原则(2026-04-19 实测补充)
|
||||
|
||||
jsdom 环境伪装的 env-patch **行数越多越不稳**。每一行"保险代码"都可能引入新的泄露点。
|
||||
|
||||
**加代码的唯一合法循环**:
|
||||
|
||||
1. 用 `hook_function(mode='trace')` 或 `instrumentation(action='install')` 证明 JSVMP 确实读了某个 API / 属性
|
||||
2. 用 `compare_env` 确认 jsdom 中该 API 的值与真实浏览器不同
|
||||
3. 加最小化 stub(只 stub 真正被读的属性/方法)
|
||||
4. 跑真实请求验证成功
|
||||
5. 保留;否则立即回退
|
||||
|
||||
**禁止**:"先加上保险"式编码。没有证据的补丁 = 未知泄露点。
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
> ⚠️ v3.3.0 起,本文档的核心经验法则(24 条)已回迁到 SKILL.md 核心层。
|
||||
> 本文档保留作为深度背景参考,但**以 SKILL.md 为准**。如发现不一致,以 SKILL.md 为准。
|
||||
|
||||
# 经验法则完整版(30 条)
|
||||
|
||||
> **说明**:SKILL.md 核心层保留了前 10 条最常用的。本文档是完整的 30 条
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
> ⚠️ v3.3.0 起,本文档的核心动作清单已回迁到 SKILL.md 核心层。
|
||||
> 本文档保留作为深度背景参考,但**以 SKILL.md 为准**。如发现不一致,以 SKILL.md 为准。
|
||||
|
||||
# MCP 工具使用手册
|
||||
|
||||
## 概述
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
> ⚠️ v3.3.0 起,本文档的核心动作清单已回迁到 SKILL.md 核心层。
|
||||
> 本文档保留作为深度背景参考,但**以 SKILL.md 为准**。如发现不一致,以 SKILL.md 为准。
|
||||
|
||||
# Phase 0-5 详细操作手册
|
||||
|
||||
> **触发条件**:执行某个 Phase 不确定具体怎么做时读
|
||||
|
||||
Reference in New Issue
Block a user