Recovers deleted files from disk images and storage media using PhotoRec file carving, even if filesystems are damaged or formatted. For digital forensics and evidence recovery.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 从取证磁盘镜像或存储设备恢复已删除文件时
Recovers deleted files from disk images and storage media using PhotoRec's signature-based carving, bypassing damaged file systems. For forensic investigations.
Recover deleted files from disk images and storage media using PhotoRec's file carving engine, bypassing damaged or missing file systems.
Recovers files from disk images and unallocated space using Foremost header/footer signature carving for evidence extraction in digital forensics, regardless of filesystem state.
Share bugs, ideas, or general feedback.
# 在 Debian/Ubuntu 上安装 TestDisk(包含 PhotoRec)
sudo apt-get install testdisk
# 在 RHEL/CentOS 上安装
sudo yum install testdisk
# 在 macOS 上安装
brew install testdisk
# 验证安装
photorec --version
# 创建输出目录结构
mkdir -p /cases/case-2024-001/recovered/{all,documents,images,databases}
# 验证取证镜像
file /cases/case-2024-001/images/evidence.dd
ls -lh /cases/case-2024-001/images/evidence.dd
# 对取证镜像启动 PhotoRec
photorec /cases/case-2024-001/images/evidence.dd
# 交互菜单操作步骤:
# 1. 选择磁盘镜像:evidence.dd
# 2. 选择分区表类型:[Intel] 表示 MBR,[EFI GPT] 表示 GPT
# 3. 选择要扫描的分区(或选"No partition"扫描整个磁盘)
# 4. 选择文件系统类型:[ext2/ext3/ext4] 或 [Other] 表示 NTFS/FAT
# 5. 选择扫描范围:[Free](仅未分配空间)或 [Whole](整个分区)
# 6. 选择输出目录:/cases/case-2024-001/recovered/all/
# 7. 按 C 确认并开始恢复
# 直接扫描设备(使用写保护器时)
sudo photorec /dev/sdb
# 非交互模式,指定特定文件类型
photorec /d /cases/case-2024-001/recovered/documents/ \
/cmd /cases/case-2024-001/images/evidence.dd \
partition_table,options,mode,fileopt,search
# 仅恢复特定文件类型
photorec /d /cases/case-2024-001/recovered/documents/ \
/cmd /cases/case-2024-001/images/evidence.dd \
options,keep_corrupted_file,enable \
fileopt,everything,disable \
fileopt,doc,enable \
fileopt,docx,enable \
fileopt,pdf,enable \
fileopt,xlsx,enable \
search
# 仅恢复图像文件
photorec /d /cases/case-2024-001/recovered/images/ \
/cmd /cases/case-2024-001/images/evidence.dd \
fileopt,everything,disable \
fileopt,jpg,enable \
fileopt,png,enable \
fileopt,gif,enable \
fileopt,bmp,enable \
fileopt,tif,enable \
search
# 恢复数据库文件
photorec /d /cases/case-2024-001/recovered/databases/ \
/cmd /cases/case-2024-001/images/evidence.dd \
fileopt,everything,disable \
fileopt,sqlite,enable \
fileopt,dbf,enable \
search
# PhotoRec 将文件输出到 recup_dir.1、recup_dir.2 等目录
ls /cases/case-2024-001/recovered/all/
# 按类型统计恢复文件数量
find /cases/case-2024-001/recovered/all/ -type f | \
sed 's/.*\.//' | sort | uniq -c | sort -rn > /cases/case-2024-001/recovered/file_type_summary.txt
# 按扩展名将恢复文件整理到各目录
cd /cases/case-2024-001/recovered/all/
for ext in jpg png pdf docx xlsx pptx zip sqlite; do
mkdir -p /cases/case-2024-001/recovered/sorted/$ext
find . -name "*.$ext" -exec cp {} /cases/case-2024-001/recovered/sorted/$ext/ \;
done
# 为所有恢复文件生成 SHA-256 哈希值
find /cases/case-2024-001/recovered/all/ -type f -exec sha256sum {} \; \
> /cases/case-2024-001/recovered/recovered_hashes.txt
# 生成带元数据的文件列表
find /cases/case-2024-001/recovered/all/ -type f \
-printf "%f\t%s\t%T+\t%p\n" | sort > /cases/case-2024-001/recovered/file_listing.txt
# 使用文件签名验证文件完整性
find /cases/case-2024-001/recovered/all/ -type f -exec file {} \; \
> /cases/case-2024-001/recovered/file_signatures.txt
# 查找扩展名与签名不匹配的文件
while IFS= read -r line; do
filepath=$(echo "$line" | cut -d: -f1)
filetype=$(echo "$line" | cut -d: -f2-)
ext="${filepath##*.}"
if [[ "$ext" == "jpg" ]] && ! echo "$filetype" | grep -qi "JPEG"; then
echo "MISMATCH: $filepath -> $filetype"
fi
done < /cases/case-2024-001/recovered/file_signatures.txt > /cases/case-2024-001/recovered/mismatches.txt
# 使用 NSRL 哈希集比对过滤已知良性文件
hashdeep -r -c sha256 /cases/case-2024-001/recovered/all/ | \
grep -vFf /opt/nsrl/nsrl_sha256.txt > /cases/case-2024-001/recovered/unknown_files.txt
# 删除零字节和损坏的文件
find /cases/case-2024-001/recovered/all/ -type f -empty -delete
find /cases/case-2024-001/recovered/all/ -name "*.jpg" -exec jpeginfo -c {} \; 2>&1 | \
grep "ERROR" > /cases/case-2024-001/recovered/corrupted_images.txt
| 概念 | 描述 |
|---|---|
| 文件雕刻(File carving) | 使用文件头/尾签名从原始数据中恢复文件 |
| 文件签名 | 文件开头的魔术字节,用于标识文件类型(例如 JPEG 为 FF D8 FF) |
| 未分配空间(Unallocated space) | 未分配给任何活动文件的磁盘扇区;可能包含已删除数据 |
| 碎片文件(Fragmented files) | 存储在非连续扇区的文件;更难完整雕刻 |
| 簇/块大小(Cluster/Block size) | 文件系统上的最小分配单元;影响雕刻粒度 |
| 文件尾(File footer) | 标记文件结束的字节序列(并非所有格式都有文件尾) |
| 数据残留(Data remanence) | 删除后残留的数据,直到扇区被覆写才消失 |
| 误报(False positives) | 匹配签名但包含损坏或不完整数据的雕刻制品 |
| 工具 | 用途 |
|---|---|
| PhotoRec | 支持 300+ 种文件格式的开源文件雕刻工具 |
| TestDisk | 用于分区恢复和修复的配套工具 |
| Foremost | 最初由美国空军 OSI 开发的替代文件雕刻工具 |
| Scalpel | 基于 Foremost 的高性能文件雕刻工具 |
| hashdeep | 递归哈希计算和审计工具 |
| jpeginfo | JPEG 文件完整性验证 |
| file | 通过魔术字节识别文件类型的 Unix 工具 |
| exiftool | 从恢复的图像和文档文件中提取元数据 |
场景 1:从嫌疑人 USB 驱动器恢复已删除证据 使用 dcfldd 对 USB 驱动器进行镜像,运行 PhotoRec 针对文档和图像格式进行恢复,按文件类型整理,对所有恢复文件计算哈希值,与已知恶意哈希集比对,从图像中提取 GPS 和时间戳元数据信息。
场景 2:格式化硬盘恢复 在整个已格式化分区上以"Whole"模式运行 PhotoRec,恢复所有文件类型,预期因文件碎片化导致较高误报率,使用签名检查验证恢复文件,为证据链建立编目和哈希记录。
场景 3:监控摄像头存储卡 从存储卡镜像恢复已删除视频文件(AVI、MP4、MOV),使用定向文件类型选择加快恢复速度,验证视频文件可播放,提取帧时间戳,在案件笔记中记录恢复情况。
场景 4:证据驱动器上的文件系统损坏 当文件系统元数据被破坏时,PhotoRec 完全绕过文件系统直接从原始扇区雕刻,尽可能多地恢复数据,接受文件名和目录结构将丢失的现实,在审查过程中根据内容重命名文件。
PhotoRec 恢复摘要:
源镜像: evidence.dd(500 GB)
分区: NTFS(分区 2)
扫描模式: 仅空闲空间
已恢复文件: 4,523 个
文档: 234 个(doc:45,docx:89,pdf:67,xlsx:33)
图像: 2,145 个(jpg:1,890,png:198,gif:57)
视频: 34 个(mp4:22,avi:12)
压缩包: 67 个(zip:45,rar:22)
数据库: 12 个(sqlite:8,dbf:4)
其他: 2,031 个
已恢复数据: 12.4 GB
损坏文件: 312 个(已标记待审查)
输出目录: /cases/case-2024-001/recovered/all/
哈希清单: /cases/case-2024-001/recovered/recovered_hashes.txt