Files
reverse-skill/skills/reverse-engineering/references/re-agent-workflow.md
T
yhc e489f9ad6a
CI / routing tests (ubuntu-latest) (push) Canceled after 0s
CI / routing tests (windows-latest) (push) Canceled after 0s
CI / shell script syntax check (push) Canceled after 0s
CI / field-journal leak scan (push) Canceled after 0s
CI / case contract test (ctf-demo) (push) Canceled after 0s
CI / version consistency (push) Canceled after 0s
fix(verify): run #77 anchors before fail gate; strip BEL in links
Move ADF/BSC assertions out of Write-Host string so they update $fail.
Use Ok/Bad + Test-Path/Get-Content (no phantom Assert-File*).
Assert re-agent-workflow hooks blindspot cookbook.
Remove ASCII BEL from ADF/workflow markdown link labels.
2026-08-15 08:58:36 +08:00

16 KiB
Raw Blame History

RE Agent 工作流门闩(静态↔动态)

来源启发:binary-re 阶段划分、社区 RE skill(Frida/r2/Ghidra/IDA 循环)、Cerberus 三头环(静/动/插桩)
Issue #65 增量:IAT 修复铁律、六阶段映射、.NET/DLL·SYS 等价路径;用户指令可行性门闩;旁路补丁 6–10;反调试/混淆菜谱 A–T;非 PE 多格式菜谱 U–AV(2026-08-12)
适用:reverse-engineering/、ida-reverse/、radare2/、malware-analysis/、与 cre 角色交接

0. 启动

□ scope.md:offline 样本路径 或 授权设备/靶机
□ tool-index:file/strings/r2/ida/frida 等实际路径
□ 角色:cre(ops/role-map)

0.5 用户指令可行性门闩(Issue #65)

原则:服从用户目标,不盲从用户步骤顺序。跳步前必须说明前提并请确认;确认后的强制步骤必须做,且诚实标注 Evidence 质量。

情况 Agent MUST
用户要做 X,且当前状态可得到有效 Evidence 执行 X,更新 Evidence
用户要做 X,但存在已知阻塞前提(例:已判定加壳且静态 IAT 不可读) 禁止假装完成有意义的 IAT;① 一句话说清阻塞;② 给出推荐顺序(先脱壳/修 IAT,或直接动态抓 API);③ 请用户确认是「仍强制看当前花表」还是「按推荐顺序」
用户明确强制当前步骤(如未脱壳也要看 IAT) 执行并记 Evidence,MUST 标注 quality=unreadable / packed(或等价);禁止据此下「无网络能力」等结论
用户接受推荐顺序 先做前提步骤;完成后自动或再应要求做 X;禁止用前提步骤(如脱壳)冒充「已完成导入表检查」

与「重做 X」的关系:重做 X 仍 = 重做被点名步骤(或其经确认的合法前提协商结果),禁止偷换成无关步骤。脱壳是导入表的前提,不是导入表的替代品。

典型冲突:用户在加壳样本上说「先不要脱壳,先看导入表」→ 壳常篡改导入目录/加密描述符,静态表花且无意义 → 走本表「阻塞前提」行,不得默默脱壳冒充,也不得默默交出花表当完成。

1. Triage(5–15 分钟 · 强制起点)

□ 计算样本 Hash(MD5/SHA256)→ 唯一 ID
□ 识别文件类型:EXE / DLL / SYS / ELF / Mach-O / .NET / 脚本(bat/ps1/vba) / JS / APK 等
□ 非 PE/脚本/APK/驱动专项:见 §3.4 与 `references/nonpe-format-cookbook.md`(U–AV)
□ file / DIE / 熵 / 壳特征(PEiD / DIE / Exeinfo 等)
□ 架构:x86 / x64 / ARM;编译语言线索(VC++ / Delphi / .NET / Go / Rust)
□ 加壳类型线索:UPX / ASPack / VMProtect / Themida / 未知混淆
□ strings / rabin2 -z 捡漏
□ MUST 导入/导出锚点(见下方「导入表硬门与等价路径」);若用户抢跑且有壳 → 先走 §0.5
□ 产出:E-triage(MUST 含 imports 或等价锚点分类摘要,含 quality 标注如适用)+ 假设清单

阶段门闩(Triage → Static/Dynamic):E-triage 中未记录 imports 或 合法等价锚点摘要前,MUST NOT 进入 Dynamic(除非已记录 IAT 修复失败并选择动态旁路,见 §1.2),也 MUST NOT 声称「基础分诊完成」。解析失败时仍 MUST 把失败输出写入 Evidence,不得跳过。用户要求「重做导入表检查」时 MUST 重做 imports/等价步骤本身(或先完成 §0.5 协商后的前提),禁止改换其他分析步骤冒充。

1.1 导入表硬门与等价路径

样本类型 MUST 锚点(Evidence) 说明
原生 PE/ELF/Mach-O(IAT 可读) E-imports / E-triage-imports:导入分类摘要 rabin2 -i / IDA imports / 等价
DLL / SYS / 共享库 并列 E-imports + E-exports(rabin2 -i + rabin2 -E) 导出表优先级等同导入表(对外入口)
.NET 托管(无传统 IAT) 等价路径:dnSpy/IL/元数据/程序集引用与敏感 API 摘要 → 仍写入 E-imports 或 E-triage-imports 语义槽 禁止 因「没有 IAT」而空过硬门;dnSpy 查看 = 原生「查导入表」
导入表解析失败 / 为空 / 加壳花表 仍记失败或花表输出为 Evidence,并标 quality 不得静默跳过;花表不得支撑能力否定结论

干净导入表警告(MUST 提醒):若导入表「过干净」(仅 kernel32/ntdll 等基础 DLL、几乎无业务 API),高度怀疑 LoadLibrary + GetProcAddress 动态加载 → 在 Evidence 注明嫌疑,并 SHOULD 转入 Dynamic 抓取内存 API;不得仅凭静态 IAT 宣称「无网络/无文件能力」。

高危 API 组合(补丁 8 · SHOULD):导入表过长时,优先输出恶意组合聚类,过滤纯系统基础调用。示例(非穷尽):

  • 高危簇:FindWindowA/W + WriteProcessMemory + CreateRemoteThread(注入)
  • 高危簇:CryptEncrypt / CryptAcquireContext + 大量 FindFirstFile / DeleteFile(勒索倾向)
  • 高危簇:InternetOpen / WinHttp / URLDownloadToFile + 持久化 API(RegSetValue / CreateService)
  • 单独 CreateFile / ReadFile 等多为良性噪声,除非与上簇共现

1.2 脱壳与 IAT 处理(高风险分岔 · Issue #65)

分支 A:无壳 / .NET 托管
  → 直接进入 §2 Static(.NET 走等价锚点)

分支 B:有壳 / 强混淆
  Step 1:尝试脱壳(自动脱壳机 / 手动找 OEP)— 须在授权与隔离环境
  Step 2:尝试修复 IAT
    工具:x86 → ImportREC(或等价);x64 → Scylla(或等价)。禁止 64 位样本死磕 ImportREC。
    情况 B1:修复成功且可解析 → 记 E-imports(修复后)→ §2 Static
    情况 B2:ImportREC/Scylla 报错、修复后无法运行、或 IAT 全乱码(VMP/加密壳)
      → 【IAT 修复铁律】立即终止继续静态 IAT 修复
      → MUST 记录 E-iat-repair-fail(命令、工具、失败现象、决定转动态)
      → 直接进入 §3 Dynamic:API 断点 / 硬件执行断点 / 内存搜索抓取导入
      → 这不算「跳过导入表」:导入表路径已尝试并记 Evidence
    情况 B3(补丁 6):脱壳并修 IAT 后双击闪退 / 蓝屏(疑文件 CRC/大小自校验)
      → 放弃继续静态修文件;记 E-self-check-crash 或并入 E-iat-repair-fail
      → 转入 §3 Dynamic:对 CreateFile / GetFileSize / 哈希相关 API 下断,定位校验绕过点

IAT 修复铁律(MUST):优先尝试自动/半自动修复;一旦修复工具报错或修复后程序无法运行,立即停止在静态导入表上死磕,切换动态调试,用 API 断点(如 bp CreateFile / 关键网络 API)在运行时捕获导入函数。

2. Static(基础静态锚点 → 深挖)

工具 何时
radare2 / rabin2 快速函数/导入/字符串(imports 已在 Triage MUST 完成或已记失败旁路)
IDA / Ghidra(MCP 或 headless) 深挖、交叉引用、类型;survey 阶段复核 imports 分类
jadx / dnSpy Android / .NET
OLLVM 文档 控制流平坦化怀疑
□ 确认 E-imports / E-triage 已含导入表或等价锚点 Evidence(缺失则先补,禁止后置)
□ 若 DLL/SYS:确认 E-exports 已记录
□ 敏感 API 分组 + 高危组合聚类(补丁 8)
□ 硬编码域名/IP/URL 字符串;资源节是否藏 Payload
□ 定位关键函数(加密/校验/网络/授权)→ 地址/符号写入 Evidence
□ 一条路不通 → 换工具(IDA↔r2↔Ghidra)
□ 时间盒(补丁 9 · SHOULD 默认):静态深挖约 15 分钟仍无关键路径 → 强制转入 §3 Dynamic(用户/任务可覆盖时长)

无 MCP 时:可用导出反编译文本再分析(对照 P4nda0s reverse-skills / IDA-NO-MCP 思路),仍写 Evidence 路径。

3. Dynamic(交叉验证循环区)

核心理念:静态提供线索 → 动态验证 → 验证卡壳 → 回静态重审(无固定唯一顺序)。

3.0 断点起手式(补丁 7 + 10 · MUST 顺序)

在用户态调试器(x64dbg 等)启动样本前,按「四级火箭」预置断点(可因架构/工具略名不同,顺序不变):

  1. TLS 回调断点(调试器 EP 之前可能已跑)
  2. 入口点 EP 断点
  3. 敏感 API 断点(如 CreateRemoteThread / 网络 / 文件写)
  4. 保底:ExitProcess / 进程退出路径断点(补丁 10)— 一旦因反调试直接退出,不急着重启;立即 dump memory,将崩溃前镜像路径写入 Evidence,供字符串/数据恢复
□ Frida / x64dbg / gdb / emulator:验证静态假设
□ 按 §3.0 预置断点后再跑;单步跟踪栈/寄存器(白盒)
□ 行为监控:沙箱 / Procmon / RegShot(黑盒)
□ IAT 修复失败 / 自校验闪退样本:硬件执行断点或内存搜索强行捕捉 API;CreateFile/GetFileSize 查 CRC
□ 反调试/反 Frida → reverse-engineering/anti-analysis
□ Android:root 检测 / SSL pinning 绕过脚本按需生成,**须在授权设备**
□ 崩溃日志驱动下一轮 hook(自适应循环)
□ 时间盒(补丁 9 · SHOULD 默认):单步跟踪约 200 条指令仍无恶意行为线索 → 强制回静态搜字符串/换锚点(可覆盖)

3.1 沙箱 / 动态无行为应急分支(MUST)

无行为或立刻退出 / 无限休眠
  → 检查反调试 / 反虚拟机例程(CPUID、高精度计时、沙箱特征等)
  → 尝试硬件断点绕过、修补检测点、或换物理机/更高保真环境
  → 将「无行为 + 疑似 anti-VM」写入 Evidence,禁止写成「样本无害」而不加条件

3.2 时间盒策略(补丁 9 · SHOULD)

阶段 默认阈值(可被用户/任务覆盖) 动作
Static 深挖无关键路径 ~15 分钟 转入 Dynamic
Dynamic 单步无进展 ~200 条指令 回 Static 字符串/交叉引用重锚
任一路径重复失败 记 Evidence 后换工具或旁路 禁止同一失败手法空转

3.3 反调试 / 混淆旁路速查(Issue #65 补丁 A–T · 高频)

完整索引与动作细节见 reverse-engineering/anti-analysis.md「Agent 响应菜谱 A–T」。此处只列 P0 必查 + 常见转场。默认 授权隔离 lab;patch/改标志位不是未授权生产动作。

触发特征 首选动作(摘要) Evidence
cpuid 后 jz/jnz(A) lab:改标志位或 patch 走真实分支;记检测点地址 E-anti-debug-cpuid
rdtsc + sub/cmp(B) bp rdtsc 或 hook 时间源;禁止无限空转等沙箱超时当「无害」 E-anti-debug-rdtsc
PEB BeingDebugged / NtGlobalFlag(K) ScyllaHide 或手改 PEB;patch 条件跳 E-anti-debug-peb
NtQueryInformationProcess DebugPort/Flags/Object(P) ScyllaHide / hook 返回值;记 class 参数 E-anti-debug-ntqip
导入极少但行为丰富 → API 哈希(N) bp GetProcAddress;哈希反查回注 IDA E-api-hash
strings 空但有网/文件行为 → 串加密(I) 找 decode 例程 xref;解密后 dump 回注 E-string-decrypt
有签名但来源可疑(F) SigCheck:有效/吊销/时间;无效不降威胁等级 E-sig-forge
标准 strings 无 IOC → 试宽字符(T) strings -el / UTF-16LE;Alt+A unicode E-wide-strings
调试器名字符串 / Toolhelp 扫描(C) bp CreateToolhelp32Snapshot 链 E-anti-debug-procscan
AddVectoredExceptionHandler + 故意异常(D) bp VEH 注册;分析 handler E-anti-debug-veh
int3 / DR0–DR7(M) patch int3;软断点或 ScyllaHide 藏硬件 BP E-anti-debug-bp
多 PE 头/重叠节(G) 节表真实映射 + 熵;不信节名 E-pe-anomaly
文件尾 > 节总和 Overlay(J) 提取 overlay;file/熵;找加载偏移 xref E-overlay
.rsrc 异常大/高熵 RT_RCDATA(Q) 提取资源;FindResource 链 + 解密 dump E-rsrc-payload
运行时才加载 DLL(R) 查 Delay Import;bp delay-load helper E-delay-import
while+switch 星形 CFG(H) See ollvm-deobfuscation.md;插件失败则动态路径 E-cff
恒真/恒假分支(S) See ollvm / 符号执行;动态为准 E-opaque-pred
/proc/self/status TracerPid(L) Linux/ELF;hook 或 patch;Windows 主路径不强制 E-anti-debug-tracerpid

约束:绕过失败也记 Evidence;禁止把「反调试触发退出」写成「样本无害」。完整 A–T 与 P2(E 编译时间、O 花指令)见 anti-analysis 菜谱节。

3.4 非 PE / 多格式旁路(Issue #65 补丁 U–AV · 路由)

完整索引:reverse-engineering/references/nonpe-format-cookbook.md。此处只列 类型 → 入口;动作细节在 cookbook / 对应 skill。

类型 跳转 P0 Evidence 锚点(示例)
BAT/CMD cookbook §1 + malware E-batch-deobf
PowerShell cookbook §2 + malware E-ps-decode-layer-N
VBA 宏 cookbook §3 + malware E-vba-pcode
JS 强混淆 / JSVMP js-reverse + cookbook §4 E-js-vmp / E-js-deobf
SYS 驱动 kernel-driver-reverse + cookbook §5 E-driver-irp-handlers / E-driver-ioctl
DLL 侧重点 cookbook §6(AM≡A–T R) E-dll-tls-dllmain / E-exports
Android 格机/隐藏图标 apk-reverse + cookbook §7–8 E-android-wiper-* / E-android-hidden-icon-*

约束:不另起「非 PE 六阶段」;与 §3.3 A–T 分工(PE 反调试 vs 多格式)。授权 lab;格机/BYOVD/反射 = 检测取证表述。

4. Synthesis(IOC / 攻击链 / 报告)

Decision quality overlay (Issue #77)

Before closing Synthesis, apply analysis-decision-framework.md P0 checklist: R41 grounded claims, R4* validated sufficiency, R1 confidence->dynamic, R2 hypothesis exit, R43 deadlock replan (under feasibility gate), R8/R23 no default malice/IOC. Multi-module -> R50; anti-analysis effort -> R51 + A-T cookbook.

Blindspots (Rust/Go/VMP/injection/OLE/PDF/agent-meta): analysis-blindspot-cookbook.md R52-R81 — detection-oriented; not a parallel master flow.

□ Finding:算法/校验逻辑/可利用点 / 行为结论
□ Path:callflow 或 solve 步骤挂 E-*
□ IOC:网络指纹 + 主机指纹(有则表;无则 n/a+原因)
□ 报告 docs-generator(malware/apt/null/vuln overlay 按任务选型)+ 可选图
□ 可选:YARA / Snort·Suricata 规则化沉淀
□ field-journal 脱敏

5. 六阶段实战映射(Issue #65 思维导图 → 本文件)

实战阶段 本文件章节 硬门 / 铁律
1 初步快速研判 §0–§1 Triage Hash、架构、文件类型、查壳;imports/等价锚点;§0.5 指令门闩
2 脱壳与 IAT §1.2 IAT 铁律;失败/自校验闪退 → Evidence → Dynamic
3 基础静态锚点 §2 Static 高危 API 组合;时间盒 SHOULD
4 深度交叉验证 §3 Dynamic 断点四级火箭;无行为应急;时间盒;§3.3 A–T;§3.4 U–AV 类型路由
5 提取 IoC 与攻击链 §4 Synthesis IOC + Kill Chain / Path
6 归档与规则化 §4 + docs-generator / YARA 结构化报告;规则可选

6. 与「堆 RE skill 插件」的差异

  • 本包用 阶段门闩 + tool-index,不默认启用 Hex-Rays「unsafe 全自动执行」类插件
  • 动态插桩默认 offline/lab network_profile
  • IAT/导入表:尝试 + 记录 优先于「无限静态死磕」或「静默跳过」
  • 用户指令:目标优先 + 前提协商,禁止用无关步骤冒充被点名步骤