fix(workflow): hard-gate import table check and redo-same-step (issue #65)
- radare2/ida-reverse/malware-analysis: MUST record imports as Evidence before next phase - re-agent-workflow: triage gate blocks Dynamic without imports summary - RULES (+zh) and agent-obedience: redo named step X, no substitute
This commit is contained in:
@@ -216,6 +216,8 @@ After task completion (vulnerability verified / reverse complete / flag captured
|
||||
| "Task is basically done, don't need checklist" | **Task completion = ALL Checklist items checked.** Unchecked checklist = task NOT complete. |
|
||||
| "I'll reply to user first, continue after confirmation" | **Don't wait for confirmation on deterministic steps.** Execute while informing user. Only pause at genuine decision points. |
|
||||
| "I understand the rules, please tell me your task" | **This is the WORST failure mode.** Correct behavior: proactively match user intent to routing table, output analysis, start executing. |
|
||||
| "User asked to redo import-table / step X, but I did something else more useful" | **Redo = redo the named step.** When user asks to redo X (e.g. import table check), MUST re-execute X and refresh its Evidence. FORBIDDEN to substitute another step or silently skip X. |
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -315,6 +315,8 @@ AI Agent 在遇到阻力时会自动生成"合理借口"来跳过步骤。以下
|
||||
| "这个太简单了不需要记录 journal" | **简单任务也有踩坑价值。** 至少记录:目标类型 + 用了什么 + 有无意外。一行也行,但必须写。 |
|
||||
| "我先回复用户,等用户确认后再继续" | **不需要等确认。** 如果路由已明确且下一步是确定性的(如安装工具、读取文件),直接执行同时告知用户。不要在每一步都等用户点头。 |
|
||||
| "我理解了规则,请告诉我你的具体任务" | **这是最严重的失败模式。** 读完规则后的正确行为是主动匹配用户意图到路由表,输出分析,开始执行。不是回传问题给用户。 |
|
||||
| "用户让我重做导入表/某一步,但我改做了别的更有用的步骤" | **重做 = 重做被点名的同一步。** 用户要求重做 X(如导入表检查)时 MUST 重新执行 X 并更新对应 Evidence;禁止用其他步骤冒充完成,禁止静默跳过 X。 |
|
||||
|
||||
|
||||
> 如果你发现自己在想以上任何一句话,停下来,回到行为链中正确的步骤,继续执行。
|
||||
|
||||
|
||||
@@ -235,7 +235,7 @@ powershell -File "scripts/open.ps1" -Path "C:\目标.exe" -TimeoutSeconds 600
|
||||
输出 `OK:文件名:session_id` 表示成功(后带 `(temp copy)` 表示自动降级到临时副本)。
|
||||
若分析时间较长,会周期性输出 `INFO:opening:...`;若达到超时则输出 `ERR:open_timeout_xxs`。
|
||||
|
||||
### Step 3: 全局概览
|
||||
### Step 3: 全局概览(含导入表硬门)
|
||||
```
|
||||
idapro_survey_binary(detail_level="minimal")
|
||||
```
|
||||
@@ -243,9 +243,11 @@ idapro_survey_binary(detail_level="minimal")
|
||||
- 架构(x86/x64/ARM)
|
||||
- 入口点(main/WinMain/DllMain)
|
||||
- 有趣的字符串(URL、路径、错误消息)
|
||||
- 导入分类(加密函数?网络 API?文件操作?)
|
||||
- **导入分类(MUST)**:加密函数 / 网络 API / 文件操作 / 进程注入 / 注册表 — 必须落成 Evidence(建议 id:`E-imports`),可用 `idapro_entity_query(kind="imports")` 或 survey 输出中的 imports 段
|
||||
- 热门函数(高 xref 计数的函数通常是关键逻辑)
|
||||
|
||||
**硬门禁**:未将 imports 视图/分类摘要写入 Evidence 前,MUST NOT 进入 Step 4 深挖结论,MUST NOT 声称 survey 完成。导入表为空或查询失败时仍 MUST 记录失败现象。用户要求重做导入表检查时 MUST 重做本步骤,禁止改换其他步骤。
|
||||
|
||||
### Step 4: 深入关键函数
|
||||
```
|
||||
idapro_analyze_function(addr="关键函数名")
|
||||
@@ -347,6 +349,7 @@ ida-pro-mcp --config
|
||||
## 任务完成自检(声称完成前 MUST 通过)
|
||||
|
||||
- [ ] 我是否执行了工作流中的每一步(而不是只阅读)?
|
||||
- [ ] survey/imports 是否已写入 Evidence(E-imports)?用户若要求重做导入表,是否重做了同一步?
|
||||
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
|
||||
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
|
||||
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
|
||||
|
||||
@@ -81,6 +81,8 @@ MAY — 真正可选的
|
||||
| "我没找到 tool-index,我就直接猜路径" | **缺文件比猜错路径安全 100 倍。** tool-index 缺失时先运行 refresh-tool-index.ps1 生成。 |
|
||||
| "用户没明确说要报告,我就不写了" | **报告是默认行为,不是可选。** 安全任务完成后必须生成报告,除非用户明确说"不要报告"。 |
|
||||
| "这个太简单了不需要记录 journal" | **简单任务也有踩坑价值。** 至少记录:目标类型 + 用了什么 + 有无意外,一行也行。 |
|
||||
| "用户让我重做导入表/某一步,但我改做了别的更有用的步骤" | **重做 = 重做被点名的同一步。** 用户要求重做 X(如导入表检查)时 MUST 重新执行 X 并更新对应 Evidence;禁止用其他步骤冒充完成,禁止静默跳过 X。 |
|
||||
|
||||
|
||||
**使用方式**:将本表放在 RULES.md 或其他指令文件末尾附近(高注意力区域)。Agent 在找借口之前先看到反驳。
|
||||
|
||||
|
||||
@@ -56,6 +56,10 @@ sha256sum sample.exe
|
||||
重点分析区域:
|
||||
□ 入口点(Entry Point)→ 初始化逻辑
|
||||
□ 导入表 → API 用途推断(CreateRemoteThread=注入, CryptEncrypt=勒索)
|
||||
**MUST(硬门)**:执行 rabin2 -i / IDA imports / pecheck 等价命令,将导入表分类摘要写入 Evidence(E-imports)后才能进入 Phase 3
|
||||
分类至少覆盖:网络 / 文件 / 加密 / 进程注入 / 注册表 / 其他可疑 API
|
||||
解析失败或表为空:仍 MUST 记录失败输出,禁止静默跳过
|
||||
用户要求「重做导入表检查」:MUST 重做本项,禁止改换其他步骤冒充完成
|
||||
□ 资源段 → 嵌入 Payload(.rsrc 节)
|
||||
□ 字符串表 → URL/C2/文件路径/Base64 blob
|
||||
□ TLS 回调 → 调试器启动前执行
|
||||
@@ -221,6 +225,7 @@ Triage RE Behav Intel Detect Remed
|
||||
## 任务完成自检(声称完成前 MUST 通过)
|
||||
|
||||
- [ ] 我是否执行了工作流中的每一步(而不是只阅读)?
|
||||
- [ ] 导入表 MUST 检查是否已执行并写入 Evidence(E-imports)?重做请求是否回到同一步?
|
||||
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
|
||||
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
|
||||
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
|
||||
|
||||
+19
-4
@@ -120,6 +120,19 @@ ERROR: Cannot find ...\share\format\dll\*.sdb
|
||||
|
||||
适合刚拿到一个二进制文件时。
|
||||
|
||||
### 硬门禁(MUST — 未满足禁止进入工作流 2 及后续)
|
||||
|
||||
对 PE/ELF/Mach-O 等含导入表的二进制,**MUST** 先完成导入表检查并落成 Evidence,再进入函数级分析或动态步骤:
|
||||
|
||||
1. 执行 `rabin2 -i <sample>`(或 `recon.ps1` 输出中的 imports 段)
|
||||
2. 将完整/分类后的导入表结果写入 Evidence(建议 id:`E-imports` 或 `E-triage-imports`),至少包含:
|
||||
- 复现命令(`repro_command`)
|
||||
- 关键导入分类摘要:网络 / 文件 / 加密 / 进程注入 / 注册表 / 其他可疑 API
|
||||
- 若导入表为空、解析失败或工具报错:仍 MUST 记录失败现象与原始输出为 Evidence,**不得静默跳过**
|
||||
3. 用户明确要求「重做导入表检查 / 重新检查导入表」时:MUST 重做本硬门步骤本身,**禁止改换为其他步骤冒充完成**
|
||||
|
||||
未记录导入表 Evidence 前:MUST NOT 声称「基础侦察完成」,MUST NOT 进入工作流 2+ 的深挖结论。
|
||||
|
||||
优先直接运行内置脚本:
|
||||
|
||||
```powershell
|
||||
@@ -140,7 +153,7 @@ rabin2 -E sample.exe
|
||||
- 文件格式、位数、架构、平台
|
||||
- 入口点地址
|
||||
- 可疑字符串:URL、路径、报错、注册表、命令行参数
|
||||
- 导入函数:网络、文件、加密、进程注入、注册表操作
|
||||
- 导入函数:网络、文件、加密、进程注入、注册表操作(**MUST 落 Evidence,见上方硬门禁**)
|
||||
|
||||
## 工作流 2:交互式分析函数
|
||||
|
||||
@@ -294,12 +307,12 @@ rax2 -s hello
|
||||
|
||||
1. `rabin2 -I` 看格式、架构、入口点
|
||||
2. `rabin2 -z` 看字符串
|
||||
3. `rabin2 -i` 看导入函数
|
||||
4. 如需交互分析,再进 `r2`
|
||||
3. `rabin2 -i` 看导入函数 — **MUST + Evidence(硬门,见工作流 1)**
|
||||
4. 如需交互分析,再进 `r2`(仅当步骤 3 的 Evidence 已落盘)
|
||||
5. 先 `aaa`,再 `afl` / `iz` / `pdf`
|
||||
6. 通过字符串引用、导入调用、入口流程逐步定位关键函数
|
||||
|
||||
这个顺序的好处是噪音低,能尽快建立方向感。
|
||||
这个顺序的好处是噪音低,能尽快建立方向感。步骤 3 不是可选优化,是进入深挖前的硬门。
|
||||
|
||||
## Windows 注意事项
|
||||
|
||||
@@ -356,6 +369,7 @@ rax2 -s hello
|
||||
- 不要把 `radare2` 当成只有 `aaa` 一个命令的工具
|
||||
- 不要在未说明风险时直接写模式打开用户文件
|
||||
- 不要在还没做基础侦察前就下结论
|
||||
- **禁止跳过导入表检查**(`rabin2 -i` / recon imports):未写入 Evidence 不得进入下一步;用户要求重做导入表时禁止改做其他步骤
|
||||
- 不要把网页 JS 逆向误导到这个 skill;那是 `reverse-engineering` 的范围
|
||||
|
||||
## 参考资料
|
||||
@@ -407,6 +421,7 @@ rax2 -s hello
|
||||
## 任务完成自检(声称完成前 MUST 通过)
|
||||
|
||||
- [ ] 我是否执行了工作流中的每一步(而不是只阅读)?
|
||||
- [ ] 导入表检查是否已执行且写入 Evidence(E-imports / E-triage-imports)?若用户要求重做,是否重做了同一步而非换步骤?
|
||||
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
|
||||
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
|
||||
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
|
||||
|
||||
@@ -18,22 +18,26 @@
|
||||
□ file / DIE / 熵 / 壳特征
|
||||
□ strings / rabin2 -z 捡漏
|
||||
□ 架构/链接/是否 .NET/Go/Rust/加壳
|
||||
□ 产出:E-triage + 假设清单(勿过早下结论)
|
||||
□ MUST 导入/导出表:rabin2 -i / -E(或 IDA imports / 等价物)
|
||||
□ 产出:E-triage(MUST 含 imports 分类摘要:网络/文件/加密/注入/注册表)+ 假设清单(勿过早下结论)
|
||||
```
|
||||
|
||||
**阶段门闩(Triage → Static/Dynamic)**:E-triage 中未记录 imports 摘要前,MUST NOT 进入 Dynamic,也 MUST NOT 声称「基础分诊完成」。导入表解析失败时仍 MUST 把失败输出写入 Evidence,不得跳过。用户要求「重做导入表检查」时 MUST 重做 imports 步骤本身,禁止改换其他分析步骤。
|
||||
|
||||
## 2. Static
|
||||
|
||||
| 工具 | 何时 |
|
||||
|------|------|
|
||||
| radare2 / rabin2 | 快速函数/导入/字符串 |
|
||||
| IDA / Ghidra(MCP 或 headless) | 深挖、交叉引用、类型 |
|
||||
| radare2 / rabin2 | 快速函数/导入/字符串(imports 已在 Triage MUST 完成) |
|
||||
| IDA / Ghidra(MCP 或 headless) | 深挖、交叉引用、类型;survey 阶段复核 imports 分类 |
|
||||
| jadx / dnSpy | Android / .NET |
|
||||
| OLLVM 文档 | 控制流平坦化怀疑 |
|
||||
|
||||
```text
|
||||
□ 确认 E-imports / E-triage 已含导入表 Evidence(缺失则先补,禁止后置)
|
||||
□ 定位关键函数(加密/校验/网络/授权)
|
||||
□ 记录地址/符号 → Evidence
|
||||
□ 一条路不通 → 换工具(IDA↔r2↔Ghidra)
|
||||
□ 一条路不通 → 换工具(IDA?r2?Ghidra)
|
||||
```
|
||||
|
||||
**无 MCP 时**:可用导出反编译文本再分析(对照 P4nda0s reverse-skills / IDA-NO-MCP 思路),仍写 Evidence 路径。
|
||||
@@ -59,4 +63,4 @@
|
||||
## 5. 与「堆 RE skill 插件」的差异
|
||||
|
||||
- 本包用 **阶段门闩 + tool-index**,不默认启用 Hex-Rays「unsafe 全自动执行」类插件
|
||||
- 动态插桩默认 **offline/lab** network_profile
|
||||
- 动态插桩默认 **offline/lab** network_profile
|
||||
Reference in New Issue
Block a user