Bernard411/deep-recover
GitHub: Bernard411/deep-recover
一款基于双引擎(文件系统元数据解析与原始特征码挖掘)的磁盘文件恢复 CLI 工具,用于从 U 盘、SD 卡及硬盘镜像中找回已删除的数据。
Stars: 1 | Forks: 0
# deep-recover
使用两种互补的引擎从磁盘镜像(U 盘、SD 卡、硬盘镜像)中恢复已删除的文件:
1. **元数据恢复** — 通过 [`pytsk3`](https://github.com/py4n6/pytsk) 解析实际的文件系统结构(FAT 目录项、NTFS MFT、ext2/3/4 inode 表),以查找仍标记为“已删除”但其数据尚未被覆盖的条目。提供真实的文件名、大小和时间戳。
2. **特征码挖掘** — 扫描原始字节以查找文件“魔术字”(`carver.py`),独立于任何文件系统元数据。即使文件系统索引已损坏或驱动器已格式化,它也能工作,代价是丢失文件名,有时还会丢失准确的文件边界。
`deep-recover` 默认同时运行两者,并通过内容哈希对结果进行去重。
## 合法 / 道德使用
仅对你**拥有**或已获得**明确书面授权**进行检查的介质(例如:你自己的 U 盘、你签约调查的驱动器)运行此程序。在大多数司法管辖区,从你无权访问的设备中恢复数据是非法的,毫无例外。此工具不会破解加密,不会触及远程/网络系统,也不会做任何现场人工取证检查员使用十六进制编辑器无法手动完成的操作——它只是将其自动化了。
## 安装
[](https://pypi.org/project/deep-recover/)
**从 PyPI 安装(推荐):**
```
pip install deep-recover
```
这将安装带有特征码挖掘引擎的 CLI,可直接使用。要同时获取文件系统元数据引擎(推荐——更准确,能恢复真实的文件名):
```
pip install deep-recover[metadata]
```
`pytsk3`(元数据引擎的依赖项)在某些系统上需要构建工具:
```
sudo apt install build-essential python3-dev libtsk-dev
pip install deep-recover[metadata]
```
如果 `pytsk3` 安装失败,`deep-recover` 仍然可以工作——它只会自动回退到纯挖掘模式。
**从源码安装(用于开发):**
```
git clone https://github.com/Bernard411/deep-recover.git
cd deep-recover
pip install -e .[metadata] --break-system-packages # Kali/Debian externally-managed envs
```
## 快速开始
**第 1 步 — 切勿对正在使用的设备运行此操作。** 先对其进行镜像:
```
lsblk # find your USB stick, e.g. /dev/sdb
sudo umount /dev/sdb1 # unmount, don't format
sudo dd if=/dev/sdb of=usb_image.dd bs=4M status=progress
```
**第 2 步 — 对镜像而不是设备运行 deep-recover:**
```
deep-recover usb_image.dd -o ./recovered
```
输出:
```
deep-recover -- source: usb_image.dd
Output directory: ./recovered
[metadata] Found 3 deleted-but-intact file entries.
[carve] Scanning usb_image.dd for file signatures ...
[carve] Scanned 64 MB, found 2 files:
pdf : 1
png : 1
Done.
```
恢复的文件会存放在 `./recovered/` 中,以原始文件名(元数据引擎)或 `__.`(特征码挖掘引擎)命名。
## 用法
```
deep-recover SOURCE [-o OUTPUT] [--mode {auto,metadata,carve}] [--types TYPE [TYPE ...]] [--offset BYTES] [-v]
```
| 标志 | 描述 |
|---|---|
| `source` | 磁盘**镜像**(来自 `dd`)或镜像文件的路径。不能是已挂载的正在使用的设备。 |
| `-o, --output` | 用于存放恢复文件的目录(默认为 `./recovered`) |
| `--mode` | `auto`(默认,两个引擎都运行),`metadata`(仅限感知文件系统),`carve`(仅限原始特征码扫描) |
| `--types` | 将挖掘限制为特定格式,例如 `--types jpg png pdf` |
| `--offset` | 镜像内分区的字节偏移量 —— 如果你镜像的是**整个磁盘**(带有分区表)而不是单个分区,则需要此参数。使用 `fdisk -l usb_image.dd` 找到分区起始扇区,然后乘以 512。 |
| `-v, --verbose` | 在找到每个已恢复文件时记录 Debug 级别的日志 |
支持的挖掘类型:`jpg, png, gif, pdf, zip`(因为 docx/xlsx/pptx/apk/jar 都是 zip 容器,所以也会匹配它们),`gzip, bmp, mp4, sqlite, wav`。可以在 `deep_recover/signatures.py` 中添加更多类型。
**更多示例:**
```
# 仅恢复照片,跳过所有其他内容
deep-recover usb_image.dd -o ./recovered --types jpg png
# 仅运行 filesystem-metadata 引擎(速度快,获取真实文件名,需要 pytsk3)
deep-recover usb_image.dd -o ./recovered --mode metadata
# 仅进行 carve,完全跳过元数据解析(例如:filesystem 损坏严重无法挂载)
deep-recover usb_image.dd -o ./recovered --mode carve
# 带有分区表的 Whole-disk image:恢复从 sector 2048 开始的分区 1
deep-recover full_disk.dd -o ./recovered --offset $((2048 * 512))
# 详细日志记录 -- 查看被发现的每个文件,而不仅仅是摘要
deep-recover usb_image.dd -o ./recovered -v
```
## 工作原理
### 为什么“删除”并没有真正删除
删除文件会移除其目录/索引项(在 FAT 中,还会翻转文件名的第一个字节),并将其数据块标记为可重用。实际的字节会原封不动地保留在磁盘上,直到操作系统将其他内容写入该空间。这就是为什么恢复是可能的——也是为什么**在删除某些内容后,你使用驱动器的次数越少,恢复的成功率就越高。**
### 元数据引擎(`metadata_recovery.py`)
遍历文件系统自身的记录结构,寻找被标记为已删除但仍然存在的条目(用 Sleuth Kit 的术语来说是 `TSK_FS_META_FLAG_UNALLOC`)。如果这些条目指向的数据块仍然完好无损,它会按原始大小/顺序将它们读回——正确处理碎片化问题,而这是特征码挖掘无法做到的。这是准确的、“规范取证”的路径,因此会被首先尝试。
### 挖掘引擎(`carver.py`)
完全忽略文件系统,直接扫描原始字节以查找已知的文件特征码(例如 JPEG 的 `FF D8 FF`,PDF 的 `%PDF-`),从每个匹配点向前读取,直到遇到已知的结束标记或达到安全大小上限。这是在文件系统索引本身已丢失(快速格式化的驱动器、损坏的分区表)情况下的备用方案——代价是没有文件名,而且如果文件碎片化分散在不连续的块中,偶尔会产生损坏。
它以 8 MB 的块流式传输源数据,并带有一个小的重叠窗口,而不是将整个镜像加载到内存中,因此它可以扩展到整个磁盘的镜像,而不仅仅是小型 U 盘。
## 限制
- **SSD + TRIM。** 现代的 SSD(以及大多数现代操作系统)在删除后不久会发出 `TRIM` 命令,告诉驱动器为了磨损均衡而在硬件层面真正擦除这些块。一旦发生这种情况,任何软件——无论是此工具、`photorec`、`testdisk` 还是其他任何工具——都无法恢复数据。这主要影响内置 SSD;大多数 U 盘和 SD 卡不实现 TRIM,因此在那里的恢复几率要高得多。
- **被覆盖的块**会产生部分/损坏的输出,而不会报错——请在恢复后检查文件完整性。
- **挖掘碎片化文件**(分散在不连续磁盘区域中的文件)对于没有可靠结束标记的格式会产生损坏的输出。元数据引擎在可用时会正确处理碎片化;这正是将挖掘作为最后手段的原因。
- **加密卷**:如果磁盘已加密(LUKS, BitLocker, FileVault)且你没有密钥,恢复出的“数据”将是无法读取的密文——此工具不会也不会尝试破解加密。
## 与现有工具的比较
`deep-recover` 是一个学习/实用项目,并非成熟工具的替代品。对于生产环境的取证工作,还可以考虑:
- [`photorec`](https://www.cgsecurity.org/wiki/PhotoRec) / [`testdisk`](https://www.cgsecurity.org/wiki/TestDisk) — 成熟、久经考验的挖掘工具,支持更多格式
- [The Sleuth Kit](https://www.sleuthkit.org/sleuthkit/) / [Autopsy](https://www.autopsy.com/) — `metadata_recovery.py` 在此所做工作的全功能版本,带有 GUI 和案例管理功能
## 项目布局
```
deep_recover/
__init__.py
signatures.py # file signature database
carver.py # raw signature-carving engine
metadata_recovery.py # pytsk3-based filesystem-metadata engine
cli.py # command-line entry point
requirements.txt
setup.py
README.md
```
## 许可证
MIT — 详见 `LICENSE`。
标签:HTTP工具, pytsk3, 数字取证, 数据恢复, 文件雕刻, 文档结构分析, 磁盘分析, 自动化脚本, 身份验证滥用, 逆向工具