dd 在取证里做什么
dd 是 Linux/Unix 上的块级复制工具,按偏移与长度从源设备读取字节并原样写出,因此可以把整块磁盘、单个分区或分区内的一段区域复制成镜像文件,不经过文件系统层,也就不会因为文件被删除、隐藏而漏掉内容。它是证据固定环节最基础的工具,但默认参数只是「能拷完」,要用于取证还需要显式处理读取错误、显示进度并立即做完整性校验。
基本信息
| 适用平台 | Linux、macOS、BSD;Windows 侧可用 WSL 或同类工具 |
|---|---|
| 核心参数 | if= 输入、of= 输出、bs= 块大小、count= 块数、skip/seek= 偏移 |
| 容错参数 | conv=noerror,sync 遇读错误继续并做填充 |
| 进度显示 | status=progress(较新 coreutils);旧版本收到 SIGUSR1 也可打印进度 |
| 权限要求 | 读取裸设备需要 root 或 disk 组 |
| 前置条件 | 源盘已卸载或只读,且未被自动挂载 |
典型使用场景
- 把可疑硬盘整盘固定成镜像,之后所有分析都针对副本
- 只采集单个分区或分区起始一小段,用于快速验证
- 采集移动存储介质,保留删除文件的可恢复性
- 为后续工具(fls、psteal、fsstat)准备原始镜像输入
- 在写阻断器不可得时,用只读方式尽快完成一次性复制
- 把镜像写回另一块同规格磁盘以复现现场
采集与记录
采集与记录
# 先确认设备名与容量,核对序列号避免拷错盘
lsblk -o NAME,SIZE,SERIAL,MOUNTPOINT
# 卸载源盘并让其只读(能配写阻断器时优先用硬件阻断)
sudo umount /dev/sdb* 2>/dev/null; sudo blockdev --setro /dev/sdb
# 采集:4M 块大小,遇错继续并填充,显示进度
sudo dd if=/dev/sdb of=/evidence/sdb.dd bs=4M conv=noerror,sync status=progress
# 立刻计算并记录镜像哈希
sha256sum /evidence/sdb.dd | tee /evidence/sdb.sha256
# 源盘仍在位时,可比对源与镜像哈希(大容量耗时较长)
sudo sha256sum /dev/sdb
# 事后校验:把记录值交给 sha256sum 复核
sha256sum -c /evidence/sdb.sha256常用参数逐项读法
| 参数 | 作用 | 注意事项 |
|---|---|---|
| if=/of= | 指定输入与输出 | 允许是设备或普通文件;写错 of 会覆盖目标盘 |
| bs= | 一次读写多少字节 | 影响速度与日志粒度,4M 是常见折中;改块大小要重新评估读取错误 |
| conv=noerror,sync | 遇读错误不中止,用零填充补齐 | 坏块被零填充后镜像长度与源一致,报告必须注明 |
| status=progress | 运行时输出进度与速率 | 长任务必备,便于判断是否卡死在坏道上 |
| skip=/seek= | 按块跳过输入或输出偏移 | 单位是块不是字节,与 count 配合做局部采集 |
| count= | 限制复制块数 | 用于只取分区头部或抽样验证 |
采集前先停掉自动挂载(udev/udisks 会在设备接入瞬间挂载并写日志),否则源盘可能被写入。软件只读挡不住内核自动挂载,物理写阻断器与 udev 规则配合使用更可靠。
dd 本身不记录操作日志。规范流程里更推荐带哈希与日志功能的 dc3dd,或对坏道介质使用可续跑的 ddrescue;用 dd 时至少手工记录起止时间、命令、块大小与读取错误数。