虚拟机仿真

拿到可疑硬盘就"挂上跑起来看看",是取证里最贵的错误。

最后更新 2026-10-09版本 v1.0维护 DigiForensics查看历史 0

关键词:虚拟机仿真、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 步:创建虚拟机并做硬隔离

  1. File → New Virtual Machine → I will install the operating system later → 选与检材相同的版本(版本不同会导致磁盘控制器与驱动行为不同),再选 I will not install an operating system disk image file
  2. 内存给 1/2 物理内存(不要超过宿主可用量,否则宿主交换反而更慢)
  3. Remove 掉默认的 CD/DVD、打印机、串口等所有非必要设备
  4. Customize Hardware → Network Adapter → 选 Not connected(不选 NAT,不选 Bridged)
  5. 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 提示",都要能对应到一个录屏时间点。

安全验证 当前请求需要先完成一次滑块验证。