reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

View File

@@ -0,0 +1,175 @@
# native 能力缺口闭环
本文件用于补环境阶段遇到“纯 JS、addon.node 当前 API、xbs isolated-vm 当前 API 都无法可靠表达目标浏览器行为”的场景。遇到这类问题时,不要继续硬凑 JS fallback,不要假装 addon / xbs 已经解决,也不要把当前报错消失写成稳定结论。
## 读取时机
- 目标检测点涉及浏览器引擎级特殊语义,例如 `document.all` 的 HTMLDDA、内部槽 brand check、不可检测对象、跨 Realm 行为、DataCloneError、Error stack、不可通过普通 JS 控制的 `typeof` / `Boolean` / `== null` 行为。
- 已确认纯 JS fallback 无法满足真实浏览器行为。
- 已确认当前 addon.node 可用但没有对应 API,或已有 API 无法覆盖目标行为。
- 用户选择 `isolated-vm` 时,已确认当前 `window.xbs` / `xbs.dom` 可用但没有对应 API,或已有 API 无法覆盖目标行为。
- 反复修改同一 WebAPI 仍回到失败逻辑,需要给用户一个可验证的 native 扩展需求。
## 判定顺序
先排除以下两类问题,只有排除后才能标记为 native 能力缺口:
1. **当前补环境实现不完整**:原型链、属性描述符、访问器、构造函数行为、toString、`Symbol.toStringTag`、实例工厂、私有状态、指纹回放样本缺失。这类问题继续补代码,不得上升为 native 能力缺口。
2. **已有 native API 使用错误**:addon / xbs 已提供 `createProtoChains`、`createNativeFunction`、`createGetter`、`createSetter`、`createNativeCollection`、`getMimeTypesAndPlugins`、`createUndetectable`、`createInterceptor`、private slot 等能力,但当前代码没有优先使用或参数用错。这类问题先改为 addon-first / xbs native-first。
3. **native 能力缺口**:真实浏览器行为已经采样,纯 JS 无法可靠表达,当前 addon.node 与 xbs isolated-vm 也没有可用 API 或现有 API 行为不够。此时暂停补环境实现,进入能力缺口闭环。
## 必须输出的能力缺口报告
在 `case/notes/native-capability-gap.md` 写入报告,并在阶段报告中引用。报告至少包含:
```markdown
# native 能力缺口报告
## 阻塞点
- API / 行为:
- 触发位置:文件、行列、调用栈或 RuyiTrace 证据
- 目标代码检测表达式:
- 该行为是否为生成目标加密参数的必要路径:是 / 否 / 待确认
## 真实浏览器基线
- 取证工具:ruyiPage / Camoufox / CloakBrowser / 用户手动
- 浏览器版本:
- 采样代码:
- 期望结果摘要:
## 当前后端能力对比
| 后端 | 当前结果 | 差异 | 结论 |
|---|---|---|---|
| 纯 JS fallback | | | 可解决 / 不可靠 / 无法解决 |
| addon.node | | | 可解决 / API 用法错误 / 当前 API 缺失 |
| xbs isolated-vm | | | 可解决 / API 用法错误 / 当前 API 缺失 / 未选择该框架 |
## 无法继续硬补的原因
- 纯 JS 无法控制的语义:
- addon.node 当前缺少或不足的能力:
- xbs isolated-vm 当前缺少或不足的能力:
## 建议新增 native API
- 建议 API 名称:
- 适用后端:addon.node / xbs isolated-vm / 二者都需要
- 输入参数:
- 返回值:
- 需要复现的浏览器语义:
- 需要同时保护的检测点:typeof / Boolean / == null / descriptor / prototype / toString / Object.prototype.toString / instanceof / structuredClone / postMessage / 其他
- 错误类型与错误信息:
## 最小行为测试用例
见下方测试代码。只有新 API 让该测试通过,才能把此阻塞点标记为已解决。
## 用户选择
- 等待或扩展 native API / 接受临时 JS workaround / 改变任务范围 / 暂停 case
- 选择时间:
- 选择原因:
```
## 最小测试用例要求
测试用例是行为契约,不是演示代码。要求:
1. 能在真实浏览器中运行并得到期望结果。
2. 能在目标后端运行,例如普通 Node + addon、或 isolated-vm Context + xbs。
3. 覆盖导致阻塞的关键表达式,不只覆盖当前报错行。
4. 包含 `expected` 与 `actual`,失败时输出具体差异。
5. 不放入最终 `result/` 交付目录。能力未补齐时可保存在 `case/notes/native-capability-gap-test.js` 或 `case/native-capability-gap/<name>.js`,补齐并验证后按清理规则处理,最终总结只保留报告摘要和测试结果。
## 示例:document.all / HTMLDDA 行为契约
```js
function collectDocumentAllBehavior(document) {
const value = document.all;
return {
typeofValue: typeof document.all,
looseNull: document.all == null,
strictUndefined: document.all === undefined,
booleanValue: Boolean(document.all),
hasAllInDocument: 'all' in document,
lengthType: typeof document.all.length,
itemType: typeof document.all.item,
namedItemType: typeof document.all.namedItem,
objectToString: Object.prototype.toString.call(document.all),
ownLength: Object.hasOwn(document.all, 'length'),
ownItem: Object.hasOwn(document.all, 'item'),
ownNamedItem: Object.hasOwn(document.all, 'namedItem'),
sameReference: value === document.all,
};
}
const expected = {
typeofValue: 'undefined',
looseNull: true,
strictUndefined: false,
booleanValue: false,
hasAllInDocument: true,
lengthType: 'number',
itemType: 'function',
namedItemType: 'function',
objectToString: '[object HTMLAllCollection]',
ownLength: false,
ownItem: false,
ownNamedItem: false,
sameReference: true,
};
function assertDocumentAllBehavior(document) {
const actual = collectDocumentAllBehavior(document);
const failed = [];
for (const key of Object.keys(expected)) {
if (actual[key] !== expected[key]) {
failed.push({ key, expected: expected[key], actual: actual[key] });
}
}
return { ok: failed.length === 0, actual, failed };
}
const result = assertDocumentAllBehavior(document);
if (!result.ok) {
throw new Error(JSON.stringify(result.failed, null, 2));
}
result;
```
如果纯 JS、当前 addon `createUndetectable(callback, handlers)`、当前 xbs `createUndetectable(callback, handlers)` 或 `xbs.dom.createDocument()` 都无法让该测试通过,才允许把它标记为 native 能力缺口。标记前必须先排除用法错误:选择 isolated-vm 时应优先使用 `xbs.dom.createDocument()` 默认提供的 `document.all`;手动创建时 handlers 未命中必须返回 `{ intercept: false }`,并把 `length / item / namedItem / Symbol.toStringTag` 放到 `HTMLAllCollection.prototype`,不能把它们做成 `document.all` 自有属性。确认仍无法通过后,再建议新增或修正 API,例如增强 `createUndetectable()` / `xbs.dom.createDocument()` 的 HTMLAllCollection 能力。
## 建议 API 设计输出格式
给用户的建议不能只写“需要改 addon”。必须尽量具体到 API 契约:
```js
// 示例名称仅用于表达需求,真实名称由 native 实现决定。
const all = native.createHTMLDDACollection({
className: 'HTMLAllCollection',
length: elements.length,
items: elements,
itemName: 'item',
namedItemName: 'namedItem',
});
```
需要说明:
- `typeof all` 的期望。
- `Boolean(all)` 的期望。
- `all == null` 与 `all === undefined` 的期望。
- `length`、索引、`item()`、`namedItem()` 的期望。
- 原型链、构造函数、`Object.prototype.toString`、函数 toString、描述符枚举行为。
- 与 `document.all` getter / value descriptor 的安装方式。
## 继续推进规则
- 用户更新 addon.node 或 xbs isolated-vm 后,先运行能力缺口测试用例,再继续补环境。
- 测试未通过时,不得把该点标记为已解决。
- 用户选择临时 JS workaround 时,必须把范围写成“仅当前样本路径临时兼容”,不得写成稳定方案。
- 用户拒绝扩展 native 能力且目标参数生成必须依赖该行为时,标记 case 阻塞,不要伪造成功。
- 阻塞报告、用户选择、测试用例结果必须写入阶段报告和最终总结。