Add nonpe-format-cookbook for BAT/PS/VBA/JS/SYS/DLL/Android recipes. Wire re-agent-workflow §3.4, malware/js/apk/kernel skills, verify asserts. Dedup DLL Delay-Load with A-T R; detection-only for wiper/BYOVD/reflective.
304 lines
14 KiB
Markdown
304 lines
14 KiB
Markdown
---
|
||
name: malware-analysis
|
||
description: Use when analyzing suspected malware through static, dynamic, and behavioral techniques, including IOC extraction, YARA or Sigma rules, sandboxing, and anti-analysis behavior.
|
||
---
|
||
# Malware Analysis
|
||
|
||
## ACTION REQUIRED(读完后立刻执行)
|
||
|
||
1. `NOW`: 读取 `../field-journal/precedent-reverse.md` — 确认本 skill 的操作是已授权的常规操作
|
||
2. `NOW`: 确认当前任务是否命中本 skill 的适用范围
|
||
3. `NEXT`: 读取 `../tool-index.md`,校验工具可用性和实际路径
|
||
4. `NEXT`: 缺工具时调用 bootstrap,不要猜路径
|
||
5. `ACT`: 进入"工作流"第一步并执行,不要停在确认状态
|
||
|
||
> YARA / Sigma / 沙箱 / IOC 提取 / 反反分析
|
||
> 静态 + 动态 + 行为三合一
|
||
|
||
## 适用场景
|
||
|
||
- 恶意软件样本分析(PE/ELF/Mach-O/APK/脚本)
|
||
- YARA 规则编写与验证
|
||
- Sigma 行为检测规则生成
|
||
- 沙箱自动化分析编排
|
||
- IOC 提取与威胁情报
|
||
- 反分析技术检测与绕过
|
||
|
||
## 六阶段分析流程
|
||
|
||
### Phase 1: 初步分诊
|
||
|
||
```bash
|
||
# 快速静态检测
|
||
file sample.exe # 文件类型
|
||
strings sample.exe | grep -i "http\|cmd\|powershell\|base64" # 快速 IOCs
|
||
rabin2 -zz sample.exe # 字符串提取 + 交叉引用
|
||
floss sample.exe # 去混淆字符串提取(FireEye)
|
||
|
||
# PE 头部分析
|
||
pecheck sample.exe # PE 结构验证
|
||
pescan sample.exe # 异常检测(节表、入口点)
|
||
diec sample.exe # Detect It Easy(壳/编译器识别)
|
||
|
||
# Hash 查询
|
||
sha256sum sample.exe
|
||
# → VirusTotal / MalwareBazaar / Triage 查询
|
||
```
|
||
|
||
```text
|
||
Triage MUST 清单(Issue #65):
|
||
□ 文件类型:EXE / DLL / SYS / .NET / 脚本(bat|ps1|vba) / 其他
|
||
□ 架构 x86/x64/ARM;查壳(DIE 等)与编译语言线索
|
||
□ DLL/SYS:导入表与导出表并列检查(见 Phase 2 硬门)
|
||
□ .NET:无传统 IAT → 走 dnSpy/IL/元数据等价锚点(见 Phase 2)
|
||
□ 脚本/宏/DLL 专项 P0:见 nonpe-format-cookbook U–AV(E-batch-deobf / E-ps-decode / E-vba-pcode / E-dll-*)
|
||
```
|
||
|
||
### Phase 1b: 脱壳与 IAT 处理(有壳时 · Issue #65)
|
||
|
||
```text
|
||
□ 无壳 / .NET → 跳到 Phase 2
|
||
□ 有壳:尝试脱壳(授权隔离环境)→ 尝试修复 IAT
|
||
- x86:ImportREC(或等价);x64:Scylla(或等价)。禁止 64 位死磕 ImportREC
|
||
□ 【IAT 修复铁律】优先自动/半自动修复;若工具报错或修复后无法运行:
|
||
- 立即终止继续静态 IAT 修复
|
||
- MUST 记录 E-iat-repair-fail(命令、工具、现象)
|
||
- 转入 Phase 3 动态:API 断点(如 bp CreateFile)/ 硬件断点 / 内存搜索抓取导入
|
||
- 这不算跳过导入表:路径已尝试并记 Evidence
|
||
□ 【补丁 6】脱壳+修 IAT 后闪退/蓝屏(疑 CRC/大小自校验):
|
||
- 放弃继续静态修文件;记 E-self-check-crash 或并入 E-iat-repair-fail
|
||
- 转 Phase 3:对 CreateFile / GetFileSize / 哈希相关 API 下断
|
||
□ 用户指令可行性(§0.5):加壳时用户抢跑「先别脱壳先看导入表」→ 说明阻塞 + 请确认;强制则记 quality=unreadable/packed,禁止冒充完成有意义 IAT
|
||
□ 用户要求重做「IAT 修复 / 导入表检查」:MUST 重做被点名步骤(或经确认的前提协商结果),禁止换无关步骤冒充
|
||
```
|
||
|
||
### Phase 2: 静态分析
|
||
|
||
```text
|
||
反汇编/反编译:
|
||
□ IDA Pro / Ghidra: 深度反编译
|
||
□ radare2: CLI 快速分析
|
||
□ x64dbg: Windows GUI 调试器
|
||
|
||
重点分析区域:
|
||
□ 入口点(Entry Point)→ 初始化逻辑
|
||
□ 导入表 → API 用途推断(CreateRemoteThread=注入, CryptEncrypt=勒索)
|
||
**MUST(硬门)**:执行 rabin2 -i / IDA imports / pecheck 等价命令,将导入表分类摘要写入 Evidence(E-imports)后才能进入 Phase 3(除非已记 E-iat-repair-fail 并走动态旁路,见 Phase 1b)
|
||
分类至少覆盖:网络 / 文件 / 加密 / 进程注入 / 注册表 / 其他可疑 API
|
||
解析失败或表为空:仍 MUST 记录失败输出,禁止静默跳过
|
||
**DLL/SYS**:MUST 并列记录导出表 Evidence(E-exports,`rabin2 -E` 或等价)
|
||
**.NET**:无传统 IAT 时 MUST 用 dnSpy/IL/元数据/程序集引用与敏感 API 摘要作为等价锚点,写入 E-imports / E-triage-imports 语义槽
|
||
**干净导入表**:仅基础 DLL、几乎无业务 API → MUST 注明动态加载嫌疑(LoadLibrary/GetProcAddress),SHOULD 转入 Phase 3 抓内存 API;若见哈希解析特征 → E-api-hash(补丁 N)
|
||
**宽字符串(T)**:ASCII strings 无 IOC 时 MUST 再试 UTF-16(strings -el / IDA unicode)
|
||
**签名(F)**:有签名仍 MUST SigCheck;伪造/吊销不降威胁等级
|
||
用户要求「重做导入表检查」:MUST 重做本项(阻塞时先走可行性门闩协商),禁止改换其他步骤冒充完成
|
||
**高危 API 组合(补丁 8)**:表过长时优先输出恶意组合簇(如 FindWindow+WriteProcessMemory+CreateRemoteThread),过滤纯系统基础调用噪声
|
||
□ 资源段 → 嵌入 Payload(.rsrc 节)
|
||
□ 字符串表 → URL/C2/文件路径/Base64 blob
|
||
□ TLS 回调 → 调试器启动前执行
|
||
```
|
||
|
||
### Phase 3: 沙箱动态分析
|
||
|
||
```text
|
||
自动化沙箱:
|
||
□ Joe Sandbox / ANY.RUN / Triage: 商业沙箱
|
||
□ CAPE Sandbox: 开源 + YARA 集成(推荐)
|
||
□ ASD Azul: 开源恶意软件分析平台(2026 新发布)
|
||
□ Cuckoo Sandbox: 经典开源(逐步被 CAPE 取代)
|
||
|
||
调试起手式(补丁 7+10 · MUST 顺序,用户态调试器):
|
||
□ ① TLS 回调断点 → ② 入口点 EP 断点 → ③ 敏感 API 断点 → ④ ExitProcess/退出路径保底断点
|
||
□ ExitProcess 触发时:不急着重启;立即 dump memory,路径写入 Evidence(补丁 10)
|
||
|
||
监控重点:
|
||
□ 进程创建: CreateProcess / ShellExecute
|
||
□ 文件操作: WriteFile → 勒索? DeleteFile → Wiper?
|
||
□ 注册表: Run/RunOnce 持久化
|
||
□ 网络: HTTP/DNS → C2 通信
|
||
□ 内存: VirtualAllocEx → 进程注入
|
||
□ 服务: CreateService → 持久化
|
||
□ IAT 修复失败 / 自校验闪退样本:敏感 API + CreateFile/GetFileSize 断点 / 硬件执行断点 / 内存搜索
|
||
|
||
无行为应急分支(MUST):
|
||
□ 沙箱无行为、秒退或无限休眠 → 检查反调试/反虚拟机(CPUID、计时、环境特征)
|
||
□ 尝试硬件断点绕过、补丁检测点、或换物理机/更高保真环境
|
||
□ 将「无行为 + 条件」写入 Evidence;禁止无条件写成「样本无害」
|
||
|
||
时间盒(补丁 9 · SHOULD 默认,可覆盖):
|
||
□ 静态深挖约 15 分钟无关键路径 → 强制转入本 Phase 动态
|
||
□ 动态单步约 200 条指令无恶意线索 → 强制回静态字符串/交叉引用重锚
|
||
|
||
反调试/混淆旁路(Issue #65 A–T · 详见 reverse-engineering/anti-analysis.md 菜谱):
|
||
□ P0:CPUID / RDTSC / PEB / NtQueryInformationProcess → 记录检测点后 lab 绕过或换环境(E-anti-debug-*)
|
||
□ P0:干净 IAT → API 哈希动态解析(bp GetProcAddress,E-api-hash)
|
||
□ P0:strings 空 → 串解密例程 + 宽字符串 UTF-16(E-string-decrypt / E-wide-strings)
|
||
□ P0:可疑签名 → SigCheck;无效/吊销不降威胁(E-sig-forge)
|
||
□ P1:进程名扫描 / VEH / int3·DR / 重叠节 / Overlay / .rsrc / Delay-Load
|
||
□ H/S 平坦化与不透明谓词 → ollvm-deobfuscation.md(不在此复制长文)
|
||
□ 绕过失败也写 Evidence;禁止反调试退出 = 样本无害
|
||
|
||
非 PE / 脚本 / DLL 补洞(Issue #65 U–AV · 详见 reverse-engineering/references/nonpe-format-cookbook.md):
|
||
□ bat/cmd:SET 拼接还原(U)→ E-batch-deobf;UTF-16 BOM(V);REM/GOTO 淹没(W)
|
||
□ PowerShell:多层 Base64/Gzip(X)逐层 Evidence;IEX 拼接/反转(Z)
|
||
□ VBA:Stomping/P-Code(AA);Chr/Base64(AB);自修改宏(AC)
|
||
□ DLL:TLS+DllMain(AJ);导出异常/无导出(AK/AL);Delay-Load 见 A–T R(AM);侧加载/反射(AO/AP)
|
||
□ JS/APK/驱动:路由 js-reverse / apk-reverse / kernel-driver-reverse + cookbook,不在此复制长文
|
||
```
|
||
|
||
### Phase 4: YARA 规则编写
|
||
|
||
```yara
|
||
// 规则结构
|
||
rule MalwareFamily_Example {
|
||
meta:
|
||
description = "检测 Example 恶意软件家族"
|
||
author = "分析者"
|
||
date = "2026-05"
|
||
severity = "high"
|
||
hash = "d41d8cd98f00b204e9800998ecf8427e"
|
||
mitre_id = "T1055" // Process Injection
|
||
|
||
strings:
|
||
// 字符串匹配
|
||
$str1 = "C2_SERVER_URL" ascii wide
|
||
$str2 = "payload.dat" ascii
|
||
|
||
// 十六进制匹配
|
||
$hex1 = { 8B 45 ?? 50 FF 15 [4] 85 C0 }
|
||
// 操作码序列: mov eax, [ebp-?]; push eax; call [import]; test eax, eax
|
||
|
||
// 正则匹配
|
||
$re1 = /https?:\/\/[a-z0-9.-]+\/[a-z]{3,8}\.php/ ascii
|
||
|
||
condition:
|
||
// 组合条件
|
||
uint16(0) == 0x5A4D and // MZ 头
|
||
filesize < 500KB and
|
||
(2 of ($str*) or $hex1)
|
||
}
|
||
```
|
||
|
||
### Phase 5: Sigma 规则生成
|
||
|
||
```yaml
|
||
# 行为检测规则
|
||
title: Suspicious Process Injection via CreateRemoteThread
|
||
id: 5a3d2c1b-1234-5678-9abc-def012345678
|
||
status: experimental
|
||
description: 检测使用 CreateRemoteThread 的进程注入行为
|
||
author: 分析者
|
||
date: 2026/05/25
|
||
tags:
|
||
- attack.t1055 # Process Injection
|
||
- attack.t1055.001 # DLL Injection
|
||
logsource:
|
||
category: process_creation
|
||
product: windows
|
||
detection:
|
||
selection:
|
||
Image|endswith: '\powershell.exe'
|
||
CommandLine|contains:
|
||
- 'CreateRemoteThread'
|
||
- 'VirtualAllocEx'
|
||
- 'WriteProcessMemory'
|
||
condition: selection
|
||
falsepositives:
|
||
- 合法的调试工具
|
||
level: high
|
||
```
|
||
|
||
### Phase 6: IOC 提取与情报
|
||
|
||
```text
|
||
IOC 类型分类:
|
||
□ 网络 IOC:
|
||
- IP: C2 地址(注意时效性)
|
||
- Domain: DGA 算法生成的域名(rsnkfda.com, xpqmje.net)
|
||
- URL: Payload 托管地址
|
||
- User-Agent: 自定义 UA 字符串
|
||
|
||
□ 主机 IOC:
|
||
- 文件路径: %APPDATA%\Microsoft\Crypto\RSA\*.dat
|
||
- 注册表: HKCU\Software\Microsoft\Windows\CurrentVersion\Run\
|
||
- Mutex: Global\{GUID} 互斥体名称
|
||
- 服务名: 伪装成系统服务的名称
|
||
|
||
□ 行为 IOC:
|
||
- MITRE ATT&CK 技术 ID (T1055, T1003, T1571...)
|
||
- Sigma 规则 → SIEM 集成
|
||
- YARA 规则 → 端点检测
|
||
|
||
□ 静态 IOC:
|
||
- 编译时间戳(可伪造)
|
||
- PDB 路径(含开发者信息)
|
||
- 节名异常(非标准 .text/.data)
|
||
- 导入表异常组合(如勒索软件 CryptEncrypt + DeleteShadowCopies)
|
||
```
|
||
|
||
## 反分析技术速查
|
||
|
||
| 技术 | 检测方法 | YARA 特征 |
|
||
|------|---------|----------|
|
||
| 虚拟机检测 | WMI Win32_BIOS/VideoController/Processor | `Win32_` 字符串 + 特定厂商名 |
|
||
| 沙箱检测 | 磁盘 < 60GB, RAM < 2GB, 单核 CPU | GlobalMemoryStatusEx 调用模式 |
|
||
| 调试器检测 | IsDebuggerPresent, CheckRemoteDebuggerPresent | PEB.BeingDebugged 偏移访问 |
|
||
| 定时逃逸 | Sleep(300000) 后执行恶意行为 | NtDelayExecution 长参数 |
|
||
| 地理位置检测 | 检查键盘布局/时区 → 排除 CIS 国家 | GetKeyboardLayoutList 调用 |
|
||
| 父进程检测 | explorer.exe vs cmd.exe | 进程名字符串比较 |
|
||
| API 直接 syscall | 绕过 EDR hook | syscall 指令 + SSN 解析 |
|
||
|
||
## 多 Agent 自动化分析 (SentinelHive 架构)
|
||
|
||
```text
|
||
┌─────────────────────────────────────────────────┐
|
||
│ Hive Director │
|
||
│ (Claude Opus 编排 + 仲裁) │
|
||
└──────┬──────┬──────┬──────┬──────┬───────┘
|
||
│ │ │ │ │
|
||
┌───┘ ┌───┘ ┌───┘ ┌───┘ ┌───┘
|
||
▼ ▼ ▼ ▼ ▼ ▼
|
||
Triage RE Behav Intel Detect Remed
|
||
快速 反编译 行为 威胁 规则 修复
|
||
分诊 静态 动态 情报 YARA 方案
|
||
Sigma
|
||
```
|
||
|
||
## 工具链
|
||
|
||
| 工具 | 用途 | 获取 |
|
||
|------|------|------|
|
||
| Ghidra / IDA Pro | 深度反编译 | ghidra-sre.org |
|
||
| CAPE Sandbox | 开源恶意软件沙箱 | GitHub: kevoreilly/CAPEv2 |
|
||
| ASD Azul | 大规模自动化分析 | GitHub: ASD |
|
||
| YARA | 模式匹配规则引擎 | `pip install yara-python` |
|
||
| Sigma | SIEM 行为检测规则 | GitHub: SigmaHQ/sigma |
|
||
| FLOSS | 去混淆字符串提取 | `pip install flare-floss` |
|
||
| Detect It Easy | 壳/编译器检测 | GitHub: horsicq/Detect-It-Easy |
|
||
| pe-sieve | 进程内存扫描 | GitHub: hasherezade/pe-sieve |
|
||
| VirusTotal API | 多引擎扫描 | virustotal.com |
|
||
| MalwareBazaar | 恶意软件样本库 | bazaar.abuse.ch |
|
||
|
||
## 参考
|
||
|
||
- `references/yara-sigma-rules.md` — YARA + Sigma 编写方法论
|
||
- `references/sandbox-orchestration.md` — 沙箱编排与自动化
|
||
- `references/anti-analysis-techniques.md` — 94 种反分析技术检测
|
||
- `../reverse-engineering/references/re-agent-workflow.md` — IAT 铁律与六阶段门闩(Issue #65)
|
||
- `../reverse-engineering/anti-analysis.md` — Agent 响应菜谱 A–T(反调试/混淆旁路)
|
||
- `../reverse-engineering/references/nonpe-format-cookbook.md` — 非 PE/多格式菜谱 U–AV(脚本/宏/JS/驱动/DLL/Android)
|
||
- `../reverse-engineering/references/ollvm-deobfuscation.md` — 平坦化/不透明谓词(H/S)
|
||
|
||
## 任务完成自检(声称完成前 MUST 通过)
|
||
|
||
- [ ] 我是否执行了工作流中的每一步(而不是只阅读)?
|
||
- [ ] 导入表 MUST 检查是否已执行并写入 Evidence(E-imports 或 .NET 等价锚点)?DLL/SYS 是否含 E-exports?
|
||
- [ ] 若 IAT 修复失败或自校验闪退:是否记录 E-iat-repair-fail / E-self-check-crash 并转入动态?
|
||
- [ ] 重做请求是否回到被点名步骤或经确认的前提协商?阻塞时是否说明+请确认而非偷换步骤?
|
||
- [ ] 动态是否按 TLS→EP→敏感 API→ExitProcess 保底顺序预置断点?时间盒/高危 API 组合是否按旁路处理?
|
||
- [ ] 反调试/混淆(A–T)是否按 anti-analysis 菜谱记录 Evidence?签名无效是否未错误降级威胁?
|
||
- [ ] 脚本/宏/DLL 等非 PE 类型是否按 U–AV cookbook 记录对应 Evidence(如 E-batch-deobf / E-ps-decode / E-vba-pcode / E-dll-*)?
|
||
- [ ] 我是否基于 `tool-index` 使用了真实工具路径?
|
||
- [ ] 我是否产出了可复现证据(命令/脚本/截图/报告)?
|
||
- [ ] 我是否完成并回写了 RULES 要求的 Checklist 项?
|