Crowligarchy/cache-crow

GitHub: Crowligarchy/cache-crow

一个用于从Discord、Slack等应用的本地缓存中恢复和分析媒体文件的命令行工具。

Stars: 0 | Forks: 0

# cache-crow [![PyPI version](https://badge.fury.io/py/cache-crow.svg)](https://pypi.org/project/cache-crow/) [![Downloads](https://pepy.tech/badge/cache-crow)](https://pepy.tech/project/cache-crow) [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![Tests](https://img.shields.io/github/actions/workflow/status/Crowligarchy/cache-crow/tests.yml?label=tests)](https://github.com/Crowligarchy/cache-crow/actions) [![GitHub stars](https://img.shields.io/github/stars/Crowligarchy/cache-crow?style=social)](https://github.com/Crowligarchy/cache-crow/stargazers) 支持 **Linux、macOS 和 Windows**。当前针对 **Discord 和 Slack**;未来路线图将支持更多应用。 ## 功能介绍 Discord 是基于 Chromium 构建的 Electron 应用。Chromium 的网络栈为了性能维护着本地的 HTTP 缓存——你查看的每张图片、GIF 和视频都会以二进制文件形式写入磁盘,这些文件没有扩展名,文件名类似 `f_000001` 或 `f_00a3f2`。 当有人删除消息时,Discord 会移除服务器端的记录,并告知你的客户端将其隐藏。但它无法深入你的本地文件系统删除缓存副本。**该文件会留在磁盘上**——有时会持续数天或数周,这取决于 Chromium 的缓存清除计划。 cache-crow 利用了这一点: 1. 扫描 `Cache_Data/` 目录中匹配已知媒体文件魔术字节的文件 2. 无需猜测,准确识别每个文件的格式(PNG、JPEG、GIF、WebP、MP4、WebM) 3. 使用正确的扩展名提取文件,剥离 Chrome Simple Cache 包装 4. 可选择从嵌入的缓存条目头信息中恢复原始 CDN URL 无需账户。无需网络访问。无需第三方服务器。只读取你的操作系统用户账户已有权限读取的文件。 ## 安装 ``` # 推荐方式 — 安装到独立环境,无需修改 PATH pipx install cache-crow # 或使用标准 pip 安装 pip install cache-crow # 从源码安装(最新未发布代码) pipx install git+https://github.com/Crowligarchy/cache-crow pip install git+https://github.com/Crowligarchy/cache-crow ``` ### 可选附加功能 ``` # 交互式 TUI 浏览器(由 Textual 支持) pip install 'cache-crow[tui]' # LevelDB 索引读取器 — 从缓存索引恢复 CDN URL pip install 'cache-crow[leveldb]' # 全部内容 pip install 'cache-crow[all]' ``` ### 验证安装 ``` cache-crow --version # cache-crow 0.1.0 ``` ## 快速开始 ``` # 扫描您的 Discord 缓存,以表格形式显示所有找到的媒体 cache-crow # 仅统计:计数与大小,不列出文件 cache-crow --stats # 将所有 >=1 KB 的内容提取到 ./recovered/,并保留正确扩展名 cache-crow --output-dir ./recovered # 针对 Slack 而非 Discord cache-crow --app slack # 指定特定目录(用于取证或其他用户配置文件) cache-crow --cache-dir /path/to/Cache_Data # 机器可读 JSON — 可通过 jq、脚本或其他方式处理 cache-crow --format json | jq '.[] | select(.mime_type == "video/mp4")' # 实时监控:显示新出现的缓存文件 cache-crow --watch --output-dir ./live-capture # 交互式 TUI 浏览器 cache-crow --tui ``` ## 演示 ``` $ cache-crow --stats Cache Stats ┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓ ┃ Metric ┃ Value ┃ ┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩ │ Total files scanned │ 39 │ ├─────────────────────┼─────────┤ │ Media files found │ 23 │ ├─────────────────────┼─────────┤ │ Total media size │ 92.0 KB │ └─────────────────────┴─────────┘ Breakdown by Type ┏━━━━━━━━━━━━┳━━━━━━━┓ ┃ Type ┃ Count ┃ ┡━━━━━━━━━━━━╇━━━━━━━┩ │ image/png │ 8 │ ├────────────┼───────┤ │ image/jpeg │ 5 │ ├────────────┼───────┤ │ image/webp │ 4 │ ├────────────┼───────┤ │ image/gif │ 3 │ ├────────────┼───────┤ │ video/mp4 │ 2 │ ├────────────┼───────┤ │ video/webm │ 1 │ └────────────┴───────┘ ``` ``` $ cache-crow Media in discord cache ┏━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━┓ ┃ Filename ┃ Type ┃ Size ┃ ┡━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━┩ │ f_000001 │ image/png │ 11.4 KB │ │ f_000006 │ image/png │ 11.4 KB │ │ f_000009 │ image/jpeg │ 120 B │ │ f_000023 │ video/webm │ 104 B │ │ f_000017 │ image/webp │ 45 B │ │ f_000014 │ image/gif │ 42 B │ │ f_000021 │ video/mp4 │ 40 B │ │ ... │ ... │ ... │ └──────────┴────────────┴─────────┘ Media files found: 23 of 39 total ``` ``` $ cache-crow --output-dir ./recovered Extracting from: /home/user/.config/discord/Cache/Cache_Data Extraction Results ┏━━━━━━━━━━━━━━━┳━━━━━━━┓ ┃ Metric ┃ Value ┃ ┡━━━━━━━━━━━━━━━╇━━━━━━━┩ │ Total scanned │ 39 │ ├───────────────┼───────┤ │ Extracted │ 8 │ ├───────────────┼───────┤ │ Skipped │ 31 │ └───────────────┴───────┘ Output: ./recovered ``` ## 完整使用参考 ``` usage: cache-crow [-h] [--version] [--app APP] [--cache-dir PATH] [--output-dir PATH] [--min-size BYTES] [--stats] [--format FORMAT] [--metadata] [--watch] [--watch-all] [--tui] options: --version Show version and exit --app APP Target app: discord (default) or slack --cache-dir PATH Override the cache directory (skips auto-detection) --output-dir PATH Extract found media files into PATH with correct extensions --min-size BYTES Minimum file size to extract, in bytes (default: 1024) --stats Summary stats only (counts and sizes, no file listing) --format FORMAT Output format: table (default) or json --metadata Enrich entries with CDN URLs and guild/channel IDs --watch Watch for new cache files in real time (Ctrl+C to stop) --watch-all In watch mode, show all files, not just media --tui Interactive TUI browser (requires cache-crow[tui]) ``` ## 工作原理 ### Chrome Simple Cache 格式 Discord 的 Chromium 缓存使用 "Simple Cache" 格式。每个条目是一个单独的文件: ``` [24-byte header][URL key][response body][EOF record][response headers][EOF record] ``` 头信息包含作为 UTF-8 键值的原始 CDN URL。响应体是实际的媒体内容。cache-crow 解析此结构以提取原始字节——而不仅仅是复制原始文件——因此提取的媒体是干净且可播放的。 ### 魔术字节检测 cache-crow 不依赖文件名或扩展名(它们本就不存在),而是读取每个文件的开头字节并与已知签名进行匹配: | 魔术字节 | 格式 | |--------------------------|-----------| | `\x89PNG` | PNG | | `\xFF\xD8\xFF` | JPEG | | `GIF8` 或 `GIF9` | GIF | | `RIFF....WEBP` | WebP | | `....ftyp`(偏移量 4) | MP4 | | `\x1A\x45\xDF\xA3` | WebM/MKV | ### CDN URL 恢复 使用 `--metadata` 选项,cache-crow 还会读取嵌入在每个缓存条目头信息中的 URL 键。对于 Discord 的附件,URL 编码了服务器 ID、频道 ID 和原始文件名: ``` https://cdn.discordapp.com/attachments/{guild_id}/{channel_id}/{filename} ``` 这让你可以将缓存文件追溯到最初分享它的 Discord 频道和服务器。 ## 缓存持久性:事实说明 **删除消息不会清除缓存。** 当你删除一条 Discord 消息时,服务器端的记录会被移除。其他客户端会收到删除事件。但每个查看者机器上 Chromium 的磁盘缓存没有接收删除信号的机制——它只是保留该文件,直到其正常的清除周期。 **Discord 的 "清除缓存" 设置不可靠。** Discord 内置的缓存清除通过 Electron API 进行。清除前写入的文件有时会被清除,有时不会——这取决于 Chromium 内部的清除顺序,而不是保证删除。 **卸载 Discord 不会移除缓存。** 在大多数系统上,`~/.config/discord` 目录不会被卸载程序触碰。`Cache_Data` 目录在卸载后依然存在。 **这不是 Discord 的 bug。** 这是记录在案的 Chromium 行为,所有 Electron 应用都存在:Discord、Slack、VS Code、Teams、Signal Desktop、Telegram Desktop。本地磁盘缓存是一个性能特性,而非隐私控制。 ## 支持的应用 | 应用 | Linux 路径 | 状态 | |----------------|--------------------------------------------------|--------| | Discord | `~/.config/discord/Cache/Cache_Data` | 稳定 | | Discord Canary | `~/.config/discordcanary/Cache/Cache_Data` | 稳定 | | Discord PTB | `~/.config/discordptb/Cache/Cache_Data` | 稳定 | | Slack | `~/.config/Slack/Cache/Cache_Data` | 稳定 | macOS 和 Windows 路径也会被自动检测——完整列表请参见 `cache-crow --help`。 路线图:Telegram Desktop、Signal Desktop、VS Code、Microsoft Teams。欢迎提交 PR。 ## 与现有工具对比 大多数 Discord 缓存工具编写于 2019-2022 年,仅针对 Windows,且需要 GUI。cache-crow 有所不同: | 特性 | cache-crow | 大多数替代工具 | |--------------------------|-----------------|-------------------| | 跨平台 | 是 | 仅 Windows | | CLI / 可脚本化 | 是 | 仅 GUI | | JSON 输出 / 管道友好 | 是 | 否 | | Chrome Simple Cache 解析 | 是(流式处理) | 原始文件复制 | | 魔术字节检测 | 是 | 扩展名重命名 | | 多应用支持 | 是 | 仅 Discord | | 最小依赖(仅 rich) | 是 | 不一 | | 实时监视模式 | 是 | 否 | | TUI 浏览器 | 是 | 否 | | CDN URL 恢复 | 是 | 否 | | 积极维护 | 2025年 | 2019-22年已弃用 | ## 安全与隐私 cache-crow 是一个取证和隐私研究工具。它只读取你本地文件系统上操作系统用户账户已有权限读取的文件。它不进行任何网络请求。 **预期使用场景:** - **DFIR / 事件响应**——从受损或被查封的主机中恢复证据 - **隐私审计**——了解你的 Electron 应用为你存储了什么 - **安全研究**——研究 Chromium 的磁盘缓存格式和行为 - **个人恢复**——找回你查看过但忘记保存的内容 如果你使用此工具访问你不拥有或没有明确权限检查的设备,这属于你与你所在辖区计算机滥用法律之间的法律问题。作者对误用不承担任何责任。 ## 许可证 MIT。参见 [LICENSE](LICENSE)。
标签:CDN URL恢复, Chromium缓存, Discord缓存, Electron应用, WSL, 二进制文件处理, 媒体提取, 媒体文件恢复, 应用缓存探索, 数字取证, 数据恢复, 文件扫描, 文件格式识别, 本地文件分析, 缓存分析, 缓存探索, 缓存文件管理, 缓存浏览, 缓存过滤, 自动化脚本, 逆向工具