mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7mobile wallpaper 8mobile wallpaper 9mobile wallpaper 10mobile wallpaper 11mobile wallpaper 12mobile wallpaper 13
4209 字
13 分鐘
恶意代码分析与数字取证
2026-04-27

第 10 章 恶意代码分析与数字取证#

10.1 学习目标#

  1. 建立 恶意代码分析(Malware Analysis) 的分层方法:静态 → 动态 → 深度。
  2. 熟练使用主流沙箱与分析工具(Cuckoo、Any.Run、Joe Sandbox、Ghidra、x64dbg、Volatility)。
  3. 掌握 数字取证 四大域:磁盘 / 内存 / 网络 / 日志。
  4. 能完成一次 “告警 → 取证 → 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.exe
sha256sum sample.exe
ssdeep sample.exe # 模糊哈希,可做家族聚类
exiftool sample.exe # 编译时间、子系统、调试信息

10.3.2 导入表 / 字符串#

# Linux 分析 Windows 样本
pip install pefile
python -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 行为监控工具#

维度工具
进程 / DLLProcess 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 在线沙箱(无样本时分析他人上传的报告)#


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 Tasks
Services(含 Service DLL)
WMI Event Subscription (__EventFilter + CommandLineEventConsumer)
COM Hijacking
BITS Jobs
Startup 文件夹 / Shortcut
Image File Execution Options (IFEO) Debugger

10.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, fsstat
ftk-imager:Windows GUI
bulk_extractor:批量抽取卡号、邮件、URL

10.6.3 文件系统取证考点#

  • NTFS$MFT$LogFile$UsnJrnl:$J → 文件操作历史
  • ext4journal → 回滚 / 还原
  • PrefetchC:\Windows\Prefetch\ → 程序运行痕迹(8 次内时间戳)
  • ShimCache / AmCache → 程序兼容性执行记录
  • Shellbags(注册表) → 用户访问过的目录

10.6.4 浏览器取证#

  • Chrome:%LocalAppData%\Google\Chrome\User Data\Default\
    • HistoryCookiesLogin DataWeb Data(均为 sqlite)
    • 工具:NirSoft ChromeHistoryViewmzcv
  • Edge:同 Chrome(Chromium 内核)
  • Firefox:places.sqlitecookies.sqlite

10.7 内存取证(Volatility)#

10.7.1 镜像获取#

# Linux (LiME)
sudo insmod lime.ko "path=mem.raw format=raw"
# Windows (DumpIt / winpmem)
winpmem.exe mem.raw

10.7.2 Volatility 3 基础命令#

pip install volatility3
vol -f mem.raw windows.info # 识别镜像 profile
vol -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.pslist
vol -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: NetworkConnect
Event ID 7: ImageLoaded
Event ID 10: ProcessAccess
Event ID 11: FileCreate
Event ID 13: RegistryValueSet
Event ID 22: DNSQuery

10.9.2 Linux 日志#

  • /var/log/auth.log:SSH 登录
  • /var/log/syslogjournalctl
  • auditdauditctl -w /etc/passwd -p wa
  • osquery 实时查询: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 / Cuckoo
4. 内存分析:
- Volatility: malfind / pstree / cmdline / netscan
5. 横向感染范围确认:EDR 查询 ImpHash / C2 IP
6. 恢复:
- 无备份 → 不付赎金;关注 nomoreransom.org
- 有备份 → 重装系统 + 还原数据 + 轮换凭证
7. 复盘:
- 根因(初始入口:钓鱼? 漏洞? 弱口令?)
- 补救:补丁、MFA、邮件网关、EDR 规则
- IOC 提交:MISP / 威胁情报平台

10.12 练习题#

  1. https://bazaar.abuse.ch 下载一个 低风险 Loader 样本(例如已失效 C2),在隔离环境中做一次完整静态 + 动态分析,产出 Yara 规则。
  2. 用 Volatility 分析一份官方样例内存镜像(如 cridex.vmem),回答:有哪些可疑进程、C2 IP、注入行为?
  3. osquery 写一条查询检测”从 %TEMP% 执行的未签名进程”。
  4. 基于 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名称作用
0ExportDLL 导出函数表
1Import导入 DLL 与符号
2Resource嵌入图标 / 字符串
5Base RelocationASLR 重定位
6DebugPDB 路径 / GUID
9TLS线程局部回调(早期反调试)
12IATImport Address Table
14Delay 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 内存 + 重建 IAT
2. 修复 IAT
- 跑到 OEP 后,扫描 IAT 区段,恢复每个 thunk 指向真实 API
3. 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:

  1. 把 DLL 字节注入目标进程
  2. 调用其内部”自加载”函数解析 PE 结构、修复重定位
  3. 启动远程线程运行入口

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 → ResumeThread

10.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#

# 自定义 signature
class 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 True

10.18.2 反规避策略#

  • 加速时钟(让 Sleep 假装结束)
  • 模拟用户活动(鼠标 / 键盘)
  • 多次启动取并集行为
  • 改变 Username、HostName、Disk Size

10.18.3 流量沙箱#

  • INetSim / FakeNet-NG:响应任何 DNS / HTTP / SMTP,让样本以为联网
  • mitmproxy:抓 TLS(前提:样本不锁证书)

10.19 内存取证插件开发(Volatility 3)#

my_plugin.py
from volatility3.framework import interfaces, renderers
from 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.E01
psort.py -o l2tcsv -w timeline.csv case.plaso

timeline.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" hash
4. DNS 查询 avsvmcloud[.]com 子域 → CNAME 控制目标
5. 选择性激活:避开内置黑名单(安全公司、调试工具)
6. 切换到第二阶段:TEARDROP / RAINDROP loader
7. 部署 Cobalt Strike Beacon
8. 横向 + 凭据收集 + 数据外带

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、通知 CISO
T+1:00 内存 + 磁盘镜像(关键主机)
T+2:00 样本提交 + 沙箱分析
T+4:00 IOC 提取 + EDR 全网搜
T+6:00 C2 域加入 DNS sinkhole
T+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 分析附件 / URL
T+1h EDR 查所有点击同链接 / 下载附件的人
T+2h 重置受影响账号密码 + token
T+4h 全员告知 + 培训案例
T+24h 报告 + IOC 共享

10.23.3 供应链 IR#

  • 立即冻结 CI/CD pipeline
  • SBOM 比对找受影响版本
  • 客户通知(需符合披露法规:72h GDPR / 30 天 SEC 等)
  • 上游协作 + 取证

10.24 练习题(扩展)#

  1. 用 Volatility 写一个插件,列出所有从 %TEMP% 加载的可执行内存页。
  2. 选取一个公开 PE 样本,写出完整脱壳 + 静态分析 + Yara 规则报告。
  3. 从一份内存镜像还原 IE Cookie / Chrome Cookie。
  4. 用 Plaso 解析一份 EVTX,给出登录失败 + 后续成功登录的关联序列。
  5. 设计一份针对小型企业的勒索演练场景(Atomic Red Team 风格)。
  6. 解释 BlackLotus 如何绕过 Secure Boot 并写一份检测建议。

参考答案要点#

  1. windows.malfind + 自定义路径过滤;用 vad.start_addressprocess.handles 关联文件路径。
  2. 利用 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 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 Temp
id: 12345678-aaaa-bbbb-cccc-1234567890ab
status: experimental
description: Detects new Windows services created with binary path under %TEMP% / %APPDATA%.
logsource:
product: windows
service: system
detection:
selection:
EventID: 7045
ImagePath|contains:
- '\AppData\Local\Temp\'
- '\AppData\Roaming\'
- '\Users\Public\'
- '\ProgramData\'
condition: selection
falsepositives:
- Custom installers (rare)
level: high
tags:
- attack.persistence
- attack.t1543.003
title: LSASS Memory Dump via Comsvcs
id: ce8c2d2e-...
detection:
selection:
EventID: 1
Image|endswith: '\rundll32.exe'
CommandLine|contains|all:
- 'comsvcs.dll'
- 'MiniDump'
condition: selection
level: critical
tags:
- attack.credential_access
- attack.t1003.001

10.30 附录 C:osquery 检测一组实用查询#

-- 1. 在 %TEMP% 中执行的未签名进程
SELECT p.pid, p.path, p.cmdline, s.identifier, s.signed
FROM processes p
LEFT JOIN signature s ON p.path = s.path
WHERE p.path LIKE '%\\AppData\\Local\\Temp\\%'
AND (s.signed = 0 OR s.signed IS NULL);
-- 2. 自启动项
SELECT * FROM startup_items
WHERE path NOT LIKE 'C:\\Program Files\\%'
AND path NOT LIKE 'C:\\Windows\\%';
-- 3. 网络连接异常端口
SELECT pid, local_address, remote_address, remote_port
FROM process_open_sockets
WHERE remote_port IN (4444, 4441, 8443, 8081, 50050)
AND remote_address NOT LIKE '10.%';
-- 4. shadowcopy 删除(勒索常用)
SELECT * FROM windows_eventlog
WHERE eventid = 524 OR data LIKE '%vssadmin delete shadows%';

10.31 附录 D:内存取证 Volatility 命令速查#

# 进程
vol -f mem.raw windows.pslist
vol -f mem.raw windows.pstree
vol -f mem.raw windows.psscan # 隐藏进程
vol -f mem.raw windows.cmdline
# 注入
vol -f mem.raw windows.malfind
vol -f mem.raw windows.hollowfind
vol -f mem.raw windows.threads
# 网络
vol -f mem.raw windows.netstat
vol -f mem.raw windows.netscan
# 文件 / 注册表
vol -f mem.raw windows.filescan
vol -f mem.raw windows.dumpfiles --virtaddr 0x????
vol -f mem.raw windows.registry.hivelist
vol -f mem.raw windows.registry.printkey --key 'Software\Microsoft\Windows\CurrentVersion\Run'
# 凭据
vol -f mem.raw windows.hashdump
vol -f mem.raw windows.lsadump
vol -f mem.raw windows.cachedump

10.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-0144EternalBlue,被 WannaCry / NotPetya 武器化
CVE-2017-11882Office 公式编辑器 RCE,APT 钓鱼常用载体
CVE-2020-1472Zerologon,被 Conti / Ryuk 内网横向
CVE-2021-26855ProxyLogon,HAFNIUM 大规模植入 webshell
CVE-2021-34527PrintNightmare,被多家勒索家族复用提权
CVE-2021-40444MSHTML RCE,被 BazarLoader / Cobalt Strike 武器化
CVE-2021-44228Log4Shell,Conti / Khonsari 等利用
CVE-2022-26134Confluence OGNL,矿机 / 勒索的常见入口
CVE-2023-34362MOVEit Transfer SQLi,Cl0p 大规模数据勒索
CVE-2024-3094xz-utils 后门,供应链取证案例
CVE-2024-21412Defender SmartScreen Bypass,DarkGate / Phemedrone 利用
分享

如果這篇文章對你有幫助,歡迎分享給更多人!

恶意代码分析与数字取证
https://lemusakuya.com/posts/study-notes/network-security/10_恶意代码分析与数字取证/
作者
レム・咲く夜
發布於
2026-04-27
許可協議
CC BY-NC-SA 4.0

部分資訊可能已經過時

目錄