关键词:虚拟机仿真、VMDK、快照隔离、differencing disk、差分盘、.vmsd、.vmsn、网络隔离、VMware、VirtualBox、PVE
难度:进阶
前置知识:磁盘镜像制作、虚拟化基本原理、VMware/VirtualBox 任一工具的基本操作
一、概述
拿到可疑硬盘就"挂上跑起来看看",是取证里最贵的错误。
贵的不是挂载。挂载只是让你看见文件;启动系统是把执行权交给里面的东西,后果不可逆。
| 危害类型 |
具体表现 |
是否可逆 |
| 恶意程序激活 |
勒索软件加密全盘、木马启动、挖矿占满资源 |
不可逆 |
| 持久化被清除 |
恶意启动项被删、时间戳被改、反取证被卸载 |
不可逆(原始镜像仍在) |
| 网络扩散 |
木马向内网横向移动、勒索样本外泄 |
部分可逆,扩散已发生 |
| 时间线污染 |
系统时间跳变、$UsnJrnl 被新事件覆盖、事件日志轮转 |
不可逆(最隐蔽的伤害) |
| 触发反取证 |
虚拟机被检测、样本自毁、加密密钥被抹除 |
通常不可逆 |
最后一行和倒数第二行值得停下来看一眼。
时间线污染那一行是唯一一个"你什么都没做错"的项。一次正常启动就会写几百条事件日志、推进 $UsnJrnl、更新预读与注册表——而这些恰恰是判断"这台机器什么时候被做了什么"的核心依据。
虚拟机仿真是什么:一个受控的观察环境,用来看程序运行态、内存行为和网络连接意图。
它能不能用,取决于三条铁律:基础镜像永不改变、客户机写入全部进差分盘、网络完全隔离。技术要点就一句:让这台虚拟机无论怎么折腾,都动不到证据、碰不到你的网络。
它在流程里的位置,是分析环节的一条高风险分支,和只读挂载与安全接入平级但性质完全不同。
上游是格式准备——虚拟化平台要 VMDK 或 VHDX,不吃 RAW 和 E01,转换见证据格式与转换。它自己的前置是一个判断:这个问题真的需要仿真吗?能静态回答的,就不要启动系统。
下游是运行态分析。内存里看到的凭据与注入代码进内存取证总览,进程与注入的判读进进程与注入检测,网络连接意图进网络连接与流量痕迹。Windows 环境另有专门的坑——域控身份会在内网"复活",见Windows Server 环境仿真。
三条铁律展开成能执行的形式:
| 铁律 |
实现手段 |
违反后的后果 |
| 基础镜像永不改变 |
基础盘挂为只读;永远不勾 Consolidate |
证据镜像被改写,且无法察觉(哈希会变,但你不知道为什么变) |
| 写入全进差分盘 |
快照 + 差分盘承接;实验做完丢弃差分盘重建 |
同上 |
| 网络完全隔离 |
网卡移除或 Not Connected;传文件用只读 ISO |
木马横向移动、样本外泄、客户证据被送到第三方 |
事故多数出在第三条。快照人人记得拔,网线常常忘。
"从虚拟机往外送东西"这个方向同样是攻击方向。有的样本会自动上传到 C2 或样本库,那等于把客户证据送到第三方手里。
网络隔离的三种模式,安全性差了一个量级:
| 模式 |
访问宿主 |
访问互联网 |
评价 |
| 网卡断开(移除设备 / Not Connected) |
否 |
否 |
默认选择,也是本篇的立场 |
| Host-only |
能(共享宿主网段) |
否 |
仅用于把工具喂进去,不是安全选项 |
| NAT / 桥接 |
能 |
能 |
❌ 绝对禁止 |
Host-only 也不是安全的。恶意程序会扫描宿主网段,尝试 SMB 漏洞横向移动到宿主机。最安全的形态是"网卡根本不存在"——要传文件就用 ISO 只读挂载,别给虚拟机开网卡。
为什么用差分盘而不是克隆,这是仿真的技术核心。克隆一份 500 GB 镜像意味着额外 500 GB 空间加几十分钟复制,每次重新分析都要重来。差分盘把范式换成"基础镜像只读不动,差分盘承接全部写入,做完删掉重建":额外空间通常几百 MB,恢复初始状态是删一个文件,基础盘物理上不可能被改。
代价是它必须始终保持 parent/child 引用关系,单独拿出来是废数据。
本篇能回答:程序运行态的行为(解密后的代码、内存中的凭据、注入行为)、注册表之外的活的状态(服务、驱动、计划任务)、启动时自动执行了什么、程序试图建立的网络连接。
本篇不能回答,三条必须提前知道:
不能证明"没做过"——物理内存、真实驱动行为、加密通信的真实上下文都重现不了。
不能替代静态分析——没运行到的分支,你看不到。
不产生新证据——仿真不改变"镜像里有什么",只产生观察记录。所以产出是"观察记录"而不是"证据",报告里必须与静态分析结论分开陈述。这一条最容易破:把仿真的观察写成静态发现,等于把一次实验结果冒充成检材内容。
还有一条要单独说:环境本身会影响观察结果。恶意程序发现自己在虚拟机里会改行为——不执行、不解密、不外联。你在仿真里看到"程序很安静",可能恰恰是它发现被观察了。
所以"仿真中未观察到 X"这句话有多强的证据,取决于"你确信它没检测到虚拟机"这个前提。这个前提通常不成立。
读者前提:虚拟化平台的基本操作(VMware / VirtualBox / KVM 任一)、差分盘与 backing file 链的机制,最关键的一条是清楚"这台机器已经不是原始检材了"这个状态转换。产物是差分盘和观察记录,归档与留痕要求见第四章 4.4 组。目标主机是否真的关机还没确认,本篇就不该开始。
二、核心原理
2.1 仿真的三层隔离模型
隔离靠三层手段叠加,缺一层就可能被绕过:
| 层 |
隔离对象 |
技术手段 |
被绕过后的后果 |
| L1 磁盘隔离 |
原始镜像数据 |
基础镜像只读 + 差分盘承接写入 |
证据永久改变 |
| L2 网络隔离 |
你的网络、互联网 |
网卡断开 / Not connected |
木马扩散、样本外泄 |
| L3 环境隔离 |
宿主机 |
快照回滚、随时弃用、专用主机 |
宿主机被感染、横向渗透 |
事故多数发生在 L2。快照人人记得拍,网线常常忘拔。
2.2 为什么必须用差分盘而不是克隆
直觉做法是"复制一份镜像再启动"。500 GB 盘上意味着额外 500 GB 空间和几十分钟复制,而且每次重新分析都要重来一遍。差分盘换掉了这个范式:
基础镜像 DigiForensics-base.vmdk ← 永远只读,永不修改
▲ 读取(未命中时穿透)
│
差分盘 DigiForensics-delta.vmdk ← 客户机所有写入落在这里
| 特性 |
完整克隆 |
差分盘 |
| 额外空间 / 准备时间 |
= 镜像全量 / 分钟到小时 |
通常几百 MB / 秒级 |
| 恢复初始状态 |
再复制一次 |
删掉差分盘,重建 |
| 多次并行分析 |
需多份克隆 |
同一基础盘挂多个差分盘 |
| 基础盘是否安全 |
克隆期间也是副本 |
只读,物理上不可能被改 |
差分盘的读取规则:先查差分盘,命中就返回;未命中就穿透到基础盘。所以它必须始终保持 parent/child 引用关系,单独拿出来是废数据。
2.3 VMware 快照的文件级真相
快照不是备份。它是一组文件加一个指针:
| 文件 |
作用 |
误操作后果 |
*.vmsd |
快照元数据:名字、描述、创建时间、uid,以及"当前状态指向哪个快照" |
删掉它,快照树信息丢失 |
*-Snapshot1.vmsn |
快照点的运行状态:内存镜像、CPU/设备寄存器状态 |
删掉它,快照只能冷启动恢复 |
*-000001.vmdk |
差分盘文件,后续写入全落这里 |
删掉 = 快照之后的所有操作记录全丢 |
*.vmx |
虚拟机配置文件 |
改它只改硬件,不影响差分盘内容 |
关键认知:拍快照时 VMware 做三件事——冻结基础盘、创建新差分盘承接写入、把内存状态存进 .vmsn。恢复时反过来:丢弃当前差分盘,以快照点为基线重建。
快照树是栈结构(LIFO)。有子快照时,父快照不能直接删。
2.4 快照的三种"退场方式"差异极大
| 操作 |
基础盘 |
当前状态 |
能否回到快照点 |
| Revert / Rollback |
不变 |
丢弃 |
能,立刻 |
| Delete + Consolidate |
被合并写入 |
合并进基础盘 |
不能,数据已回写 |
| Delete(保留分支) |
不变 |
保留为新分支 |
能(在该分支上) |
取证场景铁律:永远不要对证据机做 Consolidate。 合并会把差分盘内容写回基础盘,证据镜像就此被改写。看到 Delete snapshot and consolidate changes 选项时,取证机上一律不勾。
2.5 快照点应该选在哪里
| 快照时机 |
用途 |
评价 |
| 开机前(vmx 就绪、首次启动前) |
观察"系统启动时自动发生什么" |
⭐⭐⭐⭐⭐ 必做,见第 05 篇 |
| 首次登录后、运行可疑程序前 |
观察程序的直接行为 |
⭐⭐⭐⭐⭐ 必做 |
| 执行完一轮操作后 |
归档当前实验状态 |
⭐⭐ 只在需保留中间结论时做 |
绝对不能作为快照点的时机:刚导入镜像尚未做隔离配置时(快照的是"裸机状态",回滚回去依然裸奔);可疑程序已经运行之后(污染已发生);Consolidate 产生的"干净快照"(基线本身已被污染)。
标准流程是"两次快照":导入镜像 → 完成所有配置(网络、硬件、共享目录)→ 快照 A(baseline) → 首次启动 → 执行分析 → 需要时快照 B → 继续深挖。
这样每次回滚的语义都明确:回 A 是"重新开始但配置还在",回 B 是"回到上一个发现点"。
快照树是栈结构(LIFO)。有子快照时,父快照不能直接删。
2.6 网络隔离的三种模式
| 模式 |
访问宿主 |
访问互联网 |
评价 |
| 网卡断开(移除网卡 / Not Connected) |
否 |
否 |
默认选择 |
| Host-only |
能(共享宿主网段) |
否 |
仅用于把工具喂进去 |
| NAT / 桥接(Bridged) |
能 |
能 |
❌ 绝对禁止 |
即使是 Host-only 也要警惕:恶意程序会扫描宿主网段,尝试 SMB 漏洞横向移动到宿主机。Host-only 的真实价值是"让分析人员能把工具喂进去",不是安全。最安全的是网卡完全不存在——需要传文件时用 ISO 只读挂载。
"从虚拟机往外送东西"的方向同样是攻击方向。有的样本会自动上传到 C2 或样本库,等于把客户证据送到第三方手里,可能构成数据泄露。
所以本篇的默认立场是:仿真机永远不联网。
2.7 仿真能带来什么、不能带来什么
能:程序运行态(解密后的代码、内存中的凭据、注入行为)、注册表之外的服务/驱动/计划任务等活的状态、网络连接意图。
不能,三条:
❌ 不能证明"没做过"——物理内存、真实驱动行为、加密通信都重现不了。
❌ 不能替代静态分析——没运行到的分支看不到。
❌ 不改变"镜像里有什么"。仿真不产生新证据,只产生观察记录。产出是"观察记录"而不是"证据",报告中必须与静态分析结论分开陈述。
三、操作步骤
3.1 第 1 步:格式转换与导入前的无损验证
# 1) 转换前基线哈希
sha256sum /evidence/master/DigiForensics.dd | tee /lab/vmdx-baseline.sha256
# 2) RAW → VMDK(streamOptimized 单文件,兼容性与空间效率都最好)
qemu-img convert -f raw -O vmdk -o subformat=streamOptimized \
/evidence/master/DigiForensics.dd /lab/vm/DigiForensics/DigiForensics-base.vmdk
# 3) 往返验证:VMDK 导回 RAW 再比哈希,必须逐字符一致
qemu-img convert -f vmdk -O raw /lab/vm/DigiForensics/DigiForensics-base.vmdk /tmp/rt.dd
sha256sum /tmp/rt.dd; rm -f /tmp/rt.dd
为什么导入前要做这三步:转换是唯一可能静默损坏数据的环节。VMware 也能直接读 RAW,但 streamOptimized 更省空间,而且能通过往返验证确认无损。
基础镜像的哈希必须在导入前后各确认一次。
3.2 第 2 步:创建虚拟机并做硬隔离
File → New Virtual Machine → I will install the operating system later → 选与检材相同的版本(版本不同会导致磁盘控制器与驱动行为不同),再选 I will not install an operating system disk image file
- 内存给 1/2 物理内存(不要超过宿主可用量,否则宿主交换反而更慢)
Remove 掉默认的 CD/DVD、打印机、串口等所有非必要设备
Customize Hardware → Network Adapter → 选 Not connected(不选 NAT,不选 Bridged)
Options → Guest Isolation → Copy paste from host 与 Drag and drop 关闭
为什么要删光驱和打印机:恶意软件检测虚拟机时经常检查这些设备是否存在,检测到就可能改变行为(休眠、退出、甚至自毁)。删设备是一种反检测加固。
3.3 第 3 步:挂载差分盘(VMware)
VMware 默认就是快照式差分,也可以显式创建:
cd /lab/vm/DigiForensics
# 显式创建基于基础盘的差分盘(parent 关系写进 .vmdk 描述符)
vmware-vdiskmanager -r DigiForensics-base.vmdk -t 0 DigiForensics-delta.vmdk
# 查看差分盘当前指向的 parent(只读查询,不修改任何数据)
grep -i parentFileNameHint DigiForensics-delta.vmdk
vmware-vdiskmanager -R 不要碰:该选项是修复(repair),会直接改写磁盘,不用于查看父子链。查父子关系只用 grep parentFileNameHint 或 qemu-img info --backing-chain。
GUI 里的标准取证配置是把 base VMDK 设为只读(磁盘设置里勾 Read Only),拍快照时 VMware 自动把写入重定向到新差分盘。这个"基盘只读 + 快照自动分叉"就是隔离的落点。
3.4 第 4 步:VirtualBox 差分盘与快照
VirtualBox 有两套差分机制,用途完全不同:
# ① immutable 模式:每次开机自动丢弃写入(一次性分析)
VBoxManage modifyhd /lab/DigiForensics-base.vmdk --type immutable --autoreset on
# ② 标准快照:parent/child 差分链,可多次回滚(--pause 拍完保持暂停)
VBoxManage snapshot DigiForensics-VM take "baseline" --pause
VBoxManage snapshot DigiForensics-VM list
VBoxManage snapshot DigiForensics-VM restore "baseline" # 回滚,丢弃当前状态
VBoxManage snapshot DigiForensics-VM delete "baseline" # 非合并删除
# ③ 网络与外设一并收紧
VBoxManage modifyvm DigiForensics-VM --nic1 none --share-folder none --uart1 0
restore 等价 VMware 的 Revert。快照树同为 LIFO,删父快照前必须先删子快照。
3.5 第 5 步:PVE / KVM 快照法(团队协作场景)
实验室常用 Proxmox VE 集中管理,成员通过浏览器操作。这种情况下隔离更依赖平台策略:
# ① 建 VM:--net0 none 直接无网卡;-import-from 会把 VMDK 复制成私有 qcow2
qm create 101 --name DigiForensics-VM --memory 4096 --cores 2 \
--net0 none --ostype win10 --scsihw virtio-scsi-pci \
--scsi0 local-lvm:512,import-from=/lab/vm/DigiForensics/DigiForensics-base.vmdk
# ② 拍快照(--vmstate 1 连内存一起保存)→ ③ 回滚(保持关机态)→ ④ 删除 → ⑤ 确认
qm snapshot 101 pre-analysis --vmstate 1 --description "baseline before any execution"
qm rollback 101 pre-analysis --start 0
qm delsnapshot 101 pre-analysis
qemu-img info --backing-chain /var/lib/vz/images/101/vm-101-disk-0.qcow2
两个注意点。--vmstate 1 会把内存写入宿主,宿主内存要留够;不带 vmstate 的快照,恢复后是关机态。
qm rollback 与 qm delsnapshot 都是真操作。但由于导入用了 -import-from(PVE 把 VMDK 复制为私有 qcow2),原始 VMDK 从此只读。这一点必须在案例记录里写明。
3.6 第 6 步:录屏留痕、收工与归档
录屏是仿真中"观察结论"唯一的可复核载体。界面状态、弹窗内容、命令行回显,都无法从镜像里重建。所以报告里每句"仿真中程序弹出了 XX 提示",都要能对应到一个录屏时间点。