dsh-js-reverse-plugin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/cordis.patch.yml +14 -0
  2. package/index.js +61 -0
  3. package/package.json +20 -0
  4. package/skills/iv8-env-runtime/SKILL.md +159 -0
  5. package/skills/iv8-env-runtime/assets/entry-report-template.txt +23 -0
  6. package/skills/iv8-env-runtime/assets/env_starter.py +100 -0
  7. package/skills/iv8-env-runtime/references/case-function-iwencai.md +96 -0
  8. package/skills/iv8-env-runtime/references/case-intercept-douyin.md +133 -0
  9. package/skills/iv8-env-runtime/references/config-defaults-cheatsheet.md +75 -0
  10. package/skills/iv8-env-runtime/references/cross-platform-install.md +108 -0
  11. package/skills/iv8-env-runtime/references/iv8-api-contract.md +97 -0
  12. package/skills/iv8-env-runtime/references/network-and-eventloop.md +113 -0
  13. package/skills/iv8-env-runtime/references/part1-entry-location.md +138 -0
  14. package/skills/iv8-env-runtime/references/part1-mcp-tool-map.md +77 -0
  15. package/skills/iv8-env-runtime/references/part2-discovery.md +80 -0
  16. package/skills/iv8-env-runtime/references/patching-principles.md +91 -0
  17. package/skills/iv8-env-runtime/references/trap-blacklist.md +60 -0
  18. package/skills/iv8-env-runtime/references/version-gotchas.md +128 -0
  19. package/skills/iv8-env-runtime/scripts/consistency_lint.py +211 -0
  20. package/skills/iv8-env-runtime/scripts/defaults_audit.py +143 -0
  21. package/skills/iv8-env-runtime/scripts/monitor_env.py +185 -0
  22. package/skills/iv8-env-runtime/scripts/network_bridge.py +147 -0
  23. package/skills/iv8-env-runtime/scripts/parity_check.py +175 -0
  24. package/skills/iv8-env-runtime/scripts/preflight.py +144 -0
  25. package/skills/iv8-env-runtime/scripts/reproduce_stub_error.py +165 -0
  26. package/skills/iv8-env-runtime/scripts/run_target.py +150 -0
  27. package/skills/iv8-jsvmp-recovery/SKILL.md +129 -0
  28. package/skills/iv8-jsvmp-recovery/agents/openai.yaml +4 -0
  29. package/skills/iv8-jsvmp-recovery/references/case-study-douyin-a-bogus.md +320 -0
  30. package/skills/iv8-jsvmp-recovery/references/controlled-oracle-and-equivalence.md +247 -0
  31. package/skills/iv8-jsvmp-recovery/references/static-trace-evidence.md +289 -0
  32. package/skills/iv8-jsvmp-recovery/references/vmp-domain-model.md +212 -0
  33. package/skills/iv8-jsvmp-recovery/scripts/verify-equivalence.py +281 -0
  34. package/skills/js-ast-deobfuscation/SKILL.md +140 -0
  35. package/skills/js-ast-deobfuscation/agents/openai.yaml +4 -0
  36. package/skills/js-ast-deobfuscation/references/anti-patterns.md +325 -0
  37. package/skills/js-ast-deobfuscation/references/first-pass.md +255 -0
  38. package/skills/js-ast-deobfuscation/references/interaction-and-stopping.md +758 -0
  39. package/skills/js-ast-deobfuscation/references/iv8-runtime-observation.md +773 -0
  40. package/skills/js-ast-deobfuscation/references/jsvmp-identification.md +328 -0
  41. package/skills/js-ast-deobfuscation/references/methods-and-evidence.md +460 -0
  42. package/skills/js-ast-deobfuscation/references/patterns-and-priority.md +516 -0
  43. package/skills/js-ast-deobfuscation/references/validation-contract.md +604 -0
  44. package/skills/js-ast-deobfuscation/scripts/prepare-source.mjs +921 -0
@@ -0,0 +1,516 @@
1
+ # 混淆画像、模式识别与优先级
2
+
3
+ 本 reference 只回答六件事:当前看到了什么、是否真是混淆、出现多少、影响哪里、依赖什么、应该处理还是分流。
4
+
5
+ 它不替代完整源码阅读,不规定 transform 实现,不承担动态取证方法或验收。入口文件已经选定当前阶段;本文只处理复杂模式分类、误判校准和重新排序,不继续加载其他 reference。
6
+
7
+ ## 目录
8
+
9
+ - [1. 使用时机与边界](#1-使用时机与边界)
10
+ - [2. 从完整源码建立画像](#2-从完整源码建立画像)
11
+ - [3. 统计口径](#3-统计口径)
12
+ - [4. 依赖与优先级](#4-依赖与优先级)
13
+ - [5. 字符串隐藏](#5-字符串隐藏)
14
+ - [6. 表达式隐藏](#6-表达式隐藏)
15
+ - [7. helper、proxy 与 alias](#7-helperproxy-与-alias)
16
+ - [8. binding 与语义命名](#8-binding-与语义命名)
17
+ - [9. 控制流隐藏](#9-控制流隐藏)
18
+ - [10. 动态代码与载荷](#10-动态代码与载荷)
19
+ - [11. 反调试、环境检测与遥测](#11-反调试环境检测与遥测)
20
+ - [12. 打包器、数字模块、polyfill 与第三方代码](#12-打包器数字模块polyfill-与第三方代码)
21
+ - [13. JSVMP 宿主边界](#13-jsvmp-宿主边界)
22
+ - [14. 画像记录模板](#14-画像记录模板)
23
+ - [15. 每步后的重新画像](#15-每步后的重新画像)
24
+
25
+ ## 1. 使用时机与边界
26
+
27
+ 只在以下准备完成后读取本 reference:
28
+
29
+ 1. 原始输入已经冻结并记录 hash。
30
+ 2. Node Prettier 已对派生副本完成格式化。
31
+ 3. 模型已经按连续区间直接阅读完整的格式化 JavaScript。
32
+
33
+ 先记录真实代码事实,再借助本 reference 命名和归类。不得从文件名、课程主题、历史案例或本清单反推当前样本必然具有某种结构。
34
+
35
+ 这里列出的是常见家族,不是固定 detector 列表,也不是执行顺序。一个文件可能没有其中任何一种,也可能出现新的组合。
36
+
37
+ 首轮结果必须称为“当前视图中可见的模式”。字符串恢复、载荷解包或其他步骤可能暴露新的结构。
38
+
39
+ ## 2. 从完整源码建立画像
40
+
41
+ ### 2.1 先区分代码角色
42
+
43
+ 同一种表面形态在不同角色中含义不同。先把相关区域分为:
44
+
45
+ - 业务逻辑。
46
+ - 入口、导出和公开 API。
47
+ - 打包器与模块运行时。
48
+ - polyfill 和第三方依赖。
49
+ - 编译、转译与压缩产物。
50
+ - 动态载荷和加载器。
51
+ - 环境检测、反调试、监控与遥测。
52
+ - VM 数据、解释器、宿主桥和外围适配层。
53
+ - 当前无法分类的区域。
54
+
55
+ 分类必须有源码锚点。不能因为代码难读,就自动标为混淆。
56
+
57
+ ### 2.2 每个候选都保存证据层级
58
+
59
+ - `Observed`:源码或已限定范围的运行日志直接证明。
60
+ - `Inferred`:由多项事实支持,但仍包含解释。
61
+ - `Unknown`:缺少关键证据,不能继续断言。
62
+
63
+ 例如:
64
+
65
+ - 对象中存在 getter/setter 是 `Observed`。
66
+ - 它为宿主变量提供 VM 读写能力,可以是有静态连接支持的 `Inferred`。
67
+ - 某次真实运行一定访问该 slot,则在没有运行证据时仍是 `Unknown`。
68
+
69
+ ### 2.3 给每个候选建立源码锚点
70
+
71
+ 至少记录:
72
+
73
+ - 声明或入口位置。
74
+ - 代表性源码片段。
75
+ - 主要消费者位置。
76
+ - 与入口、导出、网络、Cookie、Storage、加密、动态代码或 VM 的关系。
77
+ - 仍需复读的相邻区域。
78
+
79
+ 自动统计只能补全数量和定位遗漏,不能替代源码锚点。
80
+
81
+ ## 3. 统计口径
82
+
83
+ ### 3.1 分开三个数字
84
+
85
+ - **模式家族数量**:当前视图中可区分的结构类型数。
86
+ - **出现次数**:某一家族匹配到的节点、调用点、声明或区域数。
87
+ - **影响范围**:该家族实际阻碍的入口、模块、函数、数据流或源码区间。
88
+
89
+ 不能把“发现 8 个家族”和“匹配 800 次”写成同一个数字。
90
+
91
+ ### 3.2 先定义计数单位
92
+
93
+ 不同家族使用不同单位,必须写明:
94
+
95
+ - 字符串隐藏:池条目、decoder、调用点、动态消费者分别计数。
96
+ - helper/proxy:声明、属性和调用点分别计数。
97
+ - 控制流隐藏:dispatcher、case、受控函数分别计数。
98
+ - 动态代码:生成点、执行点和载荷分别计数。
99
+ - 数字模块:模块工厂、加载调用、唯一依赖边分别计数。
100
+ - VM 宿主:入口、slot、descriptor、binding 和公开导出分别计数。
101
+
102
+ ### 3.3 标记精度
103
+
104
+ 每个数字标为:
105
+
106
+ - `exact`:边界明确并完整统计。
107
+ - `lower-bound`:至少有这么多,但仍有动态或不可解析部分。
108
+ - `estimate`:抽样或启发式估计,并写明原因。
109
+
110
+ 同一语法节点同时命中多个表面特征时,应按真实结构去重,不能为了显得复杂而重复累计。
111
+
112
+ ### 3.4 不把静态存在写成运行事实
113
+
114
+ 模块、字符串、分支、slot 或 API 在源码中存在,只证明它们可达或可被使用,不证明:
115
+
116
+ - 当前入口会执行它。
117
+ - 当前输入会走到它。
118
+ - 它影响最终输出。
119
+ - 它属于业务算法。
120
+
121
+ 画像中分别记录“静态存在”“静态可达”和“已观察执行”。
122
+
123
+ ## 4. 依赖与优先级
124
+
125
+ ### 4.1 建立模式依赖
126
+
127
+ 常见依赖关系包括:
128
+
129
+ - 字符串隐藏遮住属性名、模块名、API 和 dispatcher token。
130
+ - 表达式隐藏遮住分支常量和索引。
131
+ - helper/proxy 遮住真实调用和操作符。
132
+ - 动态载荷遮住新的源码层。
133
+ - 打包器边界遮住业务入口和第三方依赖边界。
134
+ - VM 宿主短名遮住公开入口、slot 和宿主能力。
135
+
136
+ 依赖边只表达“阻挡、揭示、消费或约束”,不能冒充运行数据流。
137
+
138
+ ### 4.2 字符串是唯一固定检查门
139
+
140
+ 每个样本都必须检查真实字符串隐藏。
141
+
142
+ - 确认存在时,把字符串恢复作为第一个语义推荐。
143
+ - 不存在时记录证据,继续按收益选择。
144
+ - 静态无法确认时标为 `Unknown`,不要制造空 transform。
145
+
146
+ 字符串步骤之后没有固定顺序。必须重新阅读最新视图并重新排序。
147
+
148
+ ### 4.3 收益排序
149
+
150
+ 比较候选时考虑:
151
+
152
+ 1. 是否直接服务当前分析方向;用户尚未给出下游问题时,是否明显改善整体理解。
153
+ 2. 是否揭示入口、调用关系、关键数据流或多个后续结构。
154
+ 3. 影响范围是否足够大。
155
+ 4. 证据是否足以限定边界。
156
+ 5. 是否可能改变 binding、副作用、异常路径或业务语义。
157
+ 6. 所需成本是否合理。
158
+ 7. 是否仍属于 AST 解混淆边界。
159
+
160
+ 出现次数不是唯一收益指标。一个只出现一次的载荷入口可能比数千个无关短名更重要。
161
+
162
+ ### 4.4 分流含义
163
+
164
+ - `推荐处理`:明显阻碍理解或后续分析,证据和边界足够。
165
+ - `必须询问`:涉及删除、高风险重写、语义命名、动态执行或范围扩张。
166
+ - `默认跳过`:主要是美观、无关依赖或不影响当前目标。
167
+ - `当前阻塞`:候选相关,但缺少证据、输入、环境或稳定匹配。
168
+ - `阶段交接`:继续处理需要系统补环境、真实浏览器或 VM 内部能力。
169
+
170
+ ## 5. 字符串隐藏
171
+
172
+ ### 可观察形态
173
+
174
+ - 十六进制或 Unicode 转义字面量。
175
+ - 大型字符串数组、旋转数组和索引偏移 decoder。
176
+ - Base64、字符码拼接、自定义字母表或流式解码。
177
+ - decoder wrapper、别名、缓存和多层索引。
178
+ - 通过字符串隐藏的属性名、模块名和 API。
179
+ - 一段内嵌载荷同时初始化字符串、配置和二进制记录。
180
+
181
+ ### 常见误判
182
+
183
+ - Base64 可能只是图片、证书、压缩资源或普通业务数据。
184
+ - 大数组可能是字典、模型、协议表或 VM 数据。
185
+ - 转义字面量可能只是压缩器输出。
186
+ - 池中存在某个字符串,不证明对应路径执行。
187
+
188
+ ### 还需要直接读取什么
189
+
190
+ - 载荷的完整生产链和消费链。
191
+ - 初始化发生在加载期还是按需调用。
192
+ - decoder 是否依赖环境、随机数、时间、闭包或外部状态。
193
+ - 消费者使用常量索引还是动态索引。
194
+ - 解码结果是否同时包含非字符串数据。
195
+
196
+ ### 依赖、统计与证明边界
197
+
198
+ 分别统计载荷、池、decoder、调用点和消费者。动态索引时,即使不能替换单个调用点,完整池和稳定索引仍可能是高收益分析产物。
199
+
200
+ 静态只能证明池内容和连接关系时,不得声称某个字符串参与最终算法。
201
+
202
+ ### 分流
203
+
204
+ - 确认真正隐藏属性、API、模块或控制信息时:推荐首先处理。
205
+ - 需要执行 decoder、读取运行时 key 或解压载荷时:先标出证据缺口,按方法 reference 决定 static、hybrid 或 blocked。
206
+ - 删除初始化器、缓存或原始载荷时:必须询问,并检查消费者和副作用。
207
+ - 只是资源、第三方数据或 VM 字节记录时:默认跳过或原样保留。
208
+ - 后续必须解释 VM 记录或字节码时:交接 VM 分析。
209
+
210
+ ## 6. 表达式隐藏
211
+
212
+ ### 可观察形态
213
+
214
+ - 括号属性访问代替点访问。
215
+ - 字符串拼接隐藏关键名称。
216
+ - 十六进制数、布尔技巧、`void 0` 和冗余括号。
217
+ - 逗号表达式、序列表达式和间接调用。
218
+ - 常量算术、位运算和可折叠条件。
219
+
220
+ ### 常见误判
221
+
222
+ - 括号访问可能来自动态属性、关键字兼容或生成器。
223
+ - 间接调用可能故意改变 `this`。
224
+ - 逗号表达式可能保留前项副作用。
225
+ - 十六进制数字可能是协议位掩码、哈希常量或地址。
226
+
227
+ ### 依赖、统计与证明边界
228
+
229
+ 按表达式节点和受影响消费者统计,不把同一表达式中的每个字面量都算作独立模式。
230
+
231
+ 只有求值顺序、`this`、异常和副作用边界明确时,才能把它列为低风险候选。
232
+
233
+ ### 分流
234
+
235
+ - 能显著揭示条件、索引或关键调用且边界确定时:推荐处理。
236
+ - 涉及 getter、隐式转换、`this`、异常或副作用时:必须询问或当前阻塞。
237
+ - 只改善外观而不影响分析时:默认跳过。
238
+
239
+ ## 7. helper、proxy 与 alias
240
+
241
+ ### 可观察形态
242
+
243
+ - 对象属性包装二元或一元操作。
244
+ - wrapper 只转发函数调用或构造调用。
245
+ - 多层函数别名、属性别名和立即赋值。
246
+ - 模块加载器、导出包装和兼容层代理。
247
+
248
+ ### 常见误判
249
+
250
+ - wrapper 可能绑定 `this`、使用 `arguments`、捕获闭包或改变异常。
251
+ - alias 可能只是赋值时刻的快照,不是永久等价关系。
252
+ - helper 可能承担缓存、计数、遥测或环境适配。
253
+ - 加载器和兼容包装可能是基础设施,不是混淆。
254
+
255
+ ### 还需要直接读取什么
256
+
257
+ - 完整函数体和所有引用。
258
+ - 写入、重新赋值和动态属性访问。
259
+ - 调用点的 `this`、参数展开和返回值使用。
260
+ - wrapper 是否跨越业务、第三方或 VM 边界。
261
+
262
+ ### 依赖、统计与证明边界
263
+
264
+ 分别统计声明、属性、调用点和影响范围。同一个 helper 被大量消费时,出现一次也可能有高解锁收益。
265
+
266
+ 静态连接只证明可能的转发关系;发生过重新赋值时,不能把所有时刻视为同一值。
267
+
268
+ ### 分流
269
+
270
+ - 单语句、无副作用、无动态状态且阻碍关键调用时:推荐处理。
271
+ - 使用 `this`、`arguments`、闭包状态、mutation 或动态属性时:必须询问或阻塞。
272
+ - 属于无关 polyfill、模块兼容层且不阻碍分析时:默认跳过。
273
+
274
+ ## 8. binding 与语义命名
275
+
276
+ ### 可观察形态
277
+
278
+ - 大量单字母、随机或重复短名。
279
+ - 相同文本名称出现在多层作用域。
280
+ - 公开导出、入口和宿主角色被压缩名称遮住。
281
+ - 属性名和局部 binding 混用相同文本。
282
+
283
+ ### 常见误判
284
+
285
+ - 短名可能只是压缩,不是独立混淆。
286
+ - 相同文本不代表同一个 binding。
287
+ - 静态角色名称不证明真实运行路径或业务语义。
288
+ - 无法恢复作者原名,不等于无法建立可用坐标。
289
+
290
+ ### 依赖、统计与证明边界
291
+
292
+ 按词法 binding、声明和引用分别统计,不能按文本出现次数统计“变量”。
293
+
294
+ 优先使用中性角色名,例如 loader、cache、entry、slot 或 record。业务语义名称需要更强证据。
295
+
296
+ ### 分流
297
+
298
+ - 名称明显阻碍入口、调用关系或阶段交接,且角色可静态证明时:推荐中性命名。
299
+ - 多个语义解释成立或准备使用业务名称时:必须询问。
300
+ - 只是无关第三方内部短名时:默认跳过。
301
+ - 涉及 VM Opcode、栈效应或算法含义时:交接 VM 分析。
302
+
303
+ ## 9. 控制流隐藏
304
+
305
+ ### 可观察形态
306
+
307
+ - 不透明谓词和恒真、恒假分支。
308
+ - `while`、`switch` 和 dispatcher 驱动的基本块重排。
309
+ - 静态顺序串、case 索引和手工状态机。
310
+ - 异常、递归或回调驱动的非线性流程。
311
+
312
+ ### 常见误判
313
+
314
+ - 普通状态机、协议解析器、解释器和编译器也大量使用 `switch`。
315
+ - `while (true)` 可能是正常消费循环。
316
+ - 看似死分支可能由 getter、Proxy、时间、随机数或环境决定。
317
+ - VM dispatcher 属于下一阶段,不是普通控制流平坦化。
318
+
319
+ ### 还需要直接读取什么
320
+
321
+ - dispatcher 的来源、更新和全部消费者。
322
+ - case 完整性、fallthrough、break、continue、return 和 throw。
323
+ - 状态是否被闭包、异常或外部事件修改。
324
+ - 该结构是业务控制流、基础设施还是 VM 解释器。
325
+
326
+ ### 依赖、统计与证明边界
327
+
328
+ 按 dispatcher、受控函数、case 和基本块统计。不能看到一个 `switch` 就计作控制流平坦化。
329
+
330
+ ### 分流
331
+
332
+ - 顺序和终止边界可证明,且直接阻碍目标路径时:可推荐处理。
333
+ - 涉及异常路径、外部状态或大范围重写时:必须询问。
334
+ - 正常状态机或无关基础设施:默认跳过。
335
+ - VM dispatcher、虚拟控制流或 Opcode 语义:交接 VM 分析。
336
+
337
+ ## 10. 动态代码与载荷
338
+
339
+ ### 可观察形态
340
+
341
+ - 直接或间接 `eval`。
342
+ - `Function`、构造器链和字符串生成函数。
343
+ - 字符码、Base64、压缩数据或模板拼出的源码。
344
+ - 运行时下载、解密或注入的新脚本。
345
+
346
+ ### 常见误判
347
+
348
+ - `Function` 可能是能力探测或 polyfill。
349
+ - 字符串可能是模板、查询或数据,而不是 JavaScript。
350
+ - 动态代码存在不证明它被当前入口执行。
351
+
352
+ ### 还需要直接读取什么
353
+
354
+ - payload 的生产、执行和结果消费位置。
355
+ - 是否依赖真实网络、页面生命周期、环境或用户输入。
356
+ - 执行前后可能发生的全局写入、注册和副作用。
357
+ - 解包后是否暴露新的混淆层。
358
+
359
+ ### 依赖、统计与证明边界
360
+
361
+ 分别统计生成点、执行点、唯一载荷和消费者。相同 payload 被多次执行时不能重复算作多个家族。
362
+
363
+ ### 分流
364
+
365
+ - payload 阻碍关键逻辑理解时:推荐先揭示 payload。
366
+ - 需要执行完整未知代码、真实网络或宿主权限时:必须询问。
367
+ - 只需保留动态边界而与当前方向无关时:默认跳过。
368
+ - 缺少 payload、trigger 或环境时:当前阻塞。
369
+ - 载荷进入 VM 字节码或需要真实浏览器行为时:交接相应阶段。
370
+
371
+ ## 11. 反调试、环境检测与遥测
372
+
373
+ ### 可观察形态
374
+
375
+ - `debugger`、定时守卫、函数源码完整性检查。
376
+ - console 覆盖、无限循环或调试器时间差。
377
+ - `navigator`、`window`、`document`、Cookie、Storage 和 location 探测。
378
+ - API 存在性、属性描述符、反射和 native-code 检查。
379
+ - 监控、性能、错误上报和遥测调用。
380
+
381
+ ### 常见误判
382
+
383
+ - 环境探测可能决定正常兼容分支。
384
+ - 遥测可能参与初始化、配置或业务开关。
385
+ - `Function("return this")` 也可能是通用全局对象获取。
386
+ - 发现反调试信号不等于可以删除。
387
+
388
+ ### 依赖、统计与证明边界
389
+
390
+ 按守卫、探测点、被探测 API 和受控分支统计。环境读取只证明发生访问,不证明它进入最终算法。
391
+
392
+ ### 分流
393
+
394
+ - 直接阻碍阅读、触发或动态取证时:作为候选提交。
395
+ - 删除、绕过或修改环境分支时:必须询问。
396
+ - 不影响当前目标时:默认跳过并保留边界。
397
+ - 需要系统补环境或真实浏览器状态时:交接运行环境阶段。
398
+
399
+ ## 12. 打包器、数字模块、polyfill 与第三方代码
400
+
401
+ ### 可观察形态
402
+
403
+ - 数字或短字符串作为模块键。
404
+ - 模块工厂表、缓存和加载函数。
405
+ - 大量内部依赖边和入口包装模块。
406
+ - 多版本 polyfill、兼容层和第三方源码片段。
407
+
408
+ ### 常见误判
409
+
410
+ - 数字模块 ID 是打包器常见表示,不自动等于恶意混淆。
411
+ - 短变量可能来自发布构建或压缩。
412
+ - 模块存在不代表运行时加载。
413
+ - 猜出的模块业务名称不能当作证据。
414
+ - 识别出第三方库不代表可以删除。
415
+
416
+ ### 还需要直接读取什么
417
+
418
+ - 模块表、缓存、加载器和入口包装的真实结构。
419
+ - 直接依赖、反向依赖和公开导出。
420
+ - 内嵌版本、许可证、字面量和结构证据。
421
+ - 目标业务入口实际依赖哪些组件。
422
+
423
+ ### 依赖、统计与证明边界
424
+
425
+ 分别统计模块、加载调用、唯一依赖边、入口和分类后的第三方组件。文本搜索得到的数量只能作为下界,不能覆盖 AST 统计。
426
+
427
+ 官方名称、版本或角色只有在源码、版本记录、依赖图或导出行为形成一致证据时才能接受。无法证明时保留 ID 或使用中性名称。
428
+
429
+ ### 分流
430
+
431
+ - 模块边界阻碍业务入口、调用关系或第三方区分时:推荐恢复稳定角色或有证据的名称。
432
+ - 需要引入高语义名称、删除依赖或改变加载语义时:必须询问。
433
+ - 与目标无关的 polyfill 和第三方内部短名:默认跳过。
434
+ - 缺少足够匹配证据时:保留原 ID,标为当前阻塞而不是猜名。
435
+
436
+ ## 13. JSVMP 宿主边界
437
+
438
+ ### 可观察形态
439
+
440
+ - 外层加载器、VM 数据区、解释器和数字入口。
441
+ - getter/setter descriptor 将 slot 连接到外层 binding。
442
+ - 公开 API、初始化函数和宿主调用桥。
443
+ - VM 外围的加密、网络、时间、随机数或环境适配。
444
+
445
+ ### 常见误判
446
+
447
+ - descriptor 证明能力连接,不证明真实运行读写。
448
+ - 同一 binding 的前后连接是潜在边界,不是执行轨迹。
449
+ - 赋值 alias 可能是当前位置快照。
450
+ - 解释器中的 `switch` 不应按普通控制流平坦化处理。
451
+ - 外层角色可命名,不代表 Opcode 或业务算法已恢复。
452
+
453
+ ### 还需要直接读取什么
454
+
455
+ - VM 数据、入口、解释器和公开导出的连接位置。
456
+ - slot descriptor 的 getter、setter 和对应 binding。
457
+ - 外层 helper、宿主 API 和网络出口。
458
+ - 哪些结构位于 VM 外围,哪些已经进入虚拟语义。
459
+
460
+ ### 依赖、统计与证明边界
461
+
462
+ 分别统计入口、slot、descriptor、binding、公开导出和潜在能力边。静态连接图不得写成运行轨迹。
463
+
464
+ 中性名称用于建立稳定坐标;实际 slot 使用、运行路径和 VM 内部算法仍是 `Unknown`,除非有相应运行或 VM 证据。
465
+
466
+ ### 分流
467
+
468
+ - 清理外围字符串、载荷、公开入口和宿主角色能改善后续分析时:推荐处理。
469
+ - 高语义业务命名、删除解释器外围或改变宿主连接时:必须询问。
470
+ - VM 内部 Opcode、PC、值栈、帧栈和虚拟控制流:默认不处理并交接 VM 分析。
471
+ - 需要系统补环境才能观察公开出口时:交接运行环境阶段。
472
+
473
+ ## 14. 画像记录模板
474
+
475
+ 每个当前可见模式至少记录:
476
+
477
+ ```text
478
+ 模式 ID 与名称:
479
+ 代码角色:
480
+ 代表性源码锚点:
481
+ 出现次数及计数单位:
482
+ 精度:exact / lower-bound / estimate
483
+ 影响范围和主要消费者:
484
+ 依赖或阻挡关系:
485
+ Observed:
486
+ Inferred:
487
+ Unknown:
488
+ 常见误判已排除:
489
+ 当前可以证明到哪里:
490
+ 预期收益:
491
+ 初步优先级:
492
+ 建议分流:推荐处理 / 必须询问 / 默认跳过 / 当前阻塞 / 阶段交接
493
+ ```
494
+
495
+ 模式表之外,单独记录:
496
+
497
+ ```text
498
+ 当前模式家族总数:
499
+ 业务、基础设施、第三方、编译产物和 VM 的边界:
500
+ 字符串判断结论:
501
+ 最高收益候选:
502
+ 仍未分类区域:
503
+ ```
504
+
505
+ ## 15. 每步后的重新画像
506
+
507
+ 每个通过验收的步骤后:
508
+
509
+ 1. 重新直接阅读最新分析视图的受影响区域和新暴露区域。
510
+ 2. 重新统计家族数、出现次数和影响范围。
511
+ 3. 新增新暴露模式。
512
+ 4. 合并重复项。
513
+ 5. 修正误判、证据层级和依赖。
514
+ 6. 重新计算优先级。
515
+
516
+ 不得自动沿用旧排序。除确认存在的字符串隐藏是首个语义推荐外,本 Skill 没有固定的类型处理顺序。