SnakeFirts/Specter
GitHub: SnakeFirts/Specter
Specter 是一款用 Python 编写的数字取证工具,通过整合文件元数据、EXIF 信息和哈希值构建统一的证据时间线,并检测时间篡改和视觉重复图像。
Stars: 0 | Forks: 0
```
⠀⠀⠀⠀⠀⠀⢀⣤⣶⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢰⣿⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣠⣾⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢀⣾⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠶⠋⠉⠙⠻⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢸⡿⠟⠁⠀⢸⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠞⠁⠀⠀⠀⠀⢠⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢈⡇⠀⠀⠀⠈⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠁⠀⠀⠀⠀⠀⢀⣸⣿⣿⣿⣿⣿⡿⠿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣼⠀⠀⠀⠀⠀⠸⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠋⠀⠀⠀⠀⠀⠀⠀⣤⠞⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⣧⠀⠀⠀⠀⠀⠀⠹⣆⠀⠀⠀⠀⢀⣀⣠⣤⣤⣤⣞⠁⠀⠀⠀⠀⠀⠀⠀⣰⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢻⠀⠀⠀⠀⠀⠀⠀⠹⣦⣠⠶⠛⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠸⡇⠀⠀⠀⠀⠀⠀⠐⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠐⢦⣰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⣯⣽⣽⢦⡀⠀⠙⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠈⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⣿⡆⣿⣘⡇⠀⠀⠈⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠘⣆⠀⠀⠀⠀⣴⠒⣆⠀⠀⠀⠀⠀⠀⠀⠘⣧⣏⢻⣾⣛⠇⢀⢠⢄⡀⢻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣿⠀⠀⠀⢰⢿⡟⣿⣇⠀⠀⠀⠀⠀⠀⠀⠈⠿⠟⠋⠁⣔⣙⣳⢿⣿⡀⢻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣿⠀⠀⣀⢸⡘⣿⢛⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣗⣴⡢⣵⡀⡄⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣿⢀⣾⠄⠵⡷⠯⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⣀⢀⣾⣟⢈⡡⢶⠃⡾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢸⣼⣋⣑⣚⡾⣷⣄⡀⠀⢀⣴⡿⢿⣶⣤⣴⡿⠉⠛⠿⠋⠈⠚⠐⠋⣼⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠘⣧⢷⡡⢴⠋⠈⠻⢿⣶⡿⠋⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⡼⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⠴⣶⡄
⠀⠀⠀⠀⠘⢷⣉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢺⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠶⠛⠉⠁⠀⢸⠃⢻
⠀⠀⠀⠀⠀⠀⠙⠳⢧⣄⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢧⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠚⠉⠀⣀⣠⠄⠀⠀⢰⠀⢸
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⣛⠶⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣇⠀⠀⠀⠀⢀⣴⠞⠁⣠⡴⠞⣋⣥⠤⠀⠀⠀⠈⢃⣼
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢣⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡄⠀⠀⠀⠸⡇⠀⠀⠀⠀⠉⢁⣀⣠⡤⠴⠶⠒⠛⠃
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣧⠀⠀⠀⢀⣿⠀⠀⠀⡖⠛⠉⠉⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠃⠀⠀⠀⠀⢰⣿⠀⠀⠀⣰⣷⠀⠀⠀⠀⠀⠀⢸⡄⢠⡞⠋⠀⠀⠀⣀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡾⠁⠀⠀⠀⠀⠀⣿⡟⠀⠀⠀⣿⡟⠀⠀⠀⠀⠀⠀⠈⣇⠘⣧⠀⢰⡞⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⡾⠁⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⠙⠁⠀⠀⠀⠀⠀⠀⠀⢻⢀⣼⠃⣸⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⣤⠴⠞⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⣵⡞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⣀⡴⠞⠋⠁⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠳⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠙⣳⠶⠒⠒⠒⢲⡞⠀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⢀⣠⡀⠀⠀⠀⢀⡟⠉⠙⠒⠶⡶⠦⠤⠤⠽⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠓⠒⠒⠚⠛⣟⣠⣤⠴⠖⡞⠋⡩⠷⣤⡀⣀⡤⢾⡋⠀⣀⣵⡄⠀⣼⠉⠉⠉⠑⠒⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠈⠙⠉⠀⠀⠉⠚⠁⠀⠙⠳⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
```




# Specter
**Specter** 是一款用 Python 编写的数字取证分析工具,它将文件系统元数据、EXIF 和加密哈希统一到一个按时间顺序排列的时间线中,以方便进行证据分析。
目前它支持分析单个图像和文件或整个目录,检测时间不一致性,提取相关元数据,并通过感知哈希将视觉上相似的图像进行分组。
## 功能
- 加密哈希(MD5 和 SHA256)
- 统一的时间线
- 提取 EXIF 元数据
- 可用时提取 GPS 坐标
- 感知哈希(dHash)
- 自动检测时间不一致性
- 以 JSON 格式导出结果
- 递归扫描目录
- 使用 Pytest 的自动化测试套件
## 安装
```
pip install -r requirements.txt
```
## 用法
```
# 分析整个文件夹(默认递归)
python -m specter.cli scan ./evidencia
# 不递归
python -m specter.cli scan ./evidencia --no-recursive
# 将结果导出为 JSON
python -m specter.cli scan ./evidencia --export resultado.json
# 分析单个文件
python -m specter.cli scan ./foto.jpg
```
## 每个文件提取的信息
- **哈希**:MD5 和 SHA256
- **文件系统时间戳**:创建(见下文注释)、
修改、最后访问
- **EXIF**(仅限图像):拍摄日期、设备(品牌/型号)、
可用的 GPS 坐标
- **感知哈希**:用于将视觉上相似的图像分组,
即使它们的 SHA256 不同(同一张照片经过编辑、重新压缩或缩放——这在原始 EXIF
在 Pixelmator、Photoshop 等编辑器导出时丢失的情况下很常见)
- **自动警报**:EXIF 日期晚于文件修改日期,
超出了时钟/时区偏差的预期范围(可能存在篡改),或者“修改时间”早于
“创建时间”(通常是从其他设备/磁盘导入的文件)
## 重复项和编辑(感知哈希)
```
# 默认激活
python -m specter.cli scan ./fotos
# 调整两张图像需要多“相似”才能被分组
# (0 = 完全相同,64 = 毫无关联;default 8,经验校准)
python -m specter.cli scan ./fotos --dupe-threshold 15
# 禁用
python -m specter.cli scan ./fotos --no-dupes
```
这可以识别“同一张照片,不同的编辑/压缩”的候选文件——
这非常有用,因为加密哈希(SHA256)在定义上无法
进行关联,因为任何单字节的改变都会使它完全改变。
**重要提示——已知限制:** 感知哈希在真实照片中效果非常
好(每次拍摄的噪点/纹理都是唯一的),但在壁纸或风格化的艺术作品中,它可能会对那些仅仅是*构图相似*
(居中的剪影、相似的调色板)但并非同一作品的照片进行分组。因此,每个匹配项都会标记有一个置信度级别:
- **高置信度**(距离 ≤ 6):通过经过证实的真实案例进行了校准,
作为精确或近乎精确的匹配(相同的截图、相同照片的缩放/重新压缩)。
- **需手动检查**(距离 > 6,直至阈值):可能仅仅是视觉构图相似,
而非同一张图像。一个被确认为误报的真实案例(两张设计相似、CD不同的
电子游戏壁纸)落在了距离 10 的位置——因此默认设置中保留了安全余量。
## 关于时间戳的重要说明
Linux 中的 `st_ctime` 是“元数据更改时间”(inode 的元数据何时发生更改),而**不是**真正的创建日期——后者仅在 macOS/BSD 的 `st_birthtime` 和 Windows NTFS 的 `$FILE_NAME`/`$STANDARD_INFORMATION` 中可靠存在。
在 macOS/BSD(APFS、HFS+)中,此工具**确实**会在
可用时使用 `st_birthtime`,它是该文件在该磁盘上真正的创建日期
(不要与原始拍摄日期混淆,如果文件是从其他地方复制、下载或同步的——
在这种情况下,`st_birthtime` 反映的是它到达*当前*磁盘的时间,而不是照片最初拍摄的时间;
为此,单独设有 EXIF 字段 `DateTimeOriginal`)。
在不支持 `st_birthtime` 的 Linux 中,使用 `st_ctime` 作为
“创建时间”的近似值,并在此进行说明,以便在使用此工具生成的任何取证报告中保持清晰——在
没有此声明的情况下使用时间戳是一个常见的错误,如果将其用作真正的
证据,这将是一个严重的漏洞。
## 测试
```
pip install -r requirements-dev.txt
pytest
```
测试套件涵盖三个层面:
- `tests/test_flags.py`:`compute_flags()` 的纯逻辑(时区阈值的
所有边缘情况,不触及文件系统)。
- `tests/test_extractor.py`:真正的集成测试——哈希计算、读取
文件系统时间戳、从测试中生成的合成 JPEG 图像中提取 EXIF,以及 `scan_directory`(递归、
非递归、处理 `PermissionError`)。
- `tests/test_dedup.py`:感知哈希和重复项/编辑的
分组——Hamming 距离的边缘情况、分组的传递性,以及模拟
“编辑器缩放/重新压缩照片”真实案例的合成图像。
## 路线图
- [ ] 直接读取 NTFS 的 MFT 以获取真实时间戳。
- [ ] PDF 和 Office 文档的元数据。
- [ ] 时间线的可视化导出(HTML)。
- [ ] PDF 报告。
- [ ] 导出 CSV。
- [ ] 通过 EXIF 检测编辑软件。
- [ ] 浏览器工件分析器(历史记录、cookie 和 cache)。
## License
MIT
标签:元数据提取, 数字取证, 时间线重构, 自动化脚本, 证据关联, 进程保护, 逆向工具