z0rhack/xcarver
GitHub: z0rhack/xcarver
一款结合文件系统感知恢复与原始雕刻的双引擎取证文件恢复工具,在文件系统部分损坏时仍能保留原始文件名完成高效恢复。
Stars: 0 | Forks: 0
# xCarver v4
**双引擎取证文件雕刻工具 — 感知文件系统的恢复 + 高性能原始雕刻**
## 为什么选择 xCarver?
大多数文件雕刻工具只做一件事:扫描原始字节以查找文件签名(Photorec、Foremost、Scalpel)。xCarver 同时执行两项操作并合并结果:
| 功能 | Photorec | Foremost | Scalpel | **xCarver v4** |
|---------|----------|----------|---------|----------------|
| 原始雕刻 | 是 | 是 | 是 | **是** |
| 感知文件系统的恢复(原始文件名) | 否 | 否 | 否 | **是** |
| 熵分析(跳过加密区域) | 否 | 否 | 否 | **是** |
| CTF 模式 + 熵热力图 | 否 | 否 | 否 | **是** |
| 会话恢复 | 否 | 否 | 否 | **是** |
| SHA256 交叉去重 FS↔Raw | 否 | 否 | 否 | **是** |
| 递归归档提取 | 否 | 否 | 否 | **是** |
| 结构验证器(不仅是魔数) | 部分 | 否 | 否 | **是** |
| 外部 JSON 签名 | 否 | 配置文件 | 配置文件 | **是** |
| 零强制依赖 | 是 | 是 | 是 | **是** |
| 持久化 C 扫描器(单次自动机构建) | — | — | — | **是** |
**核心区别**:当文件系统(FAT32、NTFS、ext4、HFS+...)部分完好时,xCarver 会利用其元数据恢复文件并保留原始名称、路径和时间戳 —— 而不仅仅是 `file_00001.jpg`。原始雕刻则填补了其他所有内容。
## 支持的文件系统(感知 FS 模式)
| 文件系统 | 已删除条目恢复 | 原始名称 | 时间戳 |
|-----------|----------------------|----------------|-----------|
| FAT12 / FAT16 / FAT32 | 是 | 是 | 是 |
| exFAT | 是 | 是 | 是 |
| NTFS | 是 (MFT + $LogFile + $UsnJrnl) | 是 | 是 |
| ext2 / ext3 / ext4 | 是 | 是 | 是 |
| HFS+ | 是 | 是 | 是 |
| APFS | 是 | 是 | 是 |
| F2FS | 是 | 是 | 是 |
| Btrfs | 是 | 是 | 是 |
| YAFFS2 | 是 | 是 | 是 |
## 支持的文件类型(119 种签名)
## 安装说明
### 前置条件
- Python 3.8+
- GCC(可选,但强烈推荐,可带来 10-50 倍的性能提升)
### 快速入门
```
git clone https://github.com/z0rhack/xcarver.git
cd xcarver
python3 carver.py --help
```
如果 GCC 可用,C 扫描器会在首次运行时自动编译。无需 pip install。
### 可选:EnCase E01 支持
```
pip install pyewf
```
### Kali Linux / Debian
```
# 即将通过 apt 提供 — 请参阅下方的打包部分
# 目前:
git clone https://github.com/z0rhack/xcarver.git /opt/xcarver
echo 'alias xcarver="python3 /opt/xcarver/carver.py"' >> ~/.zshrc
```
## 用法
### 列出可用设备
```
sudo python3 carver.py --list-devices
```
### 列出所有支持的文件类型
```
python3 carver.py --list-types
```
## 场景
### 场景 1 — 从 USB 闪存盘恢复已删除文件
最常见的用例:有人删除了 USB 闪存盘上的文件并希望将其恢复。
```
sudo python3 carver.py /dev/sdb --output ./usb_recovered/
```
xCarver 将:
1. 检测文件系统(FAT32、exFAT、NTFS...)
2. 恢复已删除的条目并保留原始文件名和文件夹结构
3. 对未分配的空间进行原始雕刻,以查找 FS 解析器未找到的任何内容
4. 在两个引擎之间对结果进行去重
5. 生成 JSON 报告
输出结构:
```
usb_recovered/
├── fs_recovered/ ← files with original names & paths
│ ├── Documents/
│ │ └── rapport.pdf
│ └── Photos/
│ └── vacances.jpg
├── raw/ ← files found by raw carving
│ ├── jpeg/
│ ├── pdf/
│ └── ...
└── carving_report.json
```
### 场景 2 — 雕刻磁盘镜像(取证调查)
```
python3 carver.py disk_image.dd --output ./evidence/ --threads 8
```
仅针对特定文件类型:
```
python3 carver.py disk_image.dd --types jpeg,pdf,sqlite --output ./evidence/
```
针对完整类别:
```
python3 carver.py disk_image.dd --types document,image --output ./evidence/
```
### 场景 3 — 大容量驱动器,中断的会话(恢复)
对于超大容量驱动器(1TB+),雕刻可能需要数小时。如果中断,可以从上次中断的地方恢复:
```
# 首次运行
sudo python3 carver.py /dev/sda --output ./carve_sda/ --resume
# 如果中断,相同命令将自动恢复
sudo python3 carver.py /dev/sda --output ./carve_sda/ --resume
```
### 场景 4 — 跳过加密分区(BitLocker、VeraCrypt...)
加密区域会产生大量误报。跳过它们:
```
python3 carver.py disk.dd --entropy-skip --output ./carve/
```
xCarver 计算每 512 字节块的 Shannon 熵。高于阈值(通常 >7.8 bits/byte)的块将被跳过,从而大幅减少加密或压缩数据上的误报。
### 场景 5 — CTF 挑战 / 隐写分析
CTF 模式会生成熵热力图(HTML)并检测多态文件和附加数据:
```
python3 carver.py challenge.bin --ctf --output ./ctf_analysis/
```
输出包括:
- `entropy_heatmap.html` — 整个镜像的可视化熵图
- `polyglots.json` — 检测到具有多个有效头的文件
- `overlays.json` — 挂载在有效文件页脚之后的数据
### 场景 6 — 仅限 FS 恢复(快速,保留名称)
当您只需要感知文件系统的恢复而不需要原始雕刻时:
```
python3 carver.py /dev/sdc --fs-only --output ./quick_recovery/
```
由于仅解析文件系统元数据,因此速度会快得多。
### 场景 7 — 仅原始雕刻(严重损坏的文件系统)
当文件系统被破坏且感知 FS 的恢复无济于事时:
```
python3 carver.py disk.img --raw-only --output ./raw_carved/
```
### 场景 8 — EnCase/E01 取证镜像
```
# 需要:pip install pyewf
python3 carver.py evidence.E01 --output ./case_output/
```
### 场景 9 — 递归归档提取
递归提取在 ZIP、GZIP、BZIP2 归档文件中找到的文件:
```
python3 carver.py image.dd --recursive --output ./deep_carve/
```
找到的归档文件会自动解压缩,并雕刻其中的内容。
### 场景 10 — 自定义签名(使用您自己的类型进行扩展)
创建一个包含自定义签名的 JSON 文件:
```
[
{
"name": "myformat",
"ext": "mfmt",
"header": "4d59464d54",
"footer": "454e44",
"max_size": 10485760,
"min_size": 64,
"category": "custom",
"description": "My custom file format"
}
]
```
```
python3 carver.py image.dd --sig-dir ./my_sigs/ --output ./carve/
```
### 场景 11 — SSD / 高级格式化驱动器(4K 扇区)
```
python3 carver.py /dev/nvme0n1 --sector-align --sector-size 4096 --output ./ssd_carve/
```
### 场景 12 — RAM 转储 / 内存取证
```
python3 carver.py memory.mem --raw-only --types executable,document,image --output ./mem_carve/
```
### 场景 13 — 限制每种文件类型的输出(分诊)
当您只需要每种类型的样本,而不需要成千上万个文件时:
```
python3 carver.py disk.dd --max-per-type 100 --output ./triage/
```
### 场景 14 — 无 GCC 可用(纯 Python 回退)
```
python3 carver.py image.dd --no-compile --output ./carve/
```
警告:纯 Python 模式比 C 扫描器慢 10-50 倍。
## 性能
| 模式 | 典型速度 |
|------|--------------|
| C 扫描器 (GCC, 8 线程) | 800 MB/s – 2 GB/s (I/O 密集) |
| C 扫描器 (GCC, 1 线程) | 300 MB/s – 600 MB/s |
| 纯 Python 回退 | 20 MB/s – 60 MB/s |
C 扫描器使用持久化的 Aho-Corasick 自动机:它在启动时构建一次,并在每个数据块中重复使用 —— 每次扫描的复杂度为 O(data),而不是 O(patterns × data)。
## 架构
```
carver.py Main orchestrator, CLI, report engine
└── SourceReader Opens images, raw devices, E01, RAM dumps
└── PersistentScanner Wraps C handle (xc_create/xc_scan/xc_free)
└── Session Session persistence for --resume
└── carve_fs() Phase 1: FS-aware recovery
└── carve_raw() Phase 2: Raw carving (multithreaded)
fs_parser.py Filesystem parsers (FAT/NTFS/ext4/HFS+/APFS/...)
└── parse_filesystem() Detects FS type, recovers deleted entries
└── reconstruct_file() Follows cluster chains to rebuild files
signatures.py 119 file type definitions + structural validators
└── SigDef (name, ext, header, footer, min_size, max_size, validator)
└── get_signatures() Filter by type/category
scanner.c High-performance C scanning engine
└── xc_create() Build Aho-Corasick automaton (once)
└── xc_scan() Multi-threaded scan (O(n) per chunk)
└── xc_free() Release handle
```
**数据流:**
```
Source (device/image/E01)
→ FS-aware parser → deleted entries with original names
→ Raw carver → files by byte signature (C/multithreaded)
→ SHA256 dedup → merge, remove duplicates
→ Output → organized by type + JSON report
```
## 选项参考
```
positional:
source Image file, raw device, or E01
output:
-o, --output DIR Output directory (default: ./carved)
filtering:
-t, --types TYPES Comma-separated types or categories
Examples: jpeg,pdf | image | document,archive
Use --list-types for all available values
modes:
--fs-only FS-aware recovery only (no raw carving)
--raw-only Raw carving only (no FS parsing)
--ctf CTF mode: entropy heatmap + polyglot detection
--recursive Extract files inside recovered archives
performance:
--threads N Number of threads (default: auto, max 6)
--chunk-size MB Chunk size in MB (default: 64)
--no-compile Force pure Python mode (no C compilation)
advanced:
--resume Resume a previous session
--entropy-skip Skip high-entropy zones (encrypted/compressed)
--sector-align Align offsets to sector boundaries
--sector-size N Sector size for --sector-align (default: 512)
--max-per-type N Max files per type, 0=unlimited (default: 0)
--sig-dir DIR Directory of additional JSON signatures
info:
--list-devices List available storage devices
--list-types List all supported file types and categories
```
## 输出格式
### 目录结构
```
output/
├── fs_recovered/ FS-aware results (original names & paths)
│ └──
├── raw/ Raw carving results
│ ├── jpeg/
│ ├── pdf/
│ ├── sqlite/
│ └── ...
├── recursive/ Files extracted from recovered archives
└── carving_report.json Full statistics report
```
### carving_report.json
```
{
"source": "/dev/sdb",
"size": 32010928128,
"elapsed_s": 47.3,
"speed_bps": 676869120,
"fs": {
"fs_type": "FAT32",
"found": 142,
"recovered": 138,
"failed": 4
},
"raw": {
"jpeg": 87,
"pdf": 12,
"sqlite": 3,
"hits_raw": 1243,
"invalid": 156,
"too_small": 34,
"dedup": 41
}
}
```
## 构建独立可执行文件
### Linux
```
gcc -O3 -march=native -shared -fPIC -pthread -o scanner.so scanner.c
pip install pyinstaller
pyinstaller --onefile --add-binary "scanner.so:." --add-data "scanner.c:." carver.py
# → dist/carver
```
### Windows (MinGW)
```
gcc -O3 -shared -o scanner.dll scanner.c
pip install pyinstaller
pyinstaller --onefile --add-binary "scanner.dll;." carver.py
# → dist/carver.exe
```
### macOS
```
gcc -O3 -shared -fPIC -o scanner.dylib scanner.c
pip install pyinstaller
pyinstaller --onefile --add-binary "scanner.dylib:." carver.py
# → dist/carver
```
## 贡献
欢迎贡献。欢迎提交 Issue、建议新签名或提交 Pull 请求。
在向 `signatures.py` 添加签名时:
- 提供 `header`(字节序列),如果适用,提供 `footer`
- 设置切合实际的 `min_size` 和 `max_size`
- 如果格式具有可验证的字段(CRC、尺寸、魔术常量),请添加结构化的 `validator` 函数
- 针对真实文件进行测试,而不仅仅是手工构造的文件
## 法律声明
xCarver 旨在用于授权的取证调查、您自己设备上的数据恢复、安全研究和 CTF 竞赛。请勿在您不拥有或未获得明确授权分析的设备上使用它。作者对滥用不承担任何责任。
## 许可证
MIT — 详见 [LICENSE](LICENSE)
图像 (22)
JPEG, PNG, GIF, BMP, TIFF, WebP, PSD, ICO, RAW 格式 (CR2, CR3, NEF, ARW, DNG), HEIC, AVIF, JXL视频 (12)
MP4, MOV, MKV, WebM, AVI, 3GP, FLV, WMV, MPEG-1/2, MPEG-TS音频 (13)
MP3, OGG, FLAC, WAV, AAC, M4A, WMA, AIFF, APE, Opus, DSD文档 (18)
PDF, DOC/DOCX, XLS/XLSX, PPT/PPTX, ODT/ODS/ODP, RTF, LaTeX, MOBI, EPUB, CHM, EML归档 (13)
ZIP, RAR4/5, 7Z, GZIP, BZIP2, XZ, ZSTD, LZ4, LZMA, TAR, CAB, ISO, DMG数据库 (8)
SQLite3, MySQL dump, PostgreSQL dump, MS Access MDB/ACCDB可执行文件 (9)
PE (Windows EXE/DLL), ELF (Linux/Unix), Mach-O (macOS), Java .class加密 (7)
PEM 证书, SSH 私钥/公钥, GPG 密钥环电子邮件 (4)
PST, OST, EML (RFC 2822)取证 (4)
dd/raw 镜像, EWF (EnCase), 内存转储移动端 (6)
APK (Android), IPA (iOS), DEX (Dalvik bytecode)标签:APFS, ext4, FAT32, HTTP工具, NTFS, RAW恢复, 二进制分析, 云安全运维, 云资产清单, 元数据恢复, 哈希去重, 域渗透, 归档解压, 数字取证, 数据恢复, 数据雕刻, 文件签名, 文件系统识别, 文件雕刻, 熵分析, 电子数据取证, 碎片整理, 磁盘分析, 网络安全审计, 自动化脚本, 逆向工具, 逆向工程