4209 字
13 分鐘
恶意代码分析与数字取证
第 10 章 恶意代码分析与数字取证
10.1 学习目标
- 建立 恶意代码分析(Malware Analysis) 的分层方法:静态 → 动态 → 深度。
- 熟练使用主流沙箱与分析工具(Cuckoo、Any.Run、Joe Sandbox、Ghidra、x64dbg、Volatility)。
- 掌握 数字取证 四大域:磁盘 / 内存 / 网络 / 日志。
- 能完成一次 “告警 → 取证 → IOC 提取 → 威胁情报共享” 的闭环。
10.2 恶意代码分类与命名
| 类型 | 行为 | 典型样本 |
|---|---|---|
| Virus 病毒 | 寄生宿主,自复制 | Win32.Sality |
| Worm 蠕虫 | 网络自传播 | Conficker、WannaCry |
| Trojan 木马 | 伪装工具 | Zeus、Emotet |
| RAT 远控 | 交互式后门 | njRAT、Quasar |
| Ransomware 勒索 | 加密勒索 | LockBit、REvil |
| Rootkit | 内核级隐藏 | TDL-4 |
| Loader / Dropper | 阶段加载 | SmokeLoader、BumbleBee |
| Infostealer 窃取 | 盗浏览器 / 钱包 | Redline、Vidar |
| Miner 挖矿 | 占用资源 | XMRig 变种 |
10.2.1 命名规范(供应商各异)
平台.家族名.变种.描述Win32/Emotet.A (Microsoft)Trojan.GenericKD.1234 (Bitdefender)Backdoor:Win32/Gh0st!MSR (MS Defender)10.3 静态分析(Static)
不运行样本,从文件结构入手。
10.3.1 基础指纹
file sample.exesha256sum sample.exessdeep sample.exe # 模糊哈希,可做家族聚类exiftool sample.exe # 编译时间、子系统、调试信息10.3.2 导入表 / 字符串
# Linux 分析 Windows 样本pip install pefilepython -c "import pefile, sys; [print(i.name.decode()) for i in pefile.PE(sys.argv[1]).DIRECTORY_ENTRY_IMPORT]" sample.exe
strings -n 6 -e l sample.exe | head -n 50 # UTF-16关注 高危 Win32 API:
CreateRemoteThread/WriteProcessMemory→ 进程注入VirtualAllocEx→ 远程分配SetWindowsHookEx→ 全局钩子InternetOpen/URLDownloadToFile→ 下载RegSetValueEx/CreateServiceA→ 持久化CryptEncrypt→ 加密 (勒索)
10.3.3 反汇编 / 反编译
- Ghidra / IDA → 函数图谱 + 反编译
- DIE、CFF Explorer → 检测加壳(UPX / Themida / VMProtect)
- Yara 规则匹配:
rule Emotet_Variant_A { meta: author = "me" date = "2026-04" strings: $a = "emotetEmotet" wide $b = { 48 8B 05 ?? ?? ?? ?? 48 85 C0 } condition: uint16(0) == 0x5A4D and all of them}10.4 动态分析(Dynamic / Sandbox)
10.4.1 搭建安全实验环境
- 宿主机:VMware / VirtualBox + 主机只读共享(NEVER 把样本拷到真机桌面!)
- 靶机:纯净 Windows 10,快照 → 运行 → 分析 → 还原。
- 网络:
Host-Only+INetSim/FakeNet-NG模拟 DNS / HTTP / SMTP。
10.4.2 行为监控工具
| 维度 | 工具 |
|---|---|
| 进程 / DLL | Process Monitor、Process Hacker |
| 注册表 | Regshot(快照对比)、Autoruns |
| 文件系统 | Procmon filter = File System |
| 网络 | Wireshark、Fiddler、FakeNet-NG |
| API 调用 | API Monitor、Frida |
| 内存 | x64dbg、Volatility |
| 全流量沙箱 | Cuckoo Sandbox、CAPE |
10.4.3 在线沙箱(无样本时分析他人上传的报告)
- https://any.run/ — 交互式沙箱,免费层够用
- https://app.joesandbox.com/ — 报告最详细
- https://bazaar.abuse.ch/ — 样本库
- https://tria.ge/, https://hybrid-analysis.com/
10.5 典型恶意行为 & IOC
10.5.1 Indicators of Compromise(入侵指标)
| 类型 | 示例 |
|---|---|
| 文件 | SHA256 / 文件名 / 路径 |
| 网络 | C2 域名 / IP / URL |
| 注册表 | HKLM\Software\Microsoft\Windows\CurrentVersion\Run\xxx |
| 互斥体 | Global\xxxxx |
| 计划任务 | \Microsoft\Windows\UpdateOrchestrator\xxx |
| 证书 | 签名者 CN |
10.5.2 持久化技巧(APT 常见)
Run / RunOnce 键Scheduled TasksServices(含 Service DLL)WMI Event Subscription (__EventFilter + CommandLineEventConsumer)COM HijackingBITS JobsStartup 文件夹 / ShortcutImage File Execution Options (IFEO) Debugger10.5.3 进程注入
- DLL Injection:
LoadLibrary + CreateRemoteThread - Reflective DLL:无落地加载
- Process Hollowing:
CreateProcess(SUSPENDED) → NtUnmapViewOfSection → WriteProcessMemory → SetThreadContext → ResumeThread - APC Injection:
QueueUserAPC - AtomBombing / Early Bird / ThreadHijacking
10.6 数字取证基础
10.6.1 取证原则
Chain of Custody 证据保管链Integrity 完整性(hash 保存)Preservation 不污染现场Documentation 每一步记录时间 + 操作人 + 工具版本10.6.2 磁盘取证
# 镜像制作sudo dc3dd if=/dev/sdb of=disk.img hash=sha256 log=dc3dd.log
# 挂载只读sudo mount -o ro,loop,noexec disk.img /mnt/case
# 工具autopsy / sleuthkit:fls, icat, mmls, fsstatftk-imager:Windows 下 GUIbulk_extractor:批量抽取卡号、邮件、URL10.6.3 文件系统取证考点
- NTFS:
$MFT、$LogFile、$UsnJrnl:$J→ 文件操作历史 - ext4:
journal→ 回滚 / 还原 - Prefetch:
C:\Windows\Prefetch\→ 程序运行痕迹(8 次内时间戳) - ShimCache / AmCache → 程序兼容性执行记录
- Shellbags(注册表) → 用户访问过的目录
10.6.4 浏览器取证
- Chrome:
%LocalAppData%\Google\Chrome\User Data\Default\History、Cookies、Login Data、Web Data(均为 sqlite)- 工具:
NirSoft ChromeHistoryView、mzcv
- Edge:同 Chrome(Chromium 内核)
- Firefox:
places.sqlite、cookies.sqlite
10.7 内存取证(Volatility)
10.7.1 镜像获取
# Linux (LiME)sudo insmod lime.ko "path=mem.raw format=raw"# Windows (DumpIt / winpmem)winpmem.exe mem.raw10.7.2 Volatility 3 基础命令
pip install volatility3
vol -f mem.raw windows.info # 识别镜像 profilevol -f mem.raw windows.pslist # 进程列表vol -f mem.raw windows.pstree # 进程树vol -f mem.raw windows.cmdline # 命令行vol -f mem.raw windows.netscan # 网络连接vol -f mem.raw windows.malfind # 可疑可执行内存页vol -f mem.raw windows.dlllist --pid 1234 # DLL 列表vol -f mem.raw windows.filescan # 内存中的文件句柄vol -f mem.raw windows.registry.printkey --key 'Software\Microsoft\Windows\CurrentVersion\Run'10.7.3 Linux 内存取证
vol -f mem.raw linux.pslistvol -f mem.raw linux.bash # 内存里的 bash 历史vol -f mem.raw linux.check_afinfo # 网络 rootkit 检测10.8 网络取证
- 抓包:
tcpdump -i any -w capture.pcap port 443 or port 80 or port 53 - 分析:Wireshark +
tshark -r capture.pcap -Y 'http.request' -T fields -e http.host - DNS 请求:可疑子域(DGA 域名) → 数据外带
- TLS 解密:配置
SSLKEYLOGFILE导出密钥 → Wireshark 导入 - Zeek(原 Bro):生成
conn.log / dns.log / http.log / ssl.log,便于大规模分析。
10.9 日志取证(Windows)
| 事件 ID | 含义 |
|---|---|
| 4624 | 登录成功(Logon Type 3=网络,10=RDP) |
| 4625 | 登录失败 |
| 4672 | 管理员登录 |
| 4688 | 新进程创建(开启命令行审计) |
| 4698 | 创建计划任务 |
| 4720 | 新建用户 |
| 5140 | 共享访问 |
| 7045 | 新服务安装 |
| 1102 | 安全日志被清空 |
10.9.1 Sysmon
<!-- 核心配置:按 Olaf Hartong / SwiftOnSecurity 模板 -->Event ID 1: ProcessCreate (含 ImageHash, CommandLine, ParentImage)Event ID 3: NetworkConnectEvent ID 7: ImageLoadedEvent ID 10: ProcessAccessEvent ID 11: FileCreateEvent ID 13: RegistryValueSetEvent ID 22: DNSQuery10.9.2 Linux 日志
/var/log/auth.log:SSH 登录/var/log/syslog、journalctlauditd→auditctl -w /etc/passwd -p waosquery实时查询:SELECT * FROM processes WHERE on_disk = 0;
10.10 威胁情报(CTI)与 IOC 共享
| 格式 / 平台 | 用途 |
|---|---|
| STIX / TAXII | 结构化共享标准 |
| MISP | 开源情报共享平台 |
| OpenCTI | 图数据库 + ATT&CK 映射 |
| VirusTotal / Hybrid-Analysis | 多引擎检测 + 沙箱 |
| AlienVault OTX | 社区 IOC 源 |
| ThreatFox (abuse.ch) | C2 指标 |
10.10.1 钻石模型 & 杀链映射
- Diamond Model:对手 / 能力 / 基础设施 / 受害者。
- Cyber Kill Chain:侦察 → 武器化 → 投递 → 利用 → 安装 → C2 → 行动。
10.11 实战:一次完整的勒索应急
1. 隔离:被感染主机断网(保留电源 → 内存取证)2. 证据采集: - winpmem → mem.raw - 镜像磁盘(dc3dd / FTK Imager) - 导出 Sysmon / Security / System 日志3. 样本分析: - 静态:Yara + PEiD + ImpHash - 动态:Any.Run / Cuckoo4. 内存分析: - Volatility: malfind / pstree / cmdline / netscan5. 横向感染范围确认:EDR 查询 ImpHash / C2 IP6. 恢复: - 无备份 → 不付赎金;关注 nomoreransom.org - 有备份 → 重装系统 + 还原数据 + 轮换凭证7. 复盘: - 根因(初始入口:钓鱼? 漏洞? 弱口令?) - 补救:补丁、MFA、邮件网关、EDR 规则 - IOC 提交:MISP / 威胁情报平台10.12 练习题
- 从 https://bazaar.abuse.ch 下载一个 低风险 Loader 样本(例如已失效 C2),在隔离环境中做一次完整静态 + 动态分析,产出 Yara 规则。
- 用 Volatility 分析一份官方样例内存镜像(如
cridex.vmem),回答:有哪些可疑进程、C2 IP、注入行为? - 用
osquery写一条查询检测”从%TEMP%执行的未签名进程”。 - 基于 Sysmon 日志写一条 Sigma 规则,检测 “mshta 从网络下载脚本”。
10.13 PE 文件结构深入
10.13.1 完整布局
+-------------------+ 0x00| DOS Header (MZ) | IMAGE_DOS_HEADER(e_lfanew → PE Header 偏移)+-------------------+| DOS Stub | "This program cannot be run in DOS mode"+-------------------+| PE\0\0 Signature | IMAGE_NT_HEADERS 的 Signature+-------------------+| File Header | Machine、NumberOfSections、Characteristics+-------------------+| Optional Header | Magic(PE32/PE32+)、AddressOfEntryPoint、ImageBase、Subsystem| + Data Dirs[16] | Import / Export / Resource / Reloc / TLS ...+-------------------+| Section Table | IMAGE_SECTION_HEADER × N+-------------------+| .text, .data, ... | Sections raw data+-------------------+10.13.2 关键 Data Directory
| Index | 名称 | 作用 |
|---|---|---|
| 0 | Export | DLL 导出函数表 |
| 1 | Import | 导入 DLL 与符号 |
| 2 | Resource | 嵌入图标 / 字符串 |
| 5 | Base Relocation | ASLR 重定位 |
| 6 | Debug | PDB 路径 / GUID |
| 9 | TLS | 线程局部回调(早期反调试) |
| 12 | IAT | Import Address Table |
| 14 | Delay Import | 延迟绑定 |
10.13.3 Import Hash (ImpHash)
- 计算导入函数顺序的 MD5
- 同一编译版本 / 编译器 + 同一代码生成的样本 ImpHash 通常一致
- 适合家族聚类
- 工具:
pefile/pyimphash/ VirusTotal 直接给
10.13.4 Rich Header
- MS Visual Studio 编译器留下的 “Rich” 签名(指出使用了哪些 Microsoft 组件 + 版本)
- 可作为高质量样本聚类指标(比 PDB 路径更难伪造)
10.14 加壳与脱壳完整谱系
10.14.1 加壳类型
| 类别 | 例子 | 特征 |
|---|---|---|
| 压缩壳 | UPX、ASPack | 减小体积,自动解压跳转 OEP |
| 加密壳 | ASProtect | 资源加密 |
| 商业保护 | Themida、VMProtect、Enigma | 虚拟机保护、混淆 |
| 自写壳 | APT 常用 | 一次性、签名 / 字符串高度混淆 |
10.14.2 通用脱壳思路
1. 找 OEP(Original Entry Point) - 单步追踪到第一个跨段 jmp / call - ESP / EBP 一致原则(pushad → 找 popad 跳转) - PE 结构修复:用 Scylla dump 内存 + 重建 IAT2. 修复 IAT - 跑到 OEP 后,扫描 IAT 区段,恢复每个 thunk 指向真实 API3. dump 镜像 - x64dbg → Scylla 插件4. 验证 - 重新打开看是否能跑;如果 import 错位需要再修10.14.3 反 VM / 反沙箱常见检查
// 1. 时间差检测QueryPerformanceCounter(&t1);Sleep(2000);QueryPerformanceCounter(&t2);if ((t2 - t1) < expected) exit_silent();
// 2. CPU 特性__cpuid(info, 1);if (info[2] & (1 << 31)) /* Hypervisor present bit */ exit();
// 3. 设备 / 服务"VBoxService" / "VMTools" / "QEMU""\\.\VBoxMiniRdrDN"
// 4. 鼠标 / 键盘GetCursorInfo() 静止超时
// 5. 进程数 / 用户 / 安装软件small process count → sandbox suspect
// 6. SMBIOS BIOS Vendor / Manufacturer 字段10.14.4 脱壳工具
- x64dbg + Scylla / OllyDumpEx
- Universal PE Unpacker(IDA 插件)
- CFF Explorer(PE 编辑器)
- DnSpy(.NET 反编译 + 调试)
- de4dot(.NET 通用脱壳)
10.15 进程注入十种姿势详解
10.15.1 Classic DLL Injection
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);LPVOID p = VirtualAllocEx(h, NULL, MAX_PATH, MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(h, p, dllPath, MAX_PATH, NULL);HANDLE t = CreateRemoteThread(h, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32"), "LoadLibraryA"), p, 0, NULL);10.15.2 Reflective DLL Injection
无需落地 DLL:
- 把 DLL 字节注入目标进程
- 调用其内部”自加载”函数解析 PE 结构、修复重定位
- 启动远程线程运行入口
10.15.3 Process Hollowing
CreateProcessA("svchost.exe", ..., CREATE_SUSPENDED, ...);NtUnmapViewOfSection(hProc, BaseAddr);VirtualAllocEx + WriteProcessMemory(payload);SetThreadContext(EIP = newEntry);ResumeThread();10.15.4 APC Injection
QueueUserAPC((PAPCFUNC)remoteShellcode, hThread, 0);只在线程进入 alertable 状态时触发。
10.15.5 Thread Hijacking
SuspendThread → GetThreadContext → 改 EIP/RIP 指向 shellcode → SetThreadContext → ResumeThread10.15.6 AtomBombing
利用 GlobalAddAtom + NtQueueApcThread 写入目标进程,绕过常规 API hook。
10.15.7 Early Bird APC
在线程刚创建尚未运行用户代码时排队 APC,几乎免杀。
10.15.8 SetWindowsHookEx
加载 DLL 到所有同 desktop 进程,鼠标 / 键盘 hook 顺带注入。
10.15.9 ROP Chain Injection
通过 ROP gadget 在合法模块内合成 LoadLibrary 调用,避免在内存写新代码(绕过 W^X)。
10.15.10 Module Stomping / Image Doppelgänging
- Module Stomping:先 LoadLibrary 一个无害 DLL,再覆盖其内存为 shellcode(Memory 显示是合法 DLL)
- Doppelgänging:用 NTFS Transactional 文件系统让磁盘文件回滚为合法签名,但内存执行的是恶意代码
10.16 Rootkit 分类
10.16.1 用户态 Rootkit
- LD_PRELOAD(Linux):劫持 libc 函数(
readdir隐藏文件 /stat假大小) - DLL 注入 + IAT Hook(Windows)
10.16.2 内核态 Rootkit
- Linux:可加载内核模块 (LKM),hook 系统调用表 / 文件系统操作 / netfilter
- Windows:Driver(KMDF / WDM),hook SSDT(旧)/ 现代用 callback API
- 例子:Diamorphine、TDL-4、Necurs
10.16.3 Bootkit / UEFI Rootkit
- 篡改 MBR / VBR / EFI 启动链
- 例子:MoonBounce、CosmicStrand、BlackLotus(绕过 Secure Boot)
- 持久性极强:重装 OS 也清不掉
10.16.4 Hypervisor Rootkit
- 利用硬件虚拟化(Intel VT-x / AMD-V)把目标 OS 跑在 VM 里
- 学术 PoC:Blue Pill (Joanna Rutkowska)
- 实战罕见但极隐蔽
10.16.5 检测手段
- 内存取证(Volatility 模块)
- 完整性校验(Tripwire / AIDE)
- 启动链验证(Secure Boot + TPM Attestation)
- BIOS / UEFI 完整性扫描(chipsec、CHIPSEC)
- 内核行为差分(Sysinternals RootkitRevealer)
10.17 Yara 规则进阶
10.17.1 高级语法
import "pe"import "math"
rule complex_match { strings: $code = { 48 ?? 8B 05 ?? ?? ?? ?? E8 ?? ?? ?? ?? } // 字节通配 $jump = { E9 [4-8] 48 8B } // 中间 4-8 字节 $hex_jump = { 6A 40 68 ?? ?? ?? ?? FF } $alt = { (33 C0 | 31 C0) } // 选项
condition: // PE + 入口附近代码 + 高熵字符串 pe.is_pe and any of ($code, $jump) and math.entropy(0, filesize) > 6.5 and for any i in (0..pe.number_of_sections - 1) : (pe.sections[i].name == ".text" and pe.sections[i].raw_data_size > 0)}10.17.2 自动化生成 Yara
- yarGen:从样本统计字符串自动生成
- YaraGenerator
- 通过 LLM 生成草稿后人工修正
10.17.3 Yara 部署形态
- 客户端 / EDR 内嵌:实时扫描磁盘 / 内存
- 邮件网关:附件扫描
- 流量层:Suricata 集成 file extraction + Yara
- VirusTotal Retrohunt:海量样本回溯
10.18 沙箱进阶:自定义检测规则
10.18.1 Cuckoo / CAPE
# 自定义 signatureclass SuspiciousPersistence(Signature): name = "suspicious_persistence" description = "Adds Run key for persistence" severity = 3 categories = ["persistence"] authors = ["me"] minimum = "2.0"
filter_apinames = ["RegSetValueExA", "RegSetValueExW"]
def on_call(self, call, process): regkey = self.get_argument(call, "FullName") if "\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" in regkey: self.mark_call() return True10.18.2 反规避策略
- 加速时钟(让 Sleep 假装结束)
- 模拟用户活动(鼠标 / 键盘)
- 多次启动取并集行为
- 改变 Username、HostName、Disk Size
10.18.3 流量沙箱
- INetSim / FakeNet-NG:响应任何 DNS / HTTP / SMTP,让样本以为联网
- mitmproxy:抓 TLS(前提:样本不锁证书)
10.19 内存取证插件开发(Volatility 3)
from volatility3.framework import interfaces, renderersfrom volatility3.plugins.windows import pslist
class MyHunt(interfaces.plugins.PluginInterface): _required_framework_version = (2, 0, 0)
@classmethod def get_requirements(cls): return pslist.PsList.get_requirements()
def run(self): kernel = self.context.modules[self.config['kernel']] return renderers.TreeGrid( [("PID", int), ("Name", str), ("Hit", str)], self._generator(), )
def _generator(self): for proc in pslist.PsList.list_processes(...): name = proc.ImageFileName.cast("string", max_length=15, errors='replace') if 'svchost' in name and proc.InheritedFromUniqueProcessId not in trusted_parents: yield (0, (proc.UniqueProcessId, name, "Suspicious svchost parent"))10.20 时间线分析(Plaso / log2timeline)
10.20.1 工作流
log2timeline.py --storage-file case.plaso disk.E01psort.py -o l2tcsv -w timeline.csv case.plasotimeline.csv 含数千万条事件:文件创建 / 注册表 / 浏览器历史 / 邮件 / 事件日志,按时间排序。
10.20.2 关键技巧
- 精确时间窗口:
psort -- "date > '2026-04-01 00:00:00' AND date < '2026-04-02 00:00:00'" - 多源关联:把 Sysmon、Prefetch、ShimCache、AmCache 同一窗口对照
- 视觉化:导入 Timesketch / Splunk / ELK
10.20.3 常见 IOC 时间锚点
- 持久化条目首次写入 → 入侵起点附近
- LSASS 第一次被访问 → 凭据收集
- Schtasks / wmic 突然出现 → 横向准备
- 大量出站连接突变 → 数据外带
10.21 勒索家族族谱与战术分析
Conti (RaaS) ├── 子分支:Black Basta, Royal, Karakurt ├── TTP:Cobalt Strike + Mimikatz + AdFind + Atera + 双重勒索 └── 解散后泄露源码(chat.txt)
LockBit ├── LockBit 1.0 → 2.0 → 3.0 (Black) → Green ├── 自有 affiliate 平台 + 漏洞悬赏 └── 2024 年 LockBit 3.0 源码泄露
REvil / Sodinokibi ├── 历史:Kaseya VSA、JBS └── 2021 后被俄方 FSB 抓捕(部分),后又有重启
BlackCat / ALPHV ├── Rust 编写,跨平台 └── 2023 攻击 MGM 大酒店
Maze └── 首次提出"双重勒索"概念
Royal / BlackSuit └── 2023 年攻击 CDK Global,瘫痪美国汽车经销商业务
Akira ├── 2023 出现,针对中小企业 └── Linux + Windows 双平台10.21.1 通用 TTP
- 初始访问:Phishing / RDP / VPN / 已暴露漏洞(Citrix / Fortinet / Confluence)
- 内网工具:Cobalt Strike、Mimikatz、AdFind、Bloodhound、PsExec
- 数据外带:rclone → MEGA / 私有 SFTP
- 加密:AES-256 + RSA-4096 包装;ESXi 直接关 VM 加密 .vmdk
- 谈判:Tor 网站 + Onion chat
- 双重勒索:加密 + 数据公开威胁
10.21.2 防御要点
- 备份 + 离线 / 不可变(air-gap、对象锁定)
- 攻击面缩减:补丁、MFA、零信任
- 检测:早期阶段 IOC(C2 域、Cobalt Strike Beacon)
- 演练:Table-top + Atomic Red Team
- 不付钱政策(除非生命安全 / 关键基础设施例外)
10.22 APT 案例:SUNBURST 动态行为复盘
1. 受感染的 SolarWinds.Orion.Core.BusinessLayer.dll 加载2. 12-14 天潜伏期(避开测试 / 沙箱)3. 收集系统信息 → 计算"组织 ID" hash4. DNS 查询 avsvmcloud[.]com 子域 → CNAME 控制目标5. 选择性激活:避开内置黑名单(安全公司、调试工具)6. 切换到第二阶段:TEARDROP / RAINDROP loader7. 部署 Cobalt Strike Beacon8. 横向 + 凭据收集 + 数据外带10.22.1 提取 IOCs 思路
- DNS 历史日志:包含 avsvmcloud[.]com 的查询
- 进程父子关系:solarwinds.businesslayerhost.exe → cmd.exe
- 时间戳异常:DLL 编译时间与 SolarWinds 历史不一致
10.23 IR Playbook 模板
10.23.1 勒索 IR 时间线
T+0:00 发现告警(EDR alarm: mass file rename)T+0:05 隔离主机(断网 / 关 vSwitch)T+0:15 初始 triage:影响范围、关键资产T+0:30 启动 IRT、通知 CISOT+1:00 内存 + 磁盘镜像(关键主机)T+2:00 样本提交 + 沙箱分析T+4:00 IOC 提取 + EDR 全网搜T+6:00 C2 域加入 DNS sinkholeT+12:00 备份核验 + 灾备方案T+24:00 决策点:恢复 vs 谈判T+48:00 重构 + 全员凭证轮换T+72:00 报告草稿 + 监管通报T+1 周 全面复盘 + 检测规则升级T+1 月 复测 + 演练10.23.2 钓鱼 IR 时间线
T+0 收到员工举报T+15min 邮件回收 + 隔离用户邮箱T+30min Sandbox 分析附件 / URLT+1h EDR 查所有点击同链接 / 下载附件的人T+2h 重置受影响账号密码 + tokenT+4h 全员告知 + 培训案例T+24h 报告 + IOC 共享10.23.3 供应链 IR
- 立即冻结 CI/CD pipeline
- SBOM 比对找受影响版本
- 客户通知(需符合披露法规:72h GDPR / 30 天 SEC 等)
- 上游协作 + 取证
10.24 练习题(扩展)
- 用 Volatility 写一个插件,列出所有从
%TEMP%加载的可执行内存页。 - 选取一个公开 PE 样本,写出完整脱壳 + 静态分析 + Yara 规则报告。
- 从一份内存镜像还原 IE Cookie / Chrome Cookie。
- 用 Plaso 解析一份 EVTX,给出登录失败 + 后续成功登录的关联序列。
- 设计一份针对小型企业的勒索演练场景(Atomic Red Team 风格)。
- 解释 BlackLotus 如何绕过 Secure Boot 并写一份检测建议。
参考答案要点
windows.malfind+ 自定义路径过滤;用vad.start_address与process.handles关联文件路径。- 利用 Baton Drop (CVE-2022-21894) 写入 boot files;检测:UEFI 启动日志 + 文件完整性。
10.25 面试高频考点(附参考答案)
Q1:静态分析与动态分析谁优先?
- 推荐先静态(结构 / 字符串 / Yara)→ 再动态(沙箱)→ 复杂样本再深度逆向。耗时与可控性平衡。
Q2:什么是 ImpHash?
- Import Hash,通过导入函数顺序的 MD5 实现样本聚类;同一编译器 + 同一代码生成的样本通常一致。
Q3:Volatility 与 Rekall 区别?
- 同源;Volatility 3 用 Python 3 + 模块化,社区更活跃;Rekall 已停更。
Q4:UPX 脱壳和 Themida 难度差异?
- UPX 一条命令脱;Themida 含虚拟机保护,需要逐步分析 VM dispatcher,难度量级差距大。
Q5:解释 LSASS 转储的检测难点?
- 合法工具(procdump / Task Manager)也能做;EDR 通常基于 callstack + ETW + 行为关联识别异常调用方。
Q6:BitLocker 加密硬盘下怎么取证?
- 内存中可能含 master key;需在系统运行态采集(DumpIt / FTK Imager);或通过 Recovery Key(AD / Azure AD 备份)。
Q7:BlackEnergy 与 NotPetya 关系?
- 同一 APT 家族(俄罗斯 GRU 关联)演化;NotPetya 用 EternalBlue + Mimikatz 横向,伪装勒索实为 wiper。
Q8:怎么判断一个样本是否真的”无文件”?
- 无文件 ≠ 无痕迹;通常存在于 PowerShell / WMI / Registry 中;需要内存 + 注册表 + ETW 多视角。
Q9:勒索付不付?
- 多数情况下不建议(无法保证解密、违反执法 OFAC sanctions);关键基础设施 / 生命安全 / 备份完全没有时再考虑;先咨询法律 + 监管。
Q10:怎么把恶意分析能力规模化?
- 自动化沙箱 + ML 分类 + Yara/Sigma 规则库 + 人工 deep dive 重要样本;建立家族知识库便于未来快速识别。
10.26 延伸阅读
教材
- 《Practical Malware Analysis》Michael Sikorski, Andrew Honig(红宝书)
- 《Practical Reverse Engineering》Bruce Dang
- 《The Art of Memory Forensics》Michael Hale Ligh
- 《File System Forensic Analysis》Brian Carrier
- 《Windows Internals (7th Ed.)》Russinovich
资源
- SANS DFIR posters:https://www.sans.org/posters/
- DFIR Report:https://thedfirreport.com/
- Malware Bazaar / VirusBay
- MalwareTech 博客
- Lenny Zeltser 博客
- ThreatHunter Playbook:https://github.com/OTRF/ThreatHunter-Playbook
课程 / 认证
- SANS FOR500 / FOR508 / FOR578 / FOR610
- GIAC GCFA / GCFE / GREM / GCFR
- Zero2Auto Malware Analysis
- TCM Practical Malware Analysis & Triage
10.27 小结
恶意代码分析 = 耐心 + 套路 + 环境安全。 数字取证 = 证据链 + 时间线 + 交叉验证。 两者的终极目标:把”被入侵”变成”可解释 + 可复盘 + 可防御”。
与其他章节的接口
- ← Ch07 / Ch08:渗透 IOC 来源
- ← Ch09:二进制利用细节复盘
- → Ch11:检测规则与 SOC 流程承接
- → Ch12:云 / 移动场景的取证工具差异
学习节奏
- 第 1-2 周:搭建沙箱环境,做 5 个公开样本完整分析
- 第 3-4 周:Volatility 3 全部插件熟练
- 第 5-6 周:Plaso 时间线 + EVTX 深入
- 第 7-8 周:写 5 条 Yara + 5 条 Sigma + 一份 IR 报告
- 第 9 周+:选一个 APT family 做 deep dive 写博客
终极心态
每一份报告都要让”半年后的自己 / 同事 / 法庭”能看懂、能复现、能采信。 取证的对手不是攻击者,而是时间与噪音。
完成本章后,你应当具备独立处理一次中等复杂度勒索 / APT 应急事件的能力。
10.28 附录 A:常用 Yara 规则模板
import "pe"import "hash"
rule generic_loader_template { meta: author = "you" description = "Generic loader pattern with high entropy + exec persistence" tlp = "WHITE"
strings: $api1 = "VirtualAlloc" ascii wide $api2 = "WriteProcessMemory" ascii wide $api3 = "CreateRemoteThread" ascii wide $reg = "Software\\Microsoft\\Windows\\CurrentVersion\\Run" ascii wide $task = "schtasks" ascii wide $hex_loop = { 8B ?? ?? ?? ?? 33 ?? 8B ?? ?? ?? ?? E8 ?? ?? ?? ?? }
condition: pe.is_pe and 2 of ($api*) and any of ($reg, $task) and $hex_loop and math.entropy(0, filesize) > 6.8 and filesize < 3MB}
rule cobalt_strike_beacon_classic { meta: ref = "https://www.cobaltstrike.com/" strings: $a1 = { 4D 5A 41 52 55 48 89 E5 48 81 EC ?? 00 00 00 } // 默认 Beacon prologue $a2 = "MZARUH" ascii $b1 = "%c%c%c%c%c%c%c%c%cMSSE-%d-server" ascii wide $b2 = "ReflectiveLoader" ascii condition: any of ($a*) or any of ($b*)}10.29 附录 B:常用 Sigma 规则模板
title: Suspicious Service Creation From Tempid: 12345678-aaaa-bbbb-cccc-1234567890abstatus: experimentaldescription: Detects new Windows services created with binary path under %TEMP% / %APPDATA%.logsource: product: windows service: systemdetection: selection: EventID: 7045 ImagePath|contains: - '\AppData\Local\Temp\' - '\AppData\Roaming\' - '\Users\Public\' - '\ProgramData\' condition: selectionfalsepositives: - Custom installers (rare)level: hightags: - attack.persistence - attack.t1543.003title: LSASS Memory Dump via Comsvcsid: ce8c2d2e-...detection: selection: EventID: 1 Image|endswith: '\rundll32.exe' CommandLine|contains|all: - 'comsvcs.dll' - 'MiniDump' condition: selectionlevel: criticaltags: - attack.credential_access - attack.t1003.00110.30 附录 C:osquery 检测一组实用查询
-- 1. 在 %TEMP% 中执行的未签名进程SELECT p.pid, p.path, p.cmdline, s.identifier, s.signedFROM processes pLEFT JOIN signature s ON p.path = s.pathWHERE p.path LIKE '%\\AppData\\Local\\Temp\\%' AND (s.signed = 0 OR s.signed IS NULL);
-- 2. 自启动项SELECT * FROM startup_itemsWHERE path NOT LIKE 'C:\\Program Files\\%' AND path NOT LIKE 'C:\\Windows\\%';
-- 3. 网络连接异常端口SELECT pid, local_address, remote_address, remote_portFROM process_open_socketsWHERE remote_port IN (4444, 4441, 8443, 8081, 50050) AND remote_address NOT LIKE '10.%';
-- 4. shadowcopy 删除(勒索常用)SELECT * FROM windows_eventlogWHERE eventid = 524 OR data LIKE '%vssadmin delete shadows%';10.31 附录 D:内存取证 Volatility 命令速查
# 进程vol -f mem.raw windows.pslistvol -f mem.raw windows.pstreevol -f mem.raw windows.psscan # 隐藏进程vol -f mem.raw windows.cmdline
# 注入vol -f mem.raw windows.malfindvol -f mem.raw windows.hollowfindvol -f mem.raw windows.threads
# 网络vol -f mem.raw windows.netstatvol -f mem.raw windows.netscan
# 文件 / 注册表vol -f mem.raw windows.filescanvol -f mem.raw windows.dumpfiles --virtaddr 0x????vol -f mem.raw windows.registry.hivelistvol -f mem.raw windows.registry.printkey --key 'Software\Microsoft\Windows\CurrentVersion\Run'
# 凭据vol -f mem.raw windows.hashdumpvol -f mem.raw windows.lsadumpvol -f mem.raw windows.cachedump10.32 复盘检查表
- 我能在 1 小时内完成一份未知样本的 triage 报告(静态 + 动态)
- 我能写出至少 5 条独立 Yara / Sigma 规则
- 我能用 Volatility 3 完成完整内存取证流程
- 我能把 IOC 提交到 MISP / VirusTotal / OTX
- 我能在没有 EDR 的环境下凭 Sysmon + Plaso 复原一次入侵时间线
- 我了解 BlackLotus / xz / SUNBURST 等近年标志性事件并能讲清攻击链
- 我有一套自己的 IR Playbook 模板
10.33 历史经典 CVE 与对应恶意代码 / IR 事件
| CVE | 关联事件 |
|---|---|
| CVE-2017-0144 | EternalBlue,被 WannaCry / NotPetya 武器化 |
| CVE-2017-11882 | Office 公式编辑器 RCE,APT 钓鱼常用载体 |
| CVE-2020-1472 | Zerologon,被 Conti / Ryuk 内网横向 |
| CVE-2021-26855 | ProxyLogon,HAFNIUM 大规模植入 webshell |
| CVE-2021-34527 | PrintNightmare,被多家勒索家族复用提权 |
| CVE-2021-40444 | MSHTML RCE,被 BazarLoader / Cobalt Strike 武器化 |
| CVE-2021-44228 | Log4Shell,Conti / Khonsari 等利用 |
| CVE-2022-26134 | Confluence OGNL,矿机 / 勒索的常见入口 |
| CVE-2023-34362 | MOVEit Transfer SQLi,Cl0p 大规模数据勒索 |
| CVE-2024-3094 | xz-utils 后门,供应链取证案例 |
| CVE-2024-21412 | Defender SmartScreen Bypass,DarkGate / Phemedrone 利用 |
分享
如果這篇文章對你有幫助,歡迎分享給更多人!
部分資訊可能已經過時
相關文章 智能推薦





















