maliboz/exifKiller
GitHub: maliboz/exifKiller
一款离线运行的元数据清理与验证工具,支持图像、RAW、视频、音频和文档等 58 种格式,采用字节原位处理确保不可替代文件不被破坏。
Stars: 0 | Forks: 0
# Exif Killer
用于 DFIR、OSINT 和 OPSEC 的离线元数据清理与验证工具。
[English](#english) · [Türkçe](#türkçe)

## 中文
### 概述
Exif Killer 会移除文件中的元数据,并证明它移除了什么。它完全离线运行,没有任何遥测功能,也不依赖任何外部程序:所有格式都由专门为该项目编写的纯 Python 引擎进行解析。你不需要安装 ExifTool、ffmpeg 或 ImageMagick,除了下面列出的 Python 包之外,什么都不需要装。
该项目的指导原则是:只有诚实的元数据清理器才值得使用。清理总是伴随着重新扫描,结果按固定的分类法报告,并且工具刻意保留的任何内容都会明确指出,而不是默默忽略。
状态:`v0.1.0-alpha`。Windows 是主要发布目标平台。
### 威胁模型
Exif Killer 适用于文件元数据可能泄露比内容更多信息的场景:操作者身份、设备指纹、位置或文档历史。它适用于:
- 包含 GPS 坐标、相机序列号或所有者名称的照片
- 相机 RAW 文件,其 MakerNote 通常包含机身序列号和快门次数
- 记录了设备、位置和编码器信息的视频与音频容器
- 包含 DocInfo、XMP、文档 ID 或嵌入内容的 PDF
- 包含作者字段、评论身份、修订痕迹或预览缩略图的 Office 和 OpenDocument 文件
- 包含下载区域痕迹或文件系统时间轴线索的 Windows 文件
Exif Killer 并不声称能抹除每种格式中的所有取证痕迹。其目标更窄且更站得住脚:清理它所识别的内容,验证结果,并报告残留物。
### 设计原则:字节原位处理
一些容器格式使用绝对字节偏移量指向其有效负载。在相机 RAW 文件中,`StripOffsets` 指明了传感器数据的起始位置。在 Matroska 中,`SeekHead` 和 `Cues` 按位置对文件进行索引。在 MP4 中,`stco` 将样本映射到偏移量。从这些格式中删除元数据会使随后的每个字节发生位移,从而悄无声息地破坏文件,这对于不可替代的 RAW 文件来说是不可接受的。
因此,Exif Killer 绝不会在这些格式中移动任何字节。元数据会就地中和,使用格式本身为此目的提供的任何机制:
| 格式 | 技术 | 结果 |
| --- | --- | --- |
| TIFF / 相机 RAW | 就地压缩 IFD 条目数组;释放的插槽变为未引用的填充 | 文件大小不变 |
| Canon CRW (CIFF) | 就地压缩目录;块的尾部指针仍然指向其起始位置 | 文件大小不变 |
| Matroska (MKV/WebM) | 用相同大小的 EBML `Void` 覆盖元素 | 文件大小不变 |
| MP4 / MOV / M4A | 将元数据 box 重命名为 `free` 并清零其有效负载 | 文件大小不变 |
| HEIC / HEIF / AVIF | 精准清零 `mdat` 中的 EXIF/XMP 项有效负载 | 文件大小不变 |
没有偏移索引的格式(JPEG、PNG、Ogg、RIFF、基于 ZIP 的文档)会被彻底重写,其中的有效负载会逐字节复制。
### 支持的格式
58 种扩展名,全部原生处理,无需重新编码。
- **图像**: `jpg`, `jpeg`, `jpe`, `png`, `webp`, `bmp`, `tiff`, `tif`, `gif`, `svg`
- **现代图像**: `heic`, `heif`, `avif`
- **相机 RAW**: `crw`, `cr2`, `nef`, `nrw`, `arw`, `sr2`, `srf`, `dng`, `orf`,
`rw2`, `pef`, `srw`, `3fr`, `mef`, `mos`, `erf`, `dcr`, `kdc`
- **视频**: `mp4`, `mov`, `m4v`, `avi`, `mkv`, `webm`, `ogv`
- **音频**: `mp3`, `flac`, `m4a`, `wav`, `ogg`, `oga`, `opus`, `spx`
- **文档**: `pdf`, `docx`, `xlsx`, `pptx`
- **OpenDocument**: `odt`, `ods`, `odp`, `odg`, `odf`, `ott`, `ots`, `otp`
各类格式的清理方式:
- **JPEG / PNG / WebP / GIF / SVG** — 重写 segment 或 chunk 结构,仅丢弃元数据载体,实现无损。像素保持逐字节相同,并且丢弃附加在图像结束标记之后的数据(隐藏的缩略图、附加的有效负载)。BMP 和 TIFF 使用像素复制进行重建。
- **相机 RAW (基于 TIFF)** — 移除 EXIF、GPS、XMP、IPTC、MakerNote 以及 DNG 身份标签(`CameraSerialNumber`、`DNGPrivateData`、`RawDataUniqueID`、`OriginalRawFileName`)。请参阅下文的 Make/Model 说明。
- **Canon CRW (CIFF)** — `OwnerName` 和 `SerialNumber`(CRW 以纯 ASCII 存储),以及固件版本、时间戳和文件编号。
- **MP4 / MOV / M4V / M4A** — `udta` 和 `meta` box,包括 iPhone GPS atom(`©xyz`)、设备、软件和 iTunes 标签。
- **HEIC / HEIF / AVIF** — EXIF 和 XMP 项的有效负载。
- **MKV / WebM** — `Tags`、`Attachments`、`Title`、`DateUTC`、`SegmentUID`、`SegmentFilename` 和轨道名称。指向已移除元素的索引条目将被修剪。强制性的 `MuxingApp` 和 `WritingApp` 字符串会被清零而不是删除,这是 EBML 明确允许的。
- **Ogg / Opus / Vorbis / Theora / Speex** — 注释头的供应商字符串和每个用户标签,包括嵌入的封面艺术。头部页面将被重建:重新计算分块表、重新编号页面序列,并重新计算 Ogg CRC32。
- **MP3** — ID3v2、ID3v1 和 APEv2 标签。
- **FLAC** — `VORBIS_COMMENT` 和 `PICTURE` 块。
- **WAV / AVI** — `INFO`、`ID3` 和 `bext` chunk。
- **PDF** — DocInfo、XMP、PieceInfo、嵌入文件、JavaScript、关联文件引用以及可追踪的 trailer ID。pikepdf/qpdf 在保存时会写回 trailer `/ID`,因此 Exif Killer 用非唯一的静态 ID 替换它,而不是留下针对单个文档的关联句柄。
- **Office (OOXML)** — `docProps`、评论和修订身份、rsid 标记、缩略图以及嵌入图像中的 EXIF。
- **OpenDocument** — `meta.xml` 被替换为空文件;注释和追踪更改身份、作者字段、缩略图和 `settings.xml` 被移除;嵌入的 `Pictures/` 被无损剥离;并且保持清单同步。ZIP 条目的时间戳会被重置,因为否则它们会记录文档最后被编辑的时间。
### 安装
要求 Python 3.11 或更高版本。
```
git clone
cd exif_killer
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux / macOS
pip install -e .
```
运行时依赖项为 `Pillow`、`pikepdf`、`customtkinter` 和 `tkinterdnd2`。
不需要或不使用任何外部二进制文件。
`pikepdf` 是一个 C 扩展,在 Windows 上,如果缺少 Microsoft Visual C++ Redistributable (x64),它将无法加载。Exif Killer 将此视为引擎降级而非致命错误:PDF 支持被禁用,原因会在启动时报告,而所有其他格式继续正常工作。某一个不可用的格式系列永远不会阻止应用程序启动。
### 命令行用法
四个命令:`scan`、`clean`、`verify` 和 `selftest`。
```
exif-killer --help
exif-killer --help
```
如果入口点不在您的 `PATH` 中,使用 `python -m exif_killer` 效果相同。
#### scan — 报告文件披露的信息
```
exif-killer scan photo.jpg
exif-killer scan ~/Pictures --recursive
exif-killer scan report.pdf --format json --report findings.json
```
#### clean — 移除元数据并验证结果
```
exif-killer clean photo.jpg
exif-killer clean secret.pdf --profile aggressive
exif-killer clean ~/Pictures --recursive --output-dir ~/clean
exif-killer clean photo.jpg --overwrite
```
除非指定 `--output-dir` 或 `--overwrite`,否则清理后的文件会以 `name_Cleaned.ext` 的形式写入原始文件旁。
#### verify — 将原始文件与清理后的副本进行比较
```
exif-killer verify original.docx cleaned.docx --format json
```
#### selftest — 使用您自己的文件检查工具
`verify` 回答元数据是否已清除。`selftest` 回答更难的问题:文件是否仍然有效。
```
exif-killer selftest --wanted
exif-killer selftest ~/samples --profile aggressive
exif-killer selftest ~/samples --format json --report selftest.json
```
每个文件都被清理到临时目录中 — **原始文件永远不会被修改** — 然后使用具备格式意识的断言进行检查:容器必须仍然能够解析,并且不可替代的字节(JPEG 扫描数据、`mdat`、Matroska cluster、Ogg 音频页面、RAW 传感器数据条)必须完全相同。对于 RAW 和 Matroska,文件大小绝对不能改变。
每个文件会得到以下三种裁决之一:
- `pass` — 已清理,完整无缺,没有任何阻碍性的残留。
- `residual` — 完整无缺,但配置文件故意保留的元数据仍然存在。这不是失败。
- `damaged` — 完整性检查失败。工具损坏了文件,任何元数据移除都不能为此开脱。
报告还会列出哪些支持的格式目前还没有样本,因此它可以告诉您接下来值得寻找什么。`--wanted` 会在不运行任何内容的情况下打印该列表。
请将您的样本语料库排除在版本控制之外;它们正是此工具旨在保护的个人文件。`exif_test/`、`corpus/` 和 `samples/` 已经在 `.gitignore` 中了。
### 清理配置文件
- `safe`(默认) — 在优先考虑文件兼容性的同时,移除直接身份识别和追踪元数据。
- `aggressive` — 将清理范围扩大到缩略图、修订标记、嵌入预览、颜色配置文件、Windows 后处理以及隐藏在容器声明结尾之后的数据。
#### RAW Make/Model 权衡
RAW 转换器通过 `Make` 和 `Model` 标签识别传感器,以便选择去马赛克算法和颜色配置文件。移除它们可能会导致某些转换器拒绝打开该文件。因此,`safe` 会保留它们,并将其作为剩余的 `identifying` 发现报告,而不是声称文件已被清理干净。
`aggressive` 会移除它们以及 `UniqueCameraModel`,并从嵌入的预览 JPEG 中剥离 EXIF。
预览剥离是刻意保守的。使用无损 JPEG 压缩的传感器数据以与预览相同的起始图像标记开头,并且只能通过其光度解释来区分。任何可能是传感器数据的内容都将原封不动。
### 时间戳策略
`clean` 可以重写清理后文件的文件系统时间戳。所有平台都会设置修改和访问时间;而在 Windows 上,还会通过 Win32 API 额外设置创建时间。文件系统日期是常见的 OPSEC 泄露点,因此该策略是可配置的:
```
exif-killer clean photo.jpg --timestamp random
exif-killer clean photo.jpg --timestamp epoch
exif-killer clean photo.jpg --timestamp custom --timestamp-date 2020-05-01T13:00:00
exif-killer clean photo.jpg --timestamp keep
```
- `auto`(默认) — 遵循配置文件:`aggressive` 重置为 epoch,`safe` 保持时间戳不变。
- `keep` — 永远不触碰文件系统时间戳。
- `epoch` — 重置为 `1970-01-01`。
- `random` — 为每个文件生成一个合理的随机日期,并按创建 ≤ 修改 ≤ 访问的顺序排列,这样文件就不会显得突兀。
- `custom` — 使用 `--timestamp-date`,接受 `YYYY-MM-DD` 或 ISO 8601 格式。
### 桌面界面
```
exif-killer-gui
# 或:python main.py
```
GUI 建立在 CLI 相同的服务层之上,因此两者的行为完全相同。工作流程如下:
1. 将文件加入队列,或拖放文件夹。
2. 选择配置文件(`Safe` 或 `Aggressive`)和文件日期策略。
3. 运行 `Scan`。
4. 运行 `Clean + Verify`。
5. 导出 JSON 或 CSV 证据。
界面提供英文和土耳其文,可在运行时切换。
### 验证模型
发现结果分为五类:
| 类别 | 含义 | 阻碍性 |
| --- | --- | --- |
| `identifying` | 揭示个人、设备或软件指纹 | 是 |
| `tracking` | 能够关联、追踪文件或建立时间轴 | 是 |
| `embedded-content` | 指向嵌入或活动内容 | 是 |
| `filesystem` | 文件系统元数据 | 否 |
| `technical` | 兼容性或结构所需 | 否 |
如果保留任何阻碍性发现,验证将返回 `warning`。文件系统残留会被报告,但不会导致验证失败。
使用自己的解析器检查自身工作的工具会存在共同的盲点。因此,测试套件会与第三方实现进行交叉检查,这些实现必须达成共识:针对 TIFF 和 RAW 使用 Pillow(清理后的文件必须仍然能够解码,像素完全相同且元数据已移除),针对 Ogg 使用 [mutagen](https://mutagen.readthedocs.io/)(必须在清理前看到标签,并且在之后仍能解析出有效的流)。mutagen 仅为开发附加组件;工具本身从不导入它,如果缺少该组件,这些测试将被跳过。
### 退出代码
`scan`、`clean` 和 `verify`:
| 代码 | 含义 |
| --- | --- |
| `0` | 成功,没有遗留阻碍性发现 |
| `1` | 使用错误或运行时失败 |
| `2` | 已完成,但仍有阻碍性发现 |
| `3` | 没有可用的支持文件 |
`selftest`:
| 代码 | 含义 |
| --- | --- |
| `0` | 所有文件均通过 |
| `1` | 文件已损坏或无法处理 |
| `2` | 仍有残留元数据 |
| `3` | 未找到支持的文件 |
### 报告格式
每个 JSON 报告条目包括 `tool_version`、`command`、`profile`、`status`、`backend`、`input_path`、`output_path`、`file_type`、`sha256_before`、`sha256_after`、`findings`、`removed_fields`、`remaining_findings`、`warnings` 和 `timestamp_utc`。示例文件位于 [docs/example_report.json](docs/example_report.json)。
### 开发
```
pip install -e .[dev]
pytest # 118 tests
mypy
ruff check .
```
代码库分为两层。`cleaners/` 包含格式引擎,不了解 CLI 或 GUI。`exif_killer/` 包含编排逻辑:服务、风险分类、报告和这两个前端。
### 安全态势
- 默认离线优先
- 没有遥测、没有云端扫描、没有自动更新代理
- 运行时路径中没有外部二进制文件
- 提供结构化的 JSON 和 CSV 证据以供审计追踪
- alpha 版本以 Windows 便携版编译为目标
### 已知限制
- Windows 是 `v0.1.0-alpha` 的主要发布目标平台。
- 不支持 Canon CR3(基于 ISOBMFF,而非 TIFF)、Fuji RAF 和 Sigma X3F。BigTIFF 将被拒绝处理,而不是去猜测。
- Canon CRW 引擎是根据 CIFF 规范构建的,并且已通过测试夹具覆盖,但尚未针对真实的相机文件进行过实际测试。
- Ogg FLAC(Ogg 容器中的 FLAC)会被检测到但不会被剥离;原生 `.flac` 文件则会得到完全处理。
- RAW、CRW 和 Matroska 清理在设计上就是字节精确的,因此这些文件永远不会缩小:元数据会被原地覆盖而不是被切掉,因为否则它们的内部偏移表将会损坏。
- pikepdf/qpdf 在每次保存 PDF 时都会写回 trailer `/ID`,即使删除后也是如此。Exif Killer 会使用非唯一的静态 ID 替换该值。原始的、可追踪的文档 ID 仍然会被报告;中性的替换值被视为技术兼容性字段。
- RAW 的嵌入式预览会被保留:它渲染的是文件中已经包含的同一张照片。它自身的 EXIF 会在 `aggressive` 模式下被剥离。
- 递归归档检查不在 alpha 版本的范围内。
- 创建时间重写仅限 Windows;修改和访问时间在所有平台上都会设置。
- 引擎已经过手动构建的夹具测试,并与第三方解析器进行了交叉核对。针对您自己的文件运行 `exif-killer selftest`,以检查您真正关心的格式。
### 许可证
MIT。请参阅 [LICENSE](LICENSE).
## Türkçe
### 概述
Exif Killer dosyalardan metadata siler ve ardından ne sildiğini kanıtlar.
Tamamen çevrimdışı çalışır, hiçbir veri toplamaz ve hiçbir dış programa bağımlı
değildir: her format, bu proje için yazılmış saf Python motorlarıyla işlenir.
ExifTool yok, ffmpeg yok, ImageMagick yok; aşağıdaki Python paketleri dışında
kurulacak bir şey yok.
Projenin temel ilkesi şudur: bir metadata temizleyici ancak dürüstse kullanmaya
değer. Temizlik her zaman yeniden taramayla eşleştirilir, bulgular sabit bir
sınıflandırmayla raporlanır ve aracın bilerek bıraktığı her şey sessizce
geçiştirilmek yerine açıkça adlandırılır.
Durum: `v0.1.0-alpha`. Birincil hedef platform Windows'tur.
### 威胁模型
Exif Killer, bir dosyanın metadata'sının içeriğinden daha fazlasını ifşa
edebildiği durumlar için tasarlanmıştır: operatör kimliği, cihaz parmak izi,
konum veya belge geçmişi. Şu durumlarda işe yarar:
- GPS koordinatı, kamera seri numarası veya sahip adı taşıyan fotoğraflar
- MakerNote'unda tipik olarak gövde seri numarası ve deklanşör sayacı bulunan
kamera RAW dosyaları
- Cihaz, konum ve encoder bilgisi kaydeden video ve ses konteynerleri
- DocInfo, XMP, belge kimliği veya gömülü içerik taşıyan PDF'ler
- Yazar alanları, yorum kimlikleri, revizyon izleri veya önizleme küçük resmi
içeren Office ve OpenDocument dosyaları
- İndirme bölgesi izleri veya dosya sistemi zaman çizelgesi ipuçları taşıyan
Windows dosyaları
Exif Killer, her formattaki her adli izi sildiğini iddia etmez. Hedef daha dar
ve daha savunulabilirdir: bildiğini temizle, sonucu doğrula ve geriye ne
kaldığını raporla.
### 设计原则:绝不篡改任何字节
Bazı konteyner formatları içeriklerine mutlak byte offset'leriyle işaret eder.
Kamera RAW'ında `StripOffsets`, sensör verisinin nerede başladığını söyler.
Matroska'da `SeekHead` ve `Cues` dosyayı konuma göre indeksler. MP4'te `stco`
örnekleri offset'lere eşler. Bu formatlardan metadata silmek, sonraki her byte'ı
kaydırır ve dosyayı sessizce bozar; yeri doldurulamaz bir RAW için bu kabul
edilemez.
Bu yüzden Exif Killer bu formatlarda hiçbir byte'ı yerinden oynatmaz. Metadata,
formatın kendi sunduğu araçlarla yerinde etkisiz hale getirilir:
| Format | Teknik | Sonuç |
| --- | --- | --- |
| TIFF / kamera RAW | IFD girdi dizisi yerinde sıkıştırılır; boşalan yuvalar referanssız dolguya dönüşür | Dosya boyutu değişmez |
| Canon CRW (CIFF) | Dizin yerinde sıkıştırılır; bloğun sondaki işaretçisi hâlâ başlangıcı gösterir | Dosya boyutu değişmez |
| Matroska (MKV/WebM) | Elemanlar aynı boyutta bir EBML `Void` ile üzerine yazılır | Dosya boyutu değişmez |
| MP4 / MOV / M4A | Metadata kutuları `free` olarak yeniden adlandırılıp içi sıfırlanır | Dosya boyutu değişmez |
| HEIC / HEIF / AVIF | `mdat` içindeki EXIF/XMP item verileri cerrahi olarak sıfırlanır | Dosya boyutu değişmez |
Offset indeksi olmayan formatlar (JPEG, PNG, Ogg, RIFF, ZIP tabanlı belgeler)
gerçekten yeniden yazılır; orada da veri byte byte kopyalanır.
### 支持的格式
58 uzantı, hepsi native olarak ve yeniden kodlama yapılmadan işlenir.
- **Görseller**: `jpg`, `jpeg`, `jpe`, `png`, `webp`, `bmp`, `tiff`, `tif`, `gif`, `svg`
- **Modern görseller**: `heic`, `heif`, `avif`
- **Kamera RAW**: `crw`, `cr2`, `nef`, `nrw`, `arw`, `sr2`, `srf`, `dng`, `orf`,
`rw2`, `pef`, `srw`, `3fr`, `mef`, `mos`, `erf`, `dcr`, `kdc`
- **Video**: `mp4`, `mov`, `m4v`, `avi`, `mkv`, `webm`, `ogv`
- **Ses**: `mp3`, `flac`, `m4a`, `wav`, `ogg`, `oga`, `opus`, `spx`
- **Belgeler**: `pdf`, `docx`, `xlsx`, `pptx`
- **OpenDocument**: `odt`, `ods`, `odp`, `odg`, `odf`, `ott`, `ots`, `otp`
Her format ailesinin temizlenme biçimi:
- **JPEG / PNG / WebP / GIF / SVG** — segment veya chunk yapısı yeniden yazılır
ve yalnızca metadata taşıyıcıları kayıpsız biçimde atılır. Pikseller bit bit
aynı kalır; görüntünün bitiş işaretinden sonra eklenmiş veriler (gizli küçük
resimler, eklenmiş yükler) atılır. BMP ve TIFF piksel kopyalama ile yeniden
oluşturulur.
- **Kamera RAW (TIFF tabanlı)** — EXIF, GPS, XMP, IPTC, MakerNote ve DNG kimlik
etiketleri (`CameraSerialNumber`, `DNGPrivateData`, `RawDataUniqueID`,
`OriginalRawFileName`) silinir. Make/Model notuna aşağıdan bakınız.
- **Canon CRW (CIFF)** — CRW'nin düz ASCII olarak sakladığı `OwnerName` ve
`SerialNumber`, ayrıca firmware sürümü, zaman damgası ve dosya numarası.
- **MP4 / MOV / M4V / M4A** — `udta` ve `meta` kutuları; iPhone GPS atomu
(`©xyz`), cihaz, yazılım ve iTunes etiketleri dahil.
- **HEIC / HEIF / AVIF** — EXIF ve XMP item verileri.
- **MKV / WebM** — `Tags`, `Attachments`, `Title`, `DateUTC`, `SegmentUID`,
`SegmentFilename` ve parça adları. Silinen elemanlara işaret eden indeks
girdileri budanır. Zorunlu `MuxingApp` ve `WritingApp` dizeleri silinmek yerine
sıfırla doldurulur; EBML buna açıkça izin verir.
- **Ogg / Opus / Vorbis / Theora / Speex** — comment header'ındaki vendor dizesi
ve gömülü kapak resmi dahil tüm kullanıcı etiketleri. Header sayfaları yeniden
kurulur: lacing tabloları yeniden hesaplanır, sayfa sırası yeniden numaralanır
ve Ogg CRC32 yeniden hesaplanır.
- **MP3** — ID3v2, ID3v1 ve APEv2 etiketleri.
- **FLAC** — `VORBIS_COMMENT` ve `PICTURE` blokları.
- **WAV / AVI** — `INFO`, `ID3` ve `bext` chunk'ları.
- **PDF** — DocInfo, XMP, PieceInfo, gömülü dosyalar, JavaScript, ilişkili
dosya referansları ve izlenebilir trailer ID'leri. pikepdf/qpdf her kayıtta
trailer `/ID` alanını yeniden yazar; Exif Killer belgeye özel korelasyon
tutamacı bırakmak yerine bunu benzersiz olmayan sabit bir ID ile değiştirir.
- **Office (OOXML)** — `docProps`, yorum ve revizyon kimlikleri, rsid işaretleri,
küçük resimler ve gömülü görsellerin içindeki EXIF.
- **OpenDocument** — `meta.xml` boş bir dosyayla değiştirilir; açıklama ve
değişiklik izleme kimlikleri, yazar alanları, küçük resimler ve `settings.xml`
silinir; gömülü `Pictures/` kayıpsız temizlenir ve manifest senkron tutulurZIP girdi zaman damgaları sıfırlanır; aksi halde belgenin en son ne zaman
düzenlendiğini kaydederler.
### 安装
Python 3.11 veya üzeri gerekir.
```
git clone
cd exif_killer
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux / macOS
pip install -e .
```
Çalışma zamanı bağımlılıkları: `Pillow`, `pikepdf`, `customtkinter`,
`tkinterdnd2`. Hiçbir dış çalıştırılabilir dosya gerekmez ve kullanılmaz.
`pikepdf` bir C eklentisidir ve Windows'ta Microsoft Visual C++ Redistributable
(x64) eksikse yüklenmez. Exif Killer bunu ölümcül bir hata olarak değil, devre
dışı kalmış bir motor olarak ele alır: PDF desteği kapanır, sebebi açılışta
raporlanır ve diğer tüm formatlar çalışmaya devam eder. Kullanılamayan tek bir
format ailesi, uygulamanın açılmasını asla engellemez.
### 命令行用法
Dört komut: `scan`, `clean`, `verify` ve `selftest`.
```
exif-killer --help
exif-killer --help
```
Giriş noktası `PATH`'inizde değilse `python -m exif_killer` eşdeğerdir.
#### scan — 报告文件泄露了哪些信息
```
exif-killer scan foto.jpg
exif-killer scan ~/Resimler --recursive
exif-killer scan rapor.pdf --format json --report bulgular.json
```
#### clean — 删除 metadata 并验证结果
```
exif-killer clean foto.jpg
exif-killer clean gizli.pdf --profile aggressive
exif-killer clean ~/Resimler --recursive --output-dir ~/temiz
exif-killer clean foto.jpg --overwrite
```
Temizlenen dosyalar, `--output-dir` veya `--overwrite` verilmedikçe orijinalin
yanına `ad_Cleaned.uzanti` olarak yazılır.
#### verify — 将原始文件与清理后的副本进行比较
```
exif-killer verify orijinal.docx temiz.docx --format json
```
#### selftest — 使用您自己的文件测试该工具
`verify`, metadata'nın gidip gitmediğini söyler. `selftest` daha zor soruyu
yanıtlar: dosya hâlâ çalışıyor mu?
```
exif-killer selftest --wanted
exif-killer selftest ~/ornekler --profile aggressive
exif-killer selftest ~/ornekler --format json --report selftest.json
```
Her dosya geçici bir dizine temizlenir — **orijinallere asla dokunulmaz** — ve
ardından formata özgü doğrulamalarla sınanır: konteyner hâlâ ayrıştırılabilmeli
ve yeri doldurulamaz byte'lar (JPEG'in taranmış verisi, `mdat`, Matroska
cluster'ları, Ogg ses sayfaları, RAW sensör şeritleri) birebir aynı olmalıdır.
RAW ve Matroska'da dosya boyutu hiç değişmemiş olmalıdır.
Her dosya üç sonuçtan birini alır:
- `pass` — temizlendi, sağlam, engelleyici bir şey kalmadı.
- `residual` — sağlam, ancak profilin bilerek koruduğu metadata hâlâ duruyor.
Bu bir başarısızlık değildir.
- `damaged` — bir bütünlük kontrolü başarısız oldu. Araç dosyayı bozmuştur ve
hiçbir metadata temizliği bunu mazur göstermez.
Rapor ayrıca hangi desteklenen formatların henüz örneği olmadığını listeler;
böylece sıradaki neyi bulmanız gerektiğini söyler. `--wanted` bu listeyi hiçbir
şey çalıştırmadan yazdırır.
Örnek dosya koleksiyonunuzu sürüm kontrolünden uzak tutun; onlar tam da bu
aracın korumak için var olduğu kişisel dosyalardır. `exif_test/`, `corpus/` ve
`samples/` zaten `.gitignore` içindedir.
### 清理配置文件
- `safe` (varsayılan) — dosya uyumluluğunu önceleyerek doğrudan kimlik
belirleyici ve izleme amaçlı metadata'yı siler.
- `aggressive` — temizliği küçük resimlere, revizyon işaretlerine, gömülü
önizlemelere, renk profillerine, Windows sonrası işlemlerine ve bir
konteynerin beyan ettiği sonun ardına gizlenmiş verilere genişletir.
#### RAW 中的 Make/Model 平衡
RAW dönüştürücüler, demosaic ve renk profili seçmek için sensörü `Make` ve
`Model` etiketlerinden tanır. Bunları silmek, bazı dönüştürücülerin açmayı
reddedeceği bir dosya bırakabilir. Bu nedenle `safe` onları korur ve dosyanın
temiz olduğunu iddia etmek yerine `identifying` bulgusu olarak raporlar.
`aggressive` ise onları ve `UniqueCameraModel`'i siler, ayrıca gömülü önizleme
JPEG'lerinin EXIF'ini temizler.
Önizleme temizliği bilinçli olarak temkinlidir. Kayıpsız JPEG ile sıkıştırılmış
sensör verisi de bir önizleme ile aynı başlangıç işaretiyle başlar ve yalnızca
photometric yorumuyla ayrılır. Sensör verisi olma ihtimali olan hiçbir şeye
dokunulmaz.
### 日期策略
`clean`, temizlenen dosyanın dosya sistemi tarihlerini yeniden yazabilir.
Değiştirme ve erişim zamanları her platformda ayarlanır; oluşturma zamanı
Windows'ta ayrıca Win32 API üzerinden ayarlanır. Dosya sistemi tarihleri yaygın
bir OPSEC sızıntısıdır, bu yüzden politika yapılandırılabilir:
```
exif-killer clean foto.jpg --timestamp random
exif-killer clean foto.jpg --timestamp epoch
exif-killer clean foto.jpg --timestamp custom --timestamp-date 2020-05-01T13:00:00
exif-killer clean foto.jpg --timestamp keep
```
- `auto` (varsayılan) — profili izler: `aggressive` epoch'a sıfırlar, `safe`
tarihlere dokunmaz.
- `keep` — dosya sistemi tarihlerine hiç dokunmaz.
- `epoch` — `1970-01-01`'e sıfırlar.
- `random` — dosya başına makul bir rastgele tarih üretir; oluşturma ≤ değiştirme
≤ erişim sırası korunur, böylece dosya sırıtmaz.
- `custom` — `--timestamp-date` kullanır; `YYYY-AA-GG` veya ISO 8601 kabul eder.
### 桌面界面
```
exif-killer-gui
# 或:python main.py
```
GUI, CLI ile aynı servis katmanı üzerine kuruludur; ikisi aynı şekilde davranır.
İş akışı:
1. Dosyaları kuyruğa alın veya klasörleri sürükleyip bırakın.
2. Bir profil (`Safe` veya `Aggressive`) ve bir dosya tarihi politikası seçin.
3. `Scan` çalıştırın.
4. `Clean + Verify` çalıştırın.
5. JSON veya CSV kanıt raporu dışa aktarın.
Arayüz İngilizce ve Türkçe olarak mevcuttur ve çalışma anında değiştirilebilir.
### 验证模型
Bulgular beş kategoriye ayrılır:
| Kategori | Anlamı | Engelleyici |
| --- | --- | --- |
| `identifying` | Bir kişiyi, cihazı veya yazılım parmak izini açığa çıkarır | Evet |
| `tracking` | Dosyayı ilişkilendirebilir, izleyebilir veya zaman çizelgesine oturtabilir | Evet |
| `embedded-content` | Gömülü veya etkin içeriğe işaret eder | Evet |
| `filesystem` | Dosya sistemi metadata'sı | Hayır |
| `technical` | Uyumluluk veya yapı için gerekli | Hayır |
Engelleyici bir bulgu kaldığında doğrulama `warning` döner. Dosya sistemi
kalıntıları raporlanır ancak doğrulamayı başarısız kılmaz.
Kendi işini kendi ayrıştırıcısıyla denetleyen bir araç, kendi kör noktalarını
paylaşır. Bu nedenle test paketi, bağımsız olarak hemfikir olması gereken üçüncü
taraf uygulamalarla çapraz doğrulama yapar: TIFF ve RAW için Pillow (temizlenmiş
dosya hâlâ çözümlenebilmeli, pikseller aynı ve metadata gitmiş olmalı) ve Ogg
için [mutagen](https://mutagen.readthedocs.io/) (temizlikten önce etiketleri
görmeli, sonrasında geçerli bir akış ayrıştırabilmeli). mutagen yalnızca bir
geliştirme ekidir; araç onu asla import etmez ve o yokken bu testler atlanır.
### 退出代码
`scan`, `clean` ve `verify`:
| Kod | Anlamı |
| --- | --- |
| `0` | Başarılı, engelleyici bulgu kalmadı |
| `1` | Kullanım hatası veya çalışma zamanı hatası |
| `2` | Tamamlandı, ancak engelleyici bulgular kaldı |
| `3` | Desteklenen dosya bulunamadı |
`selftest`:
| Kod | Anlamı |
| --- | --- |
| `0` | Tüm dosyalar geçti |
| `1` | Bir dosya bozuldu veya işlenemedi |
| `2` | Artakalan metadata var |
| `3` | Desteklenen dosya bulunamadı |
### 报告格式
Her JSON rapor girdisi şunları içerir: `tool_version`, `command`, `profile`,
`status`, `backend`, `input_path`, `output_path`, `file_type`, `sha256_before`,
`sha256_after`, `findings`, `removed_fields`, `remaining_findings`, `warnings`
ve `timestamp_utc`. Örnek: [docs/example_report.json](docs/example_report.json).
### 开发
```
pip install -e .[dev]
pytest # 118 test
mypy
ruff check .
```
Kod tabanı iki katmandan oluşur. `cleaners/` format motorlarını barındırır ve
CLI ile GUI'den habersizdir. `exif_killer/` orkestrasyonu barındırır: servis,
risk sınıflandırması, raporlama ve iki arayüz.
### 安全态势
- Varsayılan olarak çevrimdışı
- Telemetri yok, bulut taraması yok, otomatik güncelleme ajanı yok
- Çalışma zamanında hiçbir dış çalıştırılabilir dosya yok
- Denetim izi için yapılandırılmış JSON ve CSV kanıtı
- Alpha sürümü için Windows taşınabilir derleme hedefi
### 已知限制
- `v0.1.0-alpha` için birincil hedef platform Windows'tur.
- Canon CR3 (TIFF değil, ISOBMFF tabanlıdır), Fuji RAF ve Sigma X3F
desteklenmez. BigTIFF tahmin edilmek yerine reddedilir.
- Canon CRW motoru CIFF spesifikasyonuna göre yazılmış ve fixture'larla test
edilmiştir, ancak henüz gerçek bir kamera dosyasıyla sınanmamıştır.
- Ogg FLAC (Ogg konteyneri içindeki FLAC) tespit edilir ancak temizlenmez;
native `.flac` dosyaları tam olarak işlenir.
- RAW, CRW ve Matroska temizliği tasarımı gereği byte hassasiyetindedir, bu
yüzden bu dosyalar hiç küçülmez: metadata kesilip atılmak yerine yerinde
üzerine yazılır, çünkü aksi halde iç offset tabloları bozulurdu.
- pikepdf/qpdf silindikten sonra bile her PDF kaydında trailer `/ID` alanını
yeniden yazar. Exif Killer bu değeri benzersiz olmayan sabit bir ID ile
değiştirir. Özgün, izlenebilir belge ID'leri hâlâ raporlanır; nötr yedek değer
teknik uyumluluk alanı olarak ele alınır.
- Bir RAW'ın gömülü önizlemesi korunur: dosyanın zaten içerdiği fotoğrafın
aynısını gösterir. Kendi EXIF'i `aggressive` altında temizlenir.
- Özyinelemeli arşiv incelemesi alpha kapsamında değildir.
- Oluşturma zamanı yeniden yazımı yalnızca Windows'tadır; değiştirme ve erişim
zamanları tüm platformlarda ayarlanır.
- Motorlar elle kurulmuş fixture'larla test edilir ve üçüncü taraf
ayrıştırıcılarlaapraz doğrulanır. Gerçekten önemsediğiniz formatları sınamak
için kendi dosyalarınız üzerinde `exif-killer selftest` çalıştırın.
### 许可证
MIT. Bkz. [LICENSE](LICENSE).
标签:ESC4, OPSEC, OSINT, Python, 元数据清理, 域名收集, 数字取证, 无后门, 网络安全, 自动化脚本, 误配置预防, 逆向工具, 隐私保护