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.
- package/cordis.patch.yml +14 -0
- package/index.js +61 -0
- package/package.json +20 -0
- package/skills/iv8-env-runtime/SKILL.md +159 -0
- package/skills/iv8-env-runtime/assets/entry-report-template.txt +23 -0
- package/skills/iv8-env-runtime/assets/env_starter.py +100 -0
- package/skills/iv8-env-runtime/references/case-function-iwencai.md +96 -0
- package/skills/iv8-env-runtime/references/case-intercept-douyin.md +133 -0
- package/skills/iv8-env-runtime/references/config-defaults-cheatsheet.md +75 -0
- package/skills/iv8-env-runtime/references/cross-platform-install.md +108 -0
- package/skills/iv8-env-runtime/references/iv8-api-contract.md +97 -0
- package/skills/iv8-env-runtime/references/network-and-eventloop.md +113 -0
- package/skills/iv8-env-runtime/references/part1-entry-location.md +138 -0
- package/skills/iv8-env-runtime/references/part1-mcp-tool-map.md +77 -0
- package/skills/iv8-env-runtime/references/part2-discovery.md +80 -0
- package/skills/iv8-env-runtime/references/patching-principles.md +91 -0
- package/skills/iv8-env-runtime/references/trap-blacklist.md +60 -0
- package/skills/iv8-env-runtime/references/version-gotchas.md +128 -0
- package/skills/iv8-env-runtime/scripts/consistency_lint.py +211 -0
- package/skills/iv8-env-runtime/scripts/defaults_audit.py +143 -0
- package/skills/iv8-env-runtime/scripts/monitor_env.py +185 -0
- package/skills/iv8-env-runtime/scripts/network_bridge.py +147 -0
- package/skills/iv8-env-runtime/scripts/parity_check.py +175 -0
- package/skills/iv8-env-runtime/scripts/preflight.py +144 -0
- package/skills/iv8-env-runtime/scripts/reproduce_stub_error.py +165 -0
- package/skills/iv8-env-runtime/scripts/run_target.py +150 -0
- package/skills/iv8-jsvmp-recovery/SKILL.md +129 -0
- package/skills/iv8-jsvmp-recovery/agents/openai.yaml +4 -0
- package/skills/iv8-jsvmp-recovery/references/case-study-douyin-a-bogus.md +320 -0
- package/skills/iv8-jsvmp-recovery/references/controlled-oracle-and-equivalence.md +247 -0
- package/skills/iv8-jsvmp-recovery/references/static-trace-evidence.md +289 -0
- package/skills/iv8-jsvmp-recovery/references/vmp-domain-model.md +212 -0
- package/skills/iv8-jsvmp-recovery/scripts/verify-equivalence.py +281 -0
- package/skills/js-ast-deobfuscation/SKILL.md +140 -0
- package/skills/js-ast-deobfuscation/agents/openai.yaml +4 -0
- package/skills/js-ast-deobfuscation/references/anti-patterns.md +325 -0
- package/skills/js-ast-deobfuscation/references/first-pass.md +255 -0
- package/skills/js-ast-deobfuscation/references/interaction-and-stopping.md +758 -0
- package/skills/js-ast-deobfuscation/references/iv8-runtime-observation.md +773 -0
- package/skills/js-ast-deobfuscation/references/jsvmp-identification.md +328 -0
- package/skills/js-ast-deobfuscation/references/methods-and-evidence.md +460 -0
- package/skills/js-ast-deobfuscation/references/patterns-and-priority.md +516 -0
- package/skills/js-ast-deobfuscation/references/validation-contract.md +604 -0
- package/skills/js-ast-deobfuscation/scripts/prepare-source.mjs +921 -0
|
@@ -0,0 +1,758 @@
|
|
|
1
|
+
# 用户交互、步骤报告与停止契约
|
|
2
|
+
|
|
3
|
+
本文规定 Agent 在解混淆过程中怎样向用户汇报、请求决策、升级动态、停止和交接。
|
|
4
|
+
|
|
5
|
+
用户只需要提供源码并说“解混淆”。用户不需要提前知道混淆类型、优先级、静态或动态路线、产物类型或 VM 边界;这些应由 Agent 阅读源码后判断并用普通语言解释。
|
|
6
|
+
|
|
7
|
+
## 目录
|
|
8
|
+
|
|
9
|
+
1. [核心交互原则](#1-核心交互原则)
|
|
10
|
+
2. [用户授权边界](#2-用户授权边界)
|
|
11
|
+
3. [稳定状态](#3-稳定状态)
|
|
12
|
+
4. [启动记录模板](#4-启动记录模板)
|
|
13
|
+
5. [准备阻塞模板](#5-准备阻塞模板)
|
|
14
|
+
6. [首轮画像摘要模板](#6-首轮画像摘要模板)
|
|
15
|
+
7. [用户方向反馈模板](#7-用户方向反馈模板)
|
|
16
|
+
8. [下一步决策卡](#8-下一步决策卡)
|
|
17
|
+
9. [静态转动态升级卡](#9-静态转动态升级卡)
|
|
18
|
+
10. [单步契约模板](#10-单步契约模板)
|
|
19
|
+
11. [单步报告模板](#11-单步报告模板)
|
|
20
|
+
12. [失败与阻塞模板](#12-失败与阻塞模板)
|
|
21
|
+
13. [关闭建议模板](#13-关闭建议模板)
|
|
22
|
+
14. [交接包模板](#14-交接包模板)
|
|
23
|
+
15. [PROGRESS.md 模板](#15-progressmd-模板)
|
|
24
|
+
16. [表达方式](#16-表达方式)
|
|
25
|
+
17. [反例](#17-反例)
|
|
26
|
+
|
|
27
|
+
## 1. 核心交互原则
|
|
28
|
+
|
|
29
|
+
1. “解混淆”已经是明确任务,不在启动前追问技术目标。
|
|
30
|
+
2. Agent 自动完成冻结、Prettier 格式化、完整直读和首轮画像。
|
|
31
|
+
3. 首轮画像前,用户不负责猜有哪些混淆或哪个优先。
|
|
32
|
+
4. Agent 先说明发现,再询问用户更关注的分析方向。
|
|
33
|
+
5. Agent 必须给出推荐及理由,不能只把技术选项甩给用户。
|
|
34
|
+
6. 每次默认只批准一个语义步骤。
|
|
35
|
+
7. 从静态升级为动态、联网、补环境、主动 Hook 或插桩时单独询问。
|
|
36
|
+
8. 每次报告区分观察事实、模型推断和待验证假设。
|
|
37
|
+
9. 停止依据是分析目的和边际收益,不是“是否还看得到难看代码”。
|
|
38
|
+
10. Agent 提议关闭,用户确认后才标记 `COMPLETE`。
|
|
39
|
+
|
|
40
|
+
以下情况才在首轮画像前询问:
|
|
41
|
+
|
|
42
|
+
- 没有提供目标文件或无法确定分析对象。
|
|
43
|
+
- 两条用户硬约束互相冲突。
|
|
44
|
+
- Prettier 安装或解析失败,且已穷尽安全的本地准备步骤。
|
|
45
|
+
- 继续会产生用户尚未授权的外部副作用。
|
|
46
|
+
|
|
47
|
+
不要在首轮画像前询问:
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
你想分析什么算法?
|
|
51
|
+
你觉得它有什么混淆?
|
|
52
|
+
要静态还是动态?
|
|
53
|
+
要不要处理 VM?
|
|
54
|
+
你想要 executable-js 还是 analysis-js?
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 2. 用户授权边界
|
|
58
|
+
|
|
59
|
+
默认模式为 `interactive`。
|
|
60
|
+
|
|
61
|
+
Agent 可以自动完成:
|
|
62
|
+
|
|
63
|
+
- 只读查看目录和文档。
|
|
64
|
+
- 冻结原始输入并计算 hash。
|
|
65
|
+
- 在案例工作区本地准备 Node Prettier。
|
|
66
|
+
- 生成格式化派生副本。
|
|
67
|
+
- 连续区间阅读完整格式化源码。
|
|
68
|
+
- 运行只读搜索、AST 统计和语法检查。
|
|
69
|
+
- 建立当前可见模式清单、依赖和优先级。
|
|
70
|
+
- 为下一步提出 static、dynamic、hybrid 或 blocked 判断。
|
|
71
|
+
- 验证用户已经批准的步骤。
|
|
72
|
+
|
|
73
|
+
Agent 不得自动进入下一个语义 transform。
|
|
74
|
+
|
|
75
|
+
用户回复:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
按推荐做
|
|
79
|
+
继续
|
|
80
|
+
你来判断
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
默认只批准当前推荐的一个低风险步骤,不表示切换为全自动。
|
|
84
|
+
|
|
85
|
+
`batch` 需要明确边界,例如:
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
允许连续完成字符串恢复和确定性常量折叠;
|
|
89
|
+
遇到动态、删除、控制流或重命名时停止。
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`autonomous` 只有用户明确要求时启用。即使启用,遇到以下情况仍须停止:
|
|
93
|
+
|
|
94
|
+
- 执行不可信完整目标。
|
|
95
|
+
- 真实网络、账号、Cookie、凭据或浏览器状态。
|
|
96
|
+
- 主动 Hook、环境修改或插桩。
|
|
97
|
+
- 高风险删除或控制流重写。
|
|
98
|
+
- VM 内部分析。
|
|
99
|
+
- 新外部权限。
|
|
100
|
+
- 证据冲突或验证失败。
|
|
101
|
+
|
|
102
|
+
## 3. 稳定状态
|
|
103
|
+
|
|
104
|
+
对外检查点只使用以下状态:
|
|
105
|
+
|
|
106
|
+
| 状态 | 含义 |
|
|
107
|
+
| --- | --- |
|
|
108
|
+
| `FORMAT_BLOCKED` | Prettier 准备或解析失败,尚未完成源码画像 |
|
|
109
|
+
| `READY_FOR_USER_DECISION` | 画像或一步已验收,或者风险/证据路线需要用户重新选择 |
|
|
110
|
+
| `STEP_STOPPED` | 当前步骤失败或前提不成立,保留上一个通过版本 |
|
|
111
|
+
| `BLOCKED_CURRENT` | 当前候选缺证据或运行条件,仍可考虑其他候选 |
|
|
112
|
+
| `READY_FOR_HANDOFF` | 剩余问题超出 AST 边界,等待用户决定交接 |
|
|
113
|
+
| `READY_FOR_USER_CLOSURE` | 当前深度已有有用成果,等待用户确认结束 |
|
|
114
|
+
| `COMPLETE` | 用户已经确认结束 |
|
|
115
|
+
|
|
116
|
+
进行中的准备、画像和 transform 写入 `current_phase`,不要为它们另造对外完成状态。
|
|
117
|
+
|
|
118
|
+
## 4. 启动记录模板
|
|
119
|
+
|
|
120
|
+
启动记录用于 `PROGRESS.md`,通常不需要先发问题给用户。
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
# Start
|
|
124
|
+
|
|
125
|
+
## User Request
|
|
126
|
+
|
|
127
|
+
用户原话:
|
|
128
|
+
|
|
129
|
+
## Analysis Object
|
|
130
|
+
|
|
131
|
+
- original path:
|
|
132
|
+
- original size:
|
|
133
|
+
- original sha256:
|
|
134
|
+
- workspace:
|
|
135
|
+
|
|
136
|
+
## Safe Defaults
|
|
137
|
+
|
|
138
|
+
- mode: interactive
|
|
139
|
+
- default output: analysis-js
|
|
140
|
+
- original file: read-only
|
|
141
|
+
- runtime execution: not authorized
|
|
142
|
+
- network: not authorized
|
|
143
|
+
- VM internal analysis: out of scope
|
|
144
|
+
|
|
145
|
+
## Automatic Preparation
|
|
146
|
+
|
|
147
|
+
- [ ] freeze original input
|
|
148
|
+
- [ ] prepare local Node Prettier
|
|
149
|
+
- [ ] generate formatted copy
|
|
150
|
+
- [ ] parse formatted copy
|
|
151
|
+
- [ ] read complete formatted source
|
|
152
|
+
- [ ] build current-visible profile
|
|
153
|
+
|
|
154
|
+
## Questions Deferred Until Profile
|
|
155
|
+
|
|
156
|
+
- downstream analysis direction
|
|
157
|
+
- desired depth
|
|
158
|
+
- first semantic step
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
如果缺少目标文件,只问一个能解除阻塞的问题:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
我还缺少要解混淆的 JavaScript 文件路径。请给出文件或目录;拿到后我会先格式化、完整阅读并汇报当前可见混淆,不要求你先判断技术路线。
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## 5. 准备阻塞模板
|
|
168
|
+
|
|
169
|
+
只在进入 `FORMAT_BLOCKED` 时使用:
|
|
170
|
+
|
|
171
|
+
```markdown
|
|
172
|
+
## 准备阶段阻塞
|
|
173
|
+
|
|
174
|
+
- 状态:`FORMAT_BLOCKED`
|
|
175
|
+
- 原始文件:
|
|
176
|
+
- 原始 sha256:
|
|
177
|
+
- 已完成:
|
|
178
|
+
- 失败位置:Node | package manager | Prettier install | Prettier parse
|
|
179
|
+
- 实际命令:
|
|
180
|
+
- 工具版本:
|
|
181
|
+
- 退出状态:
|
|
182
|
+
- 精确错误摘要:
|
|
183
|
+
- 已尝试的安全修复:
|
|
184
|
+
- 原始文件是否保持不变:是
|
|
185
|
+
- 当前不能继续的原因:
|
|
186
|
+
- 建议选择:
|
|
187
|
+
1. 提供可解析的目标或 parser 线索;
|
|
188
|
+
2. 允许按明确方案修复准备环境;
|
|
189
|
+
3. 暂停。
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
不要静默改用其他 formatter,也不要跳过格式化假装完成画像。
|
|
193
|
+
|
|
194
|
+
## 6. 首轮画像摘要模板
|
|
195
|
+
|
|
196
|
+
画像完成后先给结论,再给技术证据。
|
|
197
|
+
|
|
198
|
+
```markdown
|
|
199
|
+
## 当前源码画像
|
|
200
|
+
|
|
201
|
+
我已经完成原始文件冻结、格式化和完整阅读。
|
|
202
|
+
|
|
203
|
+
### 一句话结论
|
|
204
|
+
|
|
205
|
+
<用普通语言说明主要阅读障碍、核心依赖和推荐起点。>
|
|
206
|
+
|
|
207
|
+
### 当前可见模式
|
|
208
|
+
|
|
209
|
+
- 模式家族数:
|
|
210
|
+
- 候选出现总数:
|
|
211
|
+
- 高收益区域:
|
|
212
|
+
- 低收益或无关区域:
|
|
213
|
+
- 当前未证明的依赖:
|
|
214
|
+
|
|
215
|
+
| ID | 当前可见结构 | 出现次数与范围 | 它阻碍什么 | 证据 | 依赖 | 证据路线 | 初步优先级 |
|
|
216
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
217
|
+
| `P-01` | | | | | | static/dynamic/hybrid/blocked | |
|
|
218
|
+
|
|
219
|
+
### 分类说明
|
|
220
|
+
|
|
221
|
+
| 类别 | 当前识别 |
|
|
222
|
+
| --- | --- |
|
|
223
|
+
| 真正混淆 | |
|
|
224
|
+
| 压缩或编译产物 | |
|
|
225
|
+
| 打包器结构 | |
|
|
226
|
+
| 第三方或 polyfill | |
|
|
227
|
+
| VM 外围 | |
|
|
228
|
+
| VM 内部,暂不处理 | |
|
|
229
|
+
|
|
230
|
+
### 模式依赖
|
|
231
|
+
|
|
232
|
+
```text
|
|
233
|
+
P-01 → 解锁 P-03、P-04
|
|
234
|
+
P-02 → 独立
|
|
235
|
+
P-05 → 需要运行事实
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### 推荐
|
|
239
|
+
|
|
240
|
+
推荐先做:`<候选>`
|
|
241
|
+
|
|
242
|
+
原因:
|
|
243
|
+
|
|
244
|
+
- 解锁范围:
|
|
245
|
+
- 当前证据:
|
|
246
|
+
- 预期收益:
|
|
247
|
+
- 风险:
|
|
248
|
+
- 本步不处理:
|
|
249
|
+
|
|
250
|
+
### 当前画像边界
|
|
251
|
+
|
|
252
|
+
这是一份“当前可见模式”清单。完成字符串恢复或其他步骤后,可能出现新结构,我会重新阅读和排序。
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
“出现次数”必须说明计数口径;模式家族数量与语法命中数量不能混为一谈。
|
|
256
|
+
|
|
257
|
+
## 7. 用户方向反馈模板
|
|
258
|
+
|
|
259
|
+
用户看到画像后,再询问分析方向。使用普通语言:
|
|
260
|
+
|
|
261
|
+
```markdown
|
|
262
|
+
## 你现在可以决定分析方向
|
|
263
|
+
|
|
264
|
+
根据当前源码,我建议 `<推荐方向>`。
|
|
265
|
+
|
|
266
|
+
你可以直接回复:
|
|
267
|
+
|
|
268
|
+
1. **按推荐继续**:先完成当前收益最高的一步;
|
|
269
|
+
2. **重点看输入、输出和外部调用**:优先建立入口与数据流;
|
|
270
|
+
3. **为后续算法或 VM 分析做准备**:优先清理外围并建立稳定坐标;
|
|
271
|
+
4. **先停在画像报告**:暂不修改分析视图。
|
|
272
|
+
|
|
273
|
+
如果你不确定,回复“按推荐继续”即可。这只批准下一步,不会自动执行完整流水线。
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
选项应根据真实源码删减为 2~3 个真正不同的方向,不机械展示全部四项。
|
|
277
|
+
|
|
278
|
+
## 8. 下一步决策卡
|
|
279
|
+
|
|
280
|
+
每次只展示少量高价值选择:
|
|
281
|
+
|
|
282
|
+
```markdown
|
|
283
|
+
## 当前状态
|
|
284
|
+
|
|
285
|
+
- 状态:`READY_FOR_USER_DECISION`
|
|
286
|
+
- 已完成:
|
|
287
|
+
- 最新分析视图:
|
|
288
|
+
- 当前主要残留:
|
|
289
|
+
|
|
290
|
+
## 下一候选
|
|
291
|
+
|
|
292
|
+
### A. `<推荐项>`
|
|
293
|
+
|
|
294
|
+
- 当前要回答的问题:
|
|
295
|
+
- 已知事实:
|
|
296
|
+
- 证据缺口:
|
|
297
|
+
- 证据模式:static | dynamic | hybrid
|
|
298
|
+
- 最小方法:
|
|
299
|
+
- 执行范围:
|
|
300
|
+
- 预期收益:
|
|
301
|
+
- 风险:
|
|
302
|
+
- 本步不处理:
|
|
303
|
+
- 预计产物:
|
|
304
|
+
- 推荐理由:
|
|
305
|
+
|
|
306
|
+
### B. `<替代项>`
|
|
307
|
+
|
|
308
|
+
- 当前要回答的问题:
|
|
309
|
+
- 证据模式:
|
|
310
|
+
- 最小方法:
|
|
311
|
+
- 预期收益:
|
|
312
|
+
- 风险:
|
|
313
|
+
- 与 A 的差别:
|
|
314
|
+
|
|
315
|
+
### C. 暂停、关闭或交接
|
|
316
|
+
|
|
317
|
+
- 当前已足够支持:
|
|
318
|
+
- 继续的额外收益:
|
|
319
|
+
- 可交接方向:
|
|
320
|
+
|
|
321
|
+
## 请你决定
|
|
322
|
+
|
|
323
|
+
回复 A、B、C 或“按推荐做”。
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
不要只问“是否继续”。不要展示五六个技术名词相近的选项。
|
|
327
|
+
|
|
328
|
+
## 9. 静态转动态升级卡
|
|
329
|
+
|
|
330
|
+
用户批准静态步骤后,如果中途发现必须动态,立即暂停静态 transform。
|
|
331
|
+
|
|
332
|
+
```markdown
|
|
333
|
+
## 动态取证申请
|
|
334
|
+
|
|
335
|
+
- 状态:`READY_FOR_USER_DECISION`
|
|
336
|
+
|
|
337
|
+
### 当前静态步骤
|
|
338
|
+
|
|
339
|
+
- 用户已批准:
|
|
340
|
+
- 已完成到:
|
|
341
|
+
- 上一个通过验收的视图:
|
|
342
|
+
- 当前视图是否已覆盖:否
|
|
343
|
+
- 步骤账本:暂停,等待动态证据
|
|
344
|
+
|
|
345
|
+
### 为什么静态不足
|
|
346
|
+
|
|
347
|
+
- 静态已经证明:
|
|
348
|
+
- 唯一或有限的运行事实缺口:
|
|
349
|
+
- 该事实为什么决定当前 transform:
|
|
350
|
+
|
|
351
|
+
### 最小动态实验
|
|
352
|
+
|
|
353
|
+
- 要回答的问题:
|
|
354
|
+
- 执行目标:
|
|
355
|
+
- original sha256:
|
|
356
|
+
- 入口与前置条件:
|
|
357
|
+
- 固定输入:
|
|
358
|
+
- trigger:
|
|
359
|
+
- 观察点:
|
|
360
|
+
- 观测等级:L0 | L1 | L2 | L3 | L4
|
|
361
|
+
- iv8 / 受控 Node / 真浏览器:
|
|
362
|
+
- environment / config:
|
|
363
|
+
- time mode:
|
|
364
|
+
- event loop 策略:
|
|
365
|
+
- 是否联网:
|
|
366
|
+
- 是否使用账号、Cookie 或凭据:
|
|
367
|
+
- 是否安装 probe:
|
|
368
|
+
- 是否运行插桩副本:
|
|
369
|
+
- `runtime patched`:true | false
|
|
370
|
+
- A/B 基线:
|
|
371
|
+
- 原始日志路径:
|
|
372
|
+
- 源码映射方法:
|
|
373
|
+
|
|
374
|
+
### 风险和边界
|
|
375
|
+
|
|
376
|
+
- 可能的运行时影响:
|
|
377
|
+
- 覆盖的输入和路径:
|
|
378
|
+
- 本次明确不能证明:
|
|
379
|
+
- 成功条件:
|
|
380
|
+
- 失败后分流:
|
|
381
|
+
|
|
382
|
+
### 请你决定
|
|
383
|
+
|
|
384
|
+
1. 批准本次有限动态实验;
|
|
385
|
+
2. 不执行,改做其他静态候选;
|
|
386
|
+
3. 暂停或交接。
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
用户选择第 2 项时,把原暂停候选记为 `BLOCKED_CURRENT`,再返回其他候选;不要把“不批准动态”记成 transform 验证失败。
|
|
390
|
+
|
|
391
|
+
不要说:
|
|
392
|
+
|
|
393
|
+
```text
|
|
394
|
+
静态解不了,要不要动态?
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
要说清楚缺哪个事实、为什么需要、只执行什么。
|
|
398
|
+
|
|
399
|
+
## 10. 单步契约模板
|
|
400
|
+
|
|
401
|
+
用户批准后,回到入口文件进入对应验收阶段。不要在交互文件重复保存 hash、binding、副作用、动态证据和验收字段。
|
|
402
|
+
|
|
403
|
+
对用户只需确认:
|
|
404
|
+
|
|
405
|
+
```markdown
|
|
406
|
+
## 已批准步骤
|
|
407
|
+
|
|
408
|
+
- 当前问题:
|
|
409
|
+
- 本步会修改:
|
|
410
|
+
- 本步不处理:
|
|
411
|
+
- 证据模式与最小方法:
|
|
412
|
+
- 主要风险:
|
|
413
|
+
- 停止条件:
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
单步只处理一种明确结构,不把字符串、代理、死代码、控制流和重命名混在一起。
|
|
417
|
+
|
|
418
|
+
## 11. 单步报告模板
|
|
419
|
+
|
|
420
|
+
完整验收事实写入 validation report;对话只交付用户做下一次决策需要的摘要:
|
|
421
|
+
|
|
422
|
+
```markdown
|
|
423
|
+
## 本步结果
|
|
424
|
+
|
|
425
|
+
- 结果:完成 | 部分完成 | 失败
|
|
426
|
+
- 最新分析视图:
|
|
427
|
+
- 已证明:
|
|
428
|
+
- 修改 / 跳过 / 残留:
|
|
429
|
+
- 验收:PASS | FAIL | BLOCKED
|
|
430
|
+
- 本步现在改善了什么:
|
|
431
|
+
- 仍未证明:
|
|
432
|
+
- 下一推荐:
|
|
433
|
+
- 真正不同的替代项:
|
|
434
|
+
- 当前状态:
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
必要时链接完整报告并给一个短小的 before/after 片段。不要把内部验证账本复制进对话。
|
|
438
|
+
|
|
439
|
+
## 12. 失败与阻塞模板
|
|
440
|
+
|
|
441
|
+
### 当前步骤停止
|
|
442
|
+
|
|
443
|
+
```markdown
|
|
444
|
+
## 当前步骤已停止
|
|
445
|
+
|
|
446
|
+
- 状态:`STEP_STOPPED`
|
|
447
|
+
- 原因:
|
|
448
|
+
- 失败的前提或验证:
|
|
449
|
+
- 上一个通过版本:
|
|
450
|
+
- 原始文件是否不变:是
|
|
451
|
+
- 是否产生未通过输出:
|
|
452
|
+
- 未通过输出如何标记:
|
|
453
|
+
- 已证明:
|
|
454
|
+
- 未证明:
|
|
455
|
+
- 可选下一步:
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
不得把失败输出覆盖成最新通过视图。
|
|
459
|
+
|
|
460
|
+
### 当前候选阻塞
|
|
461
|
+
|
|
462
|
+
```markdown
|
|
463
|
+
## 当前候选暂时阻塞
|
|
464
|
+
|
|
465
|
+
- 状态:`BLOCKED_CURRENT`
|
|
466
|
+
- 候选:
|
|
467
|
+
- 相关性:
|
|
468
|
+
- 已有证据:
|
|
469
|
+
- 缺少:
|
|
470
|
+
- 解除阻塞需要:
|
|
471
|
+
- 是否需要用户新授权:
|
|
472
|
+
- 其他仍可进行的静态候选:
|
|
473
|
+
- 推荐:
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
一个候选 blocked 不等于整个 Skill blocked。先继续评估其他静态候选。
|
|
477
|
+
|
|
478
|
+
## 13. 关闭建议模板
|
|
479
|
+
|
|
480
|
+
Agent 只能建议关闭:
|
|
481
|
+
|
|
482
|
+
```markdown
|
|
483
|
+
## AST 解混淆关闭建议
|
|
484
|
+
|
|
485
|
+
- 状态:`READY_FOR_USER_CLOSURE`
|
|
486
|
+
|
|
487
|
+
### 用户请求与当前深度
|
|
488
|
+
|
|
489
|
+
- 用户原始请求:
|
|
490
|
+
- 画像后选择的方向:
|
|
491
|
+
- 当前约定深度:
|
|
492
|
+
|
|
493
|
+
### 已经完成
|
|
494
|
+
|
|
495
|
+
- 已证明:
|
|
496
|
+
- 已处理的主要隐藏层:
|
|
497
|
+
- 最新分析视图:
|
|
498
|
+
- 可稳定定位的入口、数据流或边界:
|
|
499
|
+
|
|
500
|
+
### 仍然存在
|
|
501
|
+
|
|
502
|
+
| 残留 | 分类 | 为什么未处理 | 影响 |
|
|
503
|
+
| --- | --- | --- | --- |
|
|
504
|
+
| | low-value / blocked / handoff / unrelated | | |
|
|
505
|
+
|
|
506
|
+
### 为什么现在建议停止
|
|
507
|
+
|
|
508
|
+
- 当前成果已经支持:
|
|
509
|
+
- 下一步边际收益:
|
|
510
|
+
- 下一步成本或风险:
|
|
511
|
+
|
|
512
|
+
### 你可以选择
|
|
513
|
+
|
|
514
|
+
1. 确认结束 AST 阶段;
|
|
515
|
+
2. 继续一个明确的可选步骤;
|
|
516
|
+
3. 交接算法、动态运行、补环境、真实浏览器或 VM 分析。
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
只有用户确认第 1 项,才写:
|
|
520
|
+
|
|
521
|
+
```text
|
|
522
|
+
status: COMPLETE
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
如果用户没有确认,保持 `READY_FOR_USER_CLOSURE`。
|
|
526
|
+
|
|
527
|
+
## 14. 交接包模板
|
|
528
|
+
|
|
529
|
+
进入 `READY_FOR_HANDOFF` 时:
|
|
530
|
+
|
|
531
|
+
```markdown
|
|
532
|
+
# AST Deobfuscation Handoff
|
|
533
|
+
|
|
534
|
+
## Handoff Direction
|
|
535
|
+
|
|
536
|
+
algorithm | iv8 runtime | environment completion | real browser/CDP | VM
|
|
537
|
+
|
|
538
|
+
## Why Handoff
|
|
539
|
+
|
|
540
|
+
- AST 已经完成到:
|
|
541
|
+
- 继续需要的能力:
|
|
542
|
+
- 为什么不属于当前 Skill:
|
|
543
|
+
|
|
544
|
+
## Source Artifacts
|
|
545
|
+
|
|
546
|
+
| Role | Path | SHA-256 | Notes |
|
|
547
|
+
| --- | --- | --- | --- |
|
|
548
|
+
| original | | | read-only runtime target |
|
|
549
|
+
| formatted | | | reading view |
|
|
550
|
+
| latest analysis | | | |
|
|
551
|
+
| annotated/pseudocode | | | optional |
|
|
552
|
+
|
|
553
|
+
## Proven Facts
|
|
554
|
+
|
|
555
|
+
## Inference
|
|
556
|
+
|
|
557
|
+
## Open Questions
|
|
558
|
+
|
|
559
|
+
## Stable Coordinates
|
|
560
|
+
|
|
561
|
+
| ID | Role | Original Location | Analysis Location | Evidence |
|
|
562
|
+
| --- | --- | --- | --- | --- |
|
|
563
|
+
| | entry/binding/slot/host boundary/output | | | |
|
|
564
|
+
|
|
565
|
+
## Runtime Material
|
|
566
|
+
|
|
567
|
+
- environment/config:
|
|
568
|
+
- input:
|
|
569
|
+
- init order:
|
|
570
|
+
- trigger:
|
|
571
|
+
- probe:
|
|
572
|
+
- instrumented copy:
|
|
573
|
+
- raw logs:
|
|
574
|
+
- netLog:
|
|
575
|
+
- runtime patched:
|
|
576
|
+
- A/B result:
|
|
577
|
+
- covered paths:
|
|
578
|
+
|
|
579
|
+
## VM Boundary, If Applicable
|
|
580
|
+
|
|
581
|
+
- loader:
|
|
582
|
+
- interpreter entry:
|
|
583
|
+
- public init:
|
|
584
|
+
- host bindings:
|
|
585
|
+
- data/bytecode region:
|
|
586
|
+
- explicitly not analyzed:
|
|
587
|
+
|
|
588
|
+
## Recommended First Question for Next Stage
|
|
589
|
+
|
|
590
|
+
## Risks and Non-Conclusions
|
|
591
|
+
|
|
592
|
+
## User Decision
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
交接不是失败。它表示剩余问题需要另一种能力。
|
|
596
|
+
|
|
597
|
+
## 15. PROGRESS.md 模板
|
|
598
|
+
|
|
599
|
+
`PROGRESS.md` 是项目账本,必须让新 Agent 不依赖聊天记录即可继续。
|
|
600
|
+
|
|
601
|
+
```markdown
|
|
602
|
+
# Deobfuscation Progress
|
|
603
|
+
|
|
604
|
+
## Current Checkpoint
|
|
605
|
+
|
|
606
|
+
- status:
|
|
607
|
+
- current_phase:
|
|
608
|
+
- updated_at:
|
|
609
|
+
- user mode: interactive | batch | autonomous
|
|
610
|
+
- approved scope:
|
|
611
|
+
- waiting for:
|
|
612
|
+
|
|
613
|
+
## User Intent
|
|
614
|
+
|
|
615
|
+
- original request:
|
|
616
|
+
- constraints:
|
|
617
|
+
- direction chosen after profile:
|
|
618
|
+
- current working objective:
|
|
619
|
+
|
|
620
|
+
## Input Freeze
|
|
621
|
+
|
|
622
|
+
- original path:
|
|
623
|
+
- size:
|
|
624
|
+
- sha256:
|
|
625
|
+
- read-only confirmed:
|
|
626
|
+
|
|
627
|
+
## Preparation
|
|
628
|
+
|
|
629
|
+
- Node version:
|
|
630
|
+
- package manager:
|
|
631
|
+
- Prettier version:
|
|
632
|
+
- lockfile:
|
|
633
|
+
- formatter command:
|
|
634
|
+
- parser/config:
|
|
635
|
+
- formatted path:
|
|
636
|
+
- formatted sha256:
|
|
637
|
+
- parse result:
|
|
638
|
+
- complete-reading coverage:
|
|
639
|
+
|
|
640
|
+
## Current Profile
|
|
641
|
+
|
|
642
|
+
- current-visible family count:
|
|
643
|
+
- counting rule:
|
|
644
|
+
- high-value candidates:
|
|
645
|
+
- dependencies:
|
|
646
|
+
- blocked candidates:
|
|
647
|
+
- skipped regions:
|
|
648
|
+
|
|
649
|
+
| ID | Pattern | Count/Scope | Evidence | Priority | Classification | Status |
|
|
650
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
651
|
+
| | | | | | | |
|
|
652
|
+
|
|
653
|
+
## Artifact Ledger
|
|
654
|
+
|
|
655
|
+
| Role | Path | SHA-256 | Type | Passed | Notes |
|
|
656
|
+
| --- | --- | --- | --- | --- | --- |
|
|
657
|
+
| original | | | original | yes | read-only |
|
|
658
|
+
| formatted | | | analysis-js | | |
|
|
659
|
+
| current | | | analysis-js | | |
|
|
660
|
+
|
|
661
|
+
## Step Ledger
|
|
662
|
+
|
|
663
|
+
| Step | User Approval | Question | Evidence Mode | Input | Output | Validation | Status |
|
|
664
|
+
| --- | --- | --- | --- | --- | --- | --- | --- |
|
|
665
|
+
| | | | | | | | |
|
|
666
|
+
|
|
667
|
+
## Runtime Evidence Ledger
|
|
668
|
+
|
|
669
|
+
| ID | Question | Level | Target SHA | Trigger/Probe | Patched | A/B | Coverage | Mapping |
|
|
670
|
+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
671
|
+
| | | | | | | | | |
|
|
672
|
+
|
|
673
|
+
## Validation Facts
|
|
674
|
+
|
|
675
|
+
## Proven Facts
|
|
676
|
+
|
|
677
|
+
## Inference
|
|
678
|
+
|
|
679
|
+
## Open Hypotheses
|
|
680
|
+
|
|
681
|
+
## Residual and Classification
|
|
682
|
+
|
|
683
|
+
## Last User Decision
|
|
684
|
+
|
|
685
|
+
## Next Recommended Action
|
|
686
|
+
|
|
687
|
+
## Handoff or Closure Readiness
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
每一步后更新:
|
|
691
|
+
|
|
692
|
+
- 当前状态和阶段。
|
|
693
|
+
- 新增产物及 hash。
|
|
694
|
+
- 用户批准范围。
|
|
695
|
+
- 画像、计数、依赖和优先级。
|
|
696
|
+
- 验证事实。
|
|
697
|
+
- 动态证据和覆盖范围。
|
|
698
|
+
- 下一推荐动作。
|
|
699
|
+
|
|
700
|
+
## 16. 表达方式
|
|
701
|
+
|
|
702
|
+
面向用户时:
|
|
703
|
+
|
|
704
|
+
- 先说结果,再说证据。
|
|
705
|
+
- 使用“它阻碍了什么”解释技术结构。
|
|
706
|
+
- 明确推荐,不要求用户理解 AST 术语后才能选择。
|
|
707
|
+
- 每个选项说明收益、风险和不处理范围。
|
|
708
|
+
- 把事实、推断和假设分开。
|
|
709
|
+
- 大报告写入文件,对话只给摘要和下一决策。
|
|
710
|
+
|
|
711
|
+
推荐表达:
|
|
712
|
+
|
|
713
|
+
```text
|
|
714
|
+
我看到 4 类当前可见结构,其中字符串索引同时阻碍入口和调用关系,且静态证据足够,因此建议先恢复它。本步不执行目标代码,也不处理 VM。
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
避免表达:
|
|
718
|
+
|
|
719
|
+
```text
|
|
720
|
+
发现字符串池、代理函数、控制流平坦化和 JSVMP,你想先搞哪个?
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
## 17. 反例
|
|
724
|
+
|
|
725
|
+
### 启动反例
|
|
726
|
+
|
|
727
|
+
- 还没看源码就让用户描述混淆类型。
|
|
728
|
+
- 把“解混淆”当成目标不明确。
|
|
729
|
+
- 首轮画像前让用户选择 static 或 dynamic。
|
|
730
|
+
|
|
731
|
+
### 决策反例
|
|
732
|
+
|
|
733
|
+
- 只问“继续吗”。
|
|
734
|
+
- 不给推荐,让用户从十个 AST 名词中选择。
|
|
735
|
+
- 用户批准一步后自动执行整条流水线。
|
|
736
|
+
- 把“你来判断”解释成永久自动授权。
|
|
737
|
+
|
|
738
|
+
### 动态反例
|
|
739
|
+
|
|
740
|
+
- 静态处理中静默执行完整目标。
|
|
741
|
+
- 不写事实缺口,只说“静态解不了”。
|
|
742
|
+
- 不记录 target hash、trigger、probe、环境和覆盖路径。
|
|
743
|
+
- 把 wrapper 称为零侵入。
|
|
744
|
+
- 用一次运行证明全部输入。
|
|
745
|
+
|
|
746
|
+
### 报告反例
|
|
747
|
+
|
|
748
|
+
- 只给修改行数,不解释分析收益。
|
|
749
|
+
- 混合事实、推断和假设。
|
|
750
|
+
- 失败输出覆盖上一个通过版本。
|
|
751
|
+
- 省略 skipped、residual 和验证失败。
|
|
752
|
+
|
|
753
|
+
### 停止反例
|
|
754
|
+
|
|
755
|
+
- 因仍有短变量而拒绝停止。
|
|
756
|
+
- 因分析视图不可运行而拒绝交接。
|
|
757
|
+
- 自动将 `READY_FOR_USER_CLOSURE` 改为 `COMPLETE`。
|
|
758
|
+
- 把 VM 交接写成 AST 解混淆失败。
|