使用 dd 和 dcfldd 获取磁盘镜像 是做什么的?
何时使用
- 当你需要创建用于调查的嫌疑驱动器法医副本时
- 在事件响应期间,需要在分析前保存易失性磁盘证据时
- 当法律或执法程序需要经过验证的逐位副本时
- 在对存储设备执行任何破坏性分析之前
- 从物理驱动器、USB 设备或存储卡获取镜像时
先决条件
- 基于 Linux 的取证工作站(SIFT、Kali 或任何 Linux 发行版)
dd(所有 Linux 系统预装)或dcfldd(增强法医版)- 已配置写入阻断器硬件或软件写入阻断
- 具有足够存储空间的目标驱动器(大于源驱动器)
- 取证工作站上的 root/sudo 权限
- SHA-256 或 MD5 哈希工具(
sha256sum、md5sum)
工作流
步骤 1:识别目标设备并启用写入保护
# 列出所有连接的块设备以识别目标
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
# 验证设备详情
fdisk -l /dev/sdb
# 启用软件写入阻断(如果没有硬件写入阻断器)
blockdev --setro /dev/sdb
# 验证只读状态
blockdev --getro /dev/sdb
# 输出:1(表示已启用只读)
# 或者,使用 udev 规则实现持久写入阻断
echo 'SUBSYSTEM=="block", ATTRS{serial}=="WD-WCAV5H861234", ATTR{ro}="1"' > /etc/udev/rules.d/99-writeblock.rules
udevadm control --reload-rules
步骤 2:准备目标位置并记录源信息
# 创建案例目录结构
mkdir -p /cases/case-2024-001/{images,hashes,logs,notes}
# 记录源驱动器信息
hdparm -I /dev/sdb > /cases/case-2024-001/notes/source_drive_info.txt
# 记录序列号和型号
smartctl -i /dev/sdb >> /cases/case-2024-001/notes/source_drive_info.txt
# 对源设备进行预哈希
sha256sum /dev/sdb | tee /cases/case-2024-001/hashes/source_hash_before.txt
步骤 3:使用 dd 获取镜像
# 基本的 dd 采集,包含进度显示和错误处理
dd if=/dev/sdb of=/cases/case-2024-001/images/evidence.dd \
bs=4096 \
conv=noerror,sync \
status=progress 2>&1 | tee /cases/case-2024-001/logs/dd_acquisition.log
# 压缩镜像以节省空间
dd if=/dev/sdb bs=4096 conv=noerror,sync status=progress | \
gzip -c > /cases/case-2024-001/images/evidence.dd.gz
# 使用指定计数的 dd 进行部分采集
dd if=/dev/sdb of=/cases/case-2024-001/images/first_1gb.dd \
bs=1M count=1024 status=progress
步骤 4:使用 dcfldd 获取镜像(首选取证方法)
# 安装 dcfldd(如果未安装)
apt-get install dcfldd
# 使用内置哈希和分块输出获取镜像
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256,md5 \
hashwindow=1G \
hashlog=/cases/case-2024-001/hashes/acquisition_hashes.txt \
bs=4096 \
conv=noerror,sync \
errlog=/cases/case-2024-001/logs/dcfldd_errors.log
# 将大镜像拆分为可管理的大小
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256 \
hashlog=/cases/case-2024-001/hashes/split_hashes.txt \
bs=4096 \
split=2G \
splitformat=aa
# 带验证过程的采集
dcfldd if=/dev/sdb \
of=/cases/case-2024-001/images/evidence.dd \
hash=sha256 \
hashlog=/cases/case-2024-001/hashes/verification.txt \
vf=/cases/case-2024-001/images/evidence.dd \
verifylog=/cases/case-2024-001/logs/verify.log
步骤 5:验证镜像完整性
# 对获取的镜像进行哈希
sha256sum /cases/case-2024-001/images/evidence.dd | \
tee /cases/case-2024-001/hashes/image_hash.txt
# 比较源哈希和镜像哈希
diff <(sha256sum /dev/sdb | awk '{print $1}') \
<(sha256sum /cases/case-2024-001/images/evidence.dd | awk '{print $1}')
# 如果使用分块镜像,验证每个分块
sha256sum /cases/case-2024-001/images/evidence.dd.* | \
tee /cases/case-2024-001/hashes/split_image_hashes.txt
# 重新哈希源设备以确认未发生更改
sha256sum /dev/sdb | tee /cases/case-2024-001/hashes/source_hash_after.txt
diff /cases/case-2024-001/hashes/source_hash_before.txt \
/cases/case-2024-001/hashes/source_hash_after.txt
步骤 6:记录采集过程
# 生成采集报告
cat << 'EOF' > /cases/case-2024-001/notes/acquisition_report.txt
磁盘镜像采集报告
==============================
案件编号:2024-001
日期/时间:$(date -u +"%Y-%m-%d %H:%M:%S UTC")
检查员:[姓名]
源设备:/dev/sdb
型号:[来自 hdparm 输出]
序列号:[来自 hdparm 输出]
大小:[来自 fdisk 输出]
采集工具:dcfldd v1.9.1
块大小:4096
写入阻断器:[硬件/软件型号]
镜像文件:evidence.dd
镜像哈希(SHA-256):[来自哈希文件]
源哈希(SHA-256):[来自哈希文件]
哈希匹配:是/否
采集期间错误:[来自错误日志]
EOF
# 压缩日志用于归档
tar -czf /cases/case-2024-001/acquisition_package.tar.gz \
/cases/case-2024-001/hashes/ \
/cases/case-2024-001/logs/ \
/cases/case-2024-001/notes/
关键概念
| 概念 | 描述 |
|---|---|
| 逐位复制 | 源设备的精确副本,包括未分配空间和松散空间 |
| 写入阻断器 | 阻止对证据介质进行写入的硬件或软件机制 |
| 哈希验证 | 比较源和镜像的加密哈希以证明完整性 |
| 块大小 (bs) | 影响速度的传输块大小;法医领域通常使用 4096 或 64K |
| conv=noerror,sync | 遇到读取错误时继续并用零填充以保持偏移对齐 |
| 证据保管链 | 证明证据未被篡改的文档化追溯 |
| 分块成像 | 将大镜像拆分为较小的文件以便存储和传输 |
| Raw/dd 格式 | 无元数据容器开销的逐位镜像格式 |
工具与系统
| 工具 | 用途 |
|---|---|
| dd | 标准 Unix 磁盘复制工具,用于原始成像 |
| dcfldd | 美国国防部计算机取证实验室增强版 dd,带哈希功能 |
| dc3dd | 来自美国国防部网络犯罪中心的另一种法医版 dd 变体 |
| sha256sum | 用于完整性验证的 SHA-256 哈希计算 |
| blockdev | Linux 命令,用于设置块设备只读模式 |
| hdparm | 驱动器识别和参数报告 |
| smartctl | 用于驱动健康状态和识别的 S.M.A.R.T. 数据检索 |
| lsblk | 块设备枚举和识别 |
常见场景
场景 1:获取嫌疑笔记本电脑硬盘
通过 Tableau T35u 硬件写入阻断器连接驱动器,识别为 /dev/sdb,使用带有 SHA-256 哈希的 dcfldd,将镜像拆分为 4GB 段以便刻录 DVD,验证哈希匹配,记录在案件说明中。
场景 2:对受感染工作站的 USB 闪存驱动器进行成像
使用 blockdev --setro 软件写入阻断,使用包含 MD5 和 SHA-256 双重哈希的 dcfldd 进行采集,镜像足够小可存为单一文件,验证后存储在加密的案件驱动器上。
场景 3:通过网络进行远程采集
使用通过 netcat 或 ssh 管道传输的 dd 进行远程采集:ssh root@remote "dd if=/dev/sda bs=4096" | dd of=remote_image.dd bs=4096,分别对两端进行哈希以验证传输完整性。
场景 4:从故障驱动器获取镜像
首先使用 ddrescue 恢复可读扇区,然后使用带 conv=noerror,sync 的 dd 用零填充间隙,在错误日志中记录哪些扇区无法读取。
输出格式
采集摘要:
源设备: /dev/sdb (500GB Western Digital WD5000AAKX)
目标位置: /cases/case-2024-001/images/evidence.dd
工具: dcfldd 1.9.1
块大小: 4096 字节
持续时间: 2 小时 15 分 32 秒
复制字节数: 500,107,862,016
错误: 0 个坏扇区
源 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
镜像 SHA-256: a3f2b8c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1
验证结果: 通过 - 哈希匹配