# Recovering Deleted Files With Photorec

> 使用 PhotoRec 基于文件签名的数据雕刻（File Carving）引擎，从磁盘镜像和存储介质中恢复已删除文件，无论文件系统是否损坏。

- Skill: `killvxk/recovering-deleted-files-with-photorec` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/recovering-deleted-files-with-photorec`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/recovering-deleted-files-with-photorec/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/recovering-deleted-files-with-photorec

---


# 使用 PhotoRec 恢复已删除文件

## 适用场景
- 从取证磁盘镜像或存储设备恢复已删除文件时
- 文件系统损坏、已格式化或被覆写时
- 调查中需要恢复文档、图像、视频或数据库时
- 文件系统元数据不可用但原始数据扇区仍完整时
- 从存储卡、USB 驱动器和硬盘恢复文件时

## 前置条件
- 已安装 PhotoRec（TestDisk 套件的一部分）
- 取证磁盘镜像或直接设备访问（只读）
- 充足的输出存储空间（可能大于源数据）
- 使用原始介质时需使用写保护器
- 设备访问所需的 root/sudo 权限
- 了解目标文件类型以进行有针对性的恢复

## 工作流程

### 步骤 1：安装 PhotoRec 并准备环境

```bash
# 在 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
```

### 步骤 2：以交互模式运行 PhotoRec

```bash
# 对取证镜像启动 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
```

### 步骤 3：使用命令行选项运行 PhotoRec 进行定向恢复

```bash
# 非交互模式，指定特定文件类型
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
```

### 步骤 4：整理和编目恢复的文件

```bash
# 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
```

### 步骤 5：验证和过滤恢复的文件

```bash
# 使用文件签名验证文件完整性
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
```

