reimondpc/recoverx-cli
GitHub: reimondpc/recoverx-cli
RecoverX 是一款基于签名匹配的文件雕刻与取证恢复工具,可从原始磁盘镜像和块设备中提取已删除文件并生成结构化取证报告。
Stars: 0 | Forks: 0
RecoverX 通过基于签名的**文件雕刻**,从原始磁盘镜像(`.img`、`.dd`、`.raw`)和块设备中提取已删除或丢失的文件。其模块化架构使得添加新文件格式变得轻而易举——只需实现一个方法并注册一个签名即可。
## 功能
- **JPEG 雕刻** — 通过 SOI (`FFD8FF`) / EOI (`FFD9`) 标记检测提取 JPEG 图像,支持可配置的回溯窗口
- **原始镜像扫描** — 对磁盘镜像和物理块设备进行只读的扇区级和偏移量级访问
- **磁盘检测** — 枚举连接的磁盘、分区和块设备,并提供大小、类型和挂载点信息
- **只读架构** — 每一项磁盘操作都严格为只读;不对源镜像进行任何写入
- **模块化雕刻引擎** — `BaseCarver` ABC + `FileSignature` dataclass;只需创建一个文件即可添加 PNG/PDF/ZIP 支持
- **丰富的 CLI** — 通过 `rich` 实现彩色输出、实时进度条和格式化表格
- **双重日志记录** — 控制台 (INFO+) + 结构化文件日志 (DEBUG+)
- **高扩展性** — 插入式雕刻器、集中式签名注册表、带有自动命名功能的恢复管理器
- **PNG 雕刻** — 通过 `\x89PNG` 头部 / IEND 尾部签名匹配提取 PNG 图像
- **GIF 雕刻** — 同时支持 GIF87a 和 GIF89a 格式
- **BMP 雕刻** — 利用文件头中的文件大小进行精确提取
- **PDF 雕刻** — 通过 `%PDF` / `%%EOF` 标记提取 PDF
- **SHA-256 取证散列** — 在 CLI 输出中显示每个文件的 SHA-256 散列值;支持去重
- **散列数据库** — 跨运行的持久化 SHA-256 散列存储,用于去重和统计
- **分块流式扫描器** — 内存高效,可配置的块大小/重叠大小(默认为 4 MB)
- **内存映射扫描器** — 零拷贝读取,自动回退到流式扫描
- **多线程扫描器** — 使用 `--threads` CLI 标志进行基于区域的并行扫描
- **扫描基准测试** — 耗时、MB/s、CPU%、RAM、files/min;可导出为 JSON
- **JSON 取证报告** — 可用于取证管线的结构化输出(`--report report.json`)
- **文件系统检测** — 自动识别 FAT12/16/32、exFAT、NTFS、ext2/3/4
- **直接磁盘访问** — `recoverx devices` 列出连接的磁盘;`recoverx scan /dev/sdX` 读取原始设备(只读)
- **FAT32 文件系统分析** — 引导扇区解析、目录遍历 (SFN + LFN)、簇链读取
- **FAT32 已删除文件恢复** — 扫描 0xE5 标记的条目、重建簇链、使用 SHA-256 恢复
- **FAT32 CLI** — `recoverx fat32 info`、`list`、`deleted`、`recover` 命令及 `--json` 输出
- **测试套件** — 跨所有核心模块的 187 个 pytest 测试
## 安装
```
# Clone 仓库
git clone https://github.com/recoverx/recoverx.git
cd recoverx
# 创建并激活虚拟环境
python3 -m venv .venv
source .venv/bin/activate
# 安装包
pip install -e .
# (可选) 用于 linting 和 testing 的开发依赖
pip install -e ".[dev]"
```
## 使用方法
```
# 显示已连接的磁盘和分区
recoverx info
# 扫描磁盘镜像以查找可恢复的文件
recoverx scan sample.img
# 显示帮助
recoverx --help
```
### 命令
| 命令 | 描述 |
|------------------|--------------------------------------------------|
| `recoverx info` | 列出连接的磁盘、分区、块设备 |
| `recoverx scan` | 扫描镜像/设备并雕刻出可恢复的文件 |
### 示例输出
```
RecoverX — Scanning sample.img
Size: 10.0 MB
Sectors: 20,480
Reading image...
Reading... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.5/10.5 MB 0:00:00
Carving files...
[+] JPEG found at offset 204,800
SHA256: a1b2c3d4e5f6...
Saved: recovered/jpeg_001.jpg
[+] PNG found at offset 1,048,576
SHA256: f6e5d4c3b2a1...
Saved: recovered/png_001.png
Recovered Files
┏━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ # ┃ File ┃ Offset ┃ Size ┃ SHA256 ┃
┡━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 1 │ jpeg_001.jpg │ 0x32000 (204,800) │ 1014.0 B │ a1b2c3d4e5f6... │
│ 2 │ png_001.png │ 0x100000 (1,048,576) │ 2.5 KB │ f6e5d4c3b2a1... │
└───┴──────────────┴──────────────────────┴──────────┴────────────────────────────┘
Scan complete: 2 file(s) recovered in 0.32s (32.8 MB/s)
```
## 开发
```
source .venv/bin/activate
pip install -e ".[dev]"
```
### 测试
```
pytest -v
```
### 代码检查和格式化
```
black src/ tests/
isort src/ tests/
flake8 src/ tests/
```
### 生成测试镜像
```
python tests/create_sample.py
recoverx scan sample.img
```
## 架构
```
recoverx/
├── src/
│ └── recoverx/
│ ├── __init__.py # Package root
│ ├── cli/
│ │ ├── main.py # Typer app, command registration
│ │ └── commands/
│ │ ├── info.py # recoverx info — disk detection
│ │ └── scan.py # recoverx scan — carving pipeline
│ └── core/
│ ├── disk/
│ │ └── detector.py # psutil + /sys/block enumeration
│ ├── carving/
│ │ ├── base.py # BaseCarver ABC + CarvedFile / FileSignature
│ │ ├── jpg.py # JPEG carver (FFD8FF / FFD9)
│ │ ├── png.py # PNG carver (\x89PNG / IEND)
│ │ ├── gif.py # GIF carver (GIF87a / GIF89a)
│ │ ├── bmp.py # BMP carver (BM + header size)
│ │ ├── pdf.py # PDF carver (%PDF / %%EOF)
│ │ ├── streaming.py # Chunked streaming scanner with overlap
│ │ └── signatures.py # Centralised signature registry
│ ├── scanner/
│ │ ├── mmap_scanner.py # Memory-mapped scanner (zero-copy)
│ │ └── threaded_scanner.py # Parallel region-based scanner
│ ├── recovery/
│ │ └── manager.py # Auto-named output, counter per extension
│ ├── reporting/
│ │ └── json_report.py # JSON forensic report generator
│ ├── benchmark/
│ │ └── advanced_benchmark.py # CPU/RAM/throughput metrics
│ ├── filesystems/
│ │ ├── detector.py # FAT/NTFS/ext4/exFAT detection
│ │ └── fat32/ # FAT32 analysis and recovery
│ │ ├── boot_sector.py
│ │ ├── fat_table.py
│ │ ├── directory.py
│ │ └── recovery.py
│ └── utils/
│ ├── raw_reader.py # Read-only binary reader (offset/sector)
│ ├── logger.py # Rich console + file dual logging
│ ├── hashing.py # SHA-256 hashing, HashManager
│ ├── hash_database.py # Persistent hash storage / dedup
│ ├── benchmark.py # ScanBenchmark (elapsed, MB/s)
│ └── file_utils.py # format_size helper
├── tests/ # pytest suite (187 tests)
├── recovered/ # Carved file output (gitignored)
├── logs/ # Log files (gitignored)
├── signatures/ # Format signature definitions
├── pyproject.toml
├── requirements.txt
├── CHANGELOG.md
├── LICENSE
└── README.md
```
### 关键设计决策
- **`BaseCarver`** — 强制执行单一 `carve(data: bytes) -> list[CarvedFile]` 契约的抽象类。每种特定格式的雕刻器(JPEG、PNG 等)都是一个自包含的子类。
- **`RawReader`** — 上下文管理的只读二进制读取器。同时适用于文件和块设备。提供 `read_at(offset, size)` 和 `read_sector(sector)` 以实现灵活访问。
- **`RecoveryManager`** — 跟踪每个文件扩展名的计数器,从而使输出文件名具有确定性(`jpeg_001.jpg`、`jpeg_002.jpg` 等)。输出目录会自动创建。
- **签名注册表** — `signatures.py` 是一个单一的字典,用于将格式键映射到 `FileSignature` 实例。在此处添加一种格式只需一行代码,外加一个雕刻器类。
## 添加新文件格式
1. 在 `src/recoverx/core/carving/signatures.py` 中添加 `FileSignature`
2. 在 `src/recoverx/core/carving/` 中创建一个继承自 `BaseCarver` 的雕刻器
3. 在 `cli/commands/scan.py` 中将其连接到扫描管线
```
# signatures.py
SIGNATURES["png"] = FileSignature(
name="PNG", extension="png",
header=b"\x89PNG\r\n\x1a\n",
footer=b"\x00\x00\x00\x00IEND\xae\x42\x60\x82",
min_size=67,
)
# png.py
from .base import BaseCarver, CarvedFile
from .signatures import SIGNATURES
class PNGCarver(BaseCarver):
def __init__(self):
super().__init__(SIGNATURES["png"])
def carve(self, data: bytes) -> list[CarvedFile]:
# Implementation follows the same header/footer pattern as JPEGCarver
...
```
## 未来路线图
| 功能 | 状态 |
|-------------------------|------------|
| JPEG 雕刻 | ✅ 已完成 |
| PNG 雕刻 | ✅ 已完成 |
| GIF 雕刻 | ✅ 已完成 |
| BMP 雕刻 | ✅ 已完成 |
| PDF 雕刻 | ✅ 已完成 |
| SHA-256 散列 | ✅ 已完成 |
| 散列数据库 | ✅ 已完成 |
| 扫描基准测试 | ✅ 已完成 |
| 分块流式处理 | ✅ 已完成 |
| 内存映射扫描器 | ✅ 已完成 |
| 多线程扫描器 | ✅ 已完成 |
| JSON 取证报告 | ✅ 已完成 |
| 文件系统检测 | ✅ 已完成 |
| 直接磁盘访问 | ✅ 已完成 |
| FAT32 解析 | ✅ 已完成 |
| FAT32 文件恢复 | ✅ 已完成 |
| ZIP 雕刻 | 🔜 计划中 |
| NTFS 解析 | 🔜 计划中 |
| SSD/TRIM 感知 | 🔜 计划中 |
| ReFS / APFS 支持 | 🔜 计划中 |
| GUI (可选) | 🔜 计划中 |
## 许可证
在 **MIT 许可证**下分发。更多信息请参见 [`LICENSE`](LICENSE)。
标签:Awesome, File Carving, GIF, HTTP工具, JPEG, PNG, Python, 二进制分析, 云安全运维, 云资产清单, 删除文件恢复, 原始磁盘, 图片恢复, 块设备, 域渗透, 安全规则引擎, 库, 应急响应, 开源, 数字取证, 数据恢复, 数据提取, 文件恢复, 文件系统, 文件雕刻, 无后门, 模块化架构, 电子数据取证, 硬盘镜像, 磁盘分析, 系统管理, 网络信息收集, 网络安全, 自动化脚本, 逆向工程, 隐私保护