cysec-don/forensic-file-converter
GitHub: cysec-don/forensic-file-converter
一个纯 Python 实现的专业取证文件格式转换工具,支持 27 种以上的存档、磁盘镜像和取证格式之间的互转,面向数字取证和应急响应场景。
Stars: 0 | Forks: 0
Forensic File Converter
一个用于在存档、磁盘映像和取证文件格式之间进行转换的专业级 Python 工具。
## 概述 Forensic File Converter 是一款专为数字取证人员、事件响应者和安全分析师设计的模块化、可扩展的命令行工具。它支持在三大类 **27 种以上的文件格式** 之间进行无缝转换: - **存档 / 压缩格式**(11 种格式) — ZIP, TAR, TAR.GZ, TAR.BZ2, TAR.XZ, GZIP, BZIP2, XZ, 7-Zip, RAR, CAB - **磁盘映像格式**(10 种格式) — QCOW2, VMDK, VHD, VHDX, ISO, IMG, RAW, DD, BIN, DMG - **取证映像格式**(6 种格式) — Windows Crash Dump (`.dump`/`.dmp`), LiME (`.lime`), EnCase E01/EX01 (`.e01`/`.ex01`), AFF (`.aff`) 该工具具有以下特性:通过魔数签名和扩展名分析进行智能格式检测、为安全起见采用默认拒绝的转换矩阵、针对多 GB 内存转储的流式大文件支持,以及针对路径遍历攻击的全面安全防护。它秉承核心操作零第三方依赖的理念构建 —— 所有的主要功能仅使用 Python 标准库。对于标准库无法原生处理的格式,像 `qemu-img`、`7z` 和 `dmg2img` 这样的外部工具可作为可选的备选方案。 **作者:** Cysec Don | [cysecdon@gmail.com](mailto:cysecdon@gmail.com) ## 功能 ### 核心能力 - **格式检测** — 使用魔数签名和扩展名映射进行双层检测,具备冲突解决逻辑,优先采用魔数(难以伪造),同时允许像 `.tar.gz` 这样的复合扩展名覆盖模糊的魔数匹配 - **转换矩阵** — 默认拒绝的允许列表机制,编码了哪些转换受支持、无损、部分支持或需要外部工具。每个缺失的条目都会导致清晰的 `UnsupportedConversion` 错误,而不是静默的数据丢失 - **流式引擎** — 64 MiB 基于块分片的流式传输,用于处理大型取证映像(10 GB 以上的内存转储)而不会过度消耗内存。文件永远不会被整体加载到内存中 - **插件系统** — 基于装饰器的处理程序注册表,无需修改核心代码即可扩展格式支持。只需使用简单的 `@handler_registry.register` 装饰器即可添加新格式 - **安全加固** — 路径遍历防护(针对 ZIP 的 CVE-2007-4559,针对 TAR 存档的 TAR slip),在非交互式环境下需要显式使用 `--overwrite` 标志的覆盖保护,转换前的磁盘空间检查,且不进行任何网络访问 - **零第三方依赖** — 核心操作采用纯 Python 标准库;对于 7z、RAR、QCOW2、VMDK 等格式,外部工具是可选的备选方案 ### 取证格式支持 - **Windows Crash Dumps** (`.dump` / `.dmp`) — 解析 `PAGE` 和 `PAGEDU` 头部,支持 MiniDump、FullDump 和 KernelDump 类型。通过剥离或前置 4096 字节的 DUMP_HEADER 实现与 RAW 格式的相互转换 - **LiME Memory Dumps** (`.lime`) — 解析 24 字节的 LiME v1 头部并提取基地址。通过剥离或前置头部实现与 RAW 格式的相互转换 - **EnCase EWF** (`.e01` / `.ex01`) — 解析包含案例编号和节数量的 EWF 文件头。支持 E01↔EX01 重塑头部、EWF↔RAW 转换,以及跨取证格式转换 (EWF↔DUMP, EWF↔LIME)。兼容 Autopsy 和 Guymager 工作流 - **AFF** (`.aff`) — 解析包含页面大小和压缩元数据的 AFF v1 头部。支持 AFF↔RAW, AFF↔DUMP, AFF↔LIME, 和 AFF↔EWF 转换 ## 支持的格式 ### 存档 / 压缩格式 | 格式 | 扩展名 | 解压 | 创建 | 转换 | 备注 | |--------|-----------|---------|--------|---------|-------| | ZIP | `.zip` | stdlib | stdlib | 完整 | 纯 Python,具有路径遍历防护 (CVE-2007-4559) | | TAR | `.tar` | stdlib | stdlib | 完整 | 纯 Python,具有路径遍历防护 | | TAR.GZ | `.tar.gz`, `.tgz` | stdlib | stdlib | 完整 | 感知复合扩展名 | | TAR.BZ2 | `.tar.bz2`, `.tbz2` | stdlib | stdlib | 完整 | 感知复合扩展名 | | TAR.XZ | `.tar.xz`, `.txz` | stdlib | stdlib | 完整 | 感知复合扩展名 | | GZIP | `.gz`, `.gzip` | stdlib | stdlib | 完整 | 仅支持单文件压缩 | | BZIP2 | `.bz2` | stdlib | stdlib | 完整 | 仅支持单文件压缩 | | XZ | `.xz` | stdlib | stdlib | 完整 | 仅支持单文件压缩 | | 7-Zip | `.7z` | 7z (ext) | 7z (ext) | 完整 | 需要 `p7zip-full` | | RAR | `.rar` | unrar/7z | rar (ext) | 完整 | 需要 `unrar` 或 `rar` | | CAB | `.cab` | cabextract/7z | 受限 | 部分 | 需要 `cabextract` | ### 磁盘映像格式 | 格式 | 扩展名 | 转换 | 工具 | |--------|-----------|---------|------| | QCOW2 | `.qcow2` | 外部 | `qemu-img` | | VMDK | `.vmdk` | 外部 | `qemu-img` | | VHD | `.vhd` | 外部 | `qemu-img` | | VHDX | `.vhdx` | 外部 | `qemu-img` | | ISO | `.iso` | 外部 | `genisoimage` / `xorriso` | | IMG | `.img` | 完整 | 纯 Python | | RAW | `.raw` | 完整 | 纯 Python | | DD | `.dd` | 完整 | 纯 Python | | BIN | `.bin`, `.cue` | 完整 | 纯 Python | | DMG | `.dmg` | 外部 | `dmg2img` (Linux) / `hdiutil` (macOS) | ### 取证格式 | 格式 | 扩展名 | 魔数签名 | 描述 | |--------|-----------|----------------|-------------| | Windows Dump | `.dump`, `.dmp`, `.vdmp` | `PAGE` / `PAGEDU` | Windows 崩溃转储 (32/64 位) | | LiME | `.lime` | `LiME` | Linux 内存提取工具 | | E01 (EWF) | `.e01` - `.e10`, `.ewf` | `EVF\x09\x0d\x0a\xff\x00` | EnCase Expert Witness 格式 | | EX01 (EWF) | `.ex01` | `EVF\x09\x0d\x0a\xff\x01` | EnCase v8+ EWF 格式 | | AFF | `.aff`, `.afd`, `.afm` | `AFF\x00` / `AFF\x01` | Advanced Forensics 格式 | ## 安装说明 ### 从源码安装 ``` git clone https://github.com/cysec-don/forensic-file-converter.git cd forensic-file-converter pip install -e . ``` 这将安装 `converter` 命令行工具并使 Python 包可供导入。 ### 可选外部工具 为了获得完整的格式支持,请安装这些可选工具。该工具能够优雅地处理缺失的依赖项 —— 它只会报告哪些转换不可用并建议安装命令。 ``` # 归档工具 sudo apt install p7zip-full unrar cabextract # 磁盘镜像工具 sudo apt install qemu-utils genisoimage xorriso # DMG 支持 (Linux) sudo apt install dmg2img # 取证工具 (用于完整的 EWF/AFF 解压) sudo apt install libewf-tools afflib-tools ``` ### 在 macOS 上 ``` brew install p7zip qemu cdrtools ``` ### 验证安装 安装完成后,请验证一切是否正常工作: ``` # 显示版本 python -m converter --version # 检查可用的外部工具 python -m converter --check-deps # 列出所有支持的格式 python -m converter --list-formats ``` ## 用法 ### 命令行界面 ``` python -m converter [OPTIONS] ``` ### 在格式之间转换 主要操作模式是格式转换。使用 `-i` 指定输入文件,使用 `-o` 指定输出文件。该工具会自动从魔数和/或扩展名检测源格式,并根据输出文件的扩展名确定目标格式。 ``` # 转换磁盘镜像格式 python -m converter -i disk.img -o disk.qcow2 python -m converter -i disk.vmdk -o disk.vhdx # 转换归档格式 python -m converter -i data.zip -o data.tar.gz python -m converter -i archive.7z -o archive.tar.bz2 # 转换取证格式 python -m converter -i mem.lime -o mem.raw python -m converter -i crash.dump -o crash.raw python -m converter -i evidence.e01 -o evidence.raw python -m converter -i image.aff -o image.raw # 跨格式取证转换 python -m converter -i mem.lime -o mem.dump python -m converter -i evidence.e01 -o evidence.ex01 python -m converter -i evidence.e01 -o evidence.aff # 取证格式转 VM 格式 (去除文件头 + qemu-img 转换) python -m converter -i mem.dump -o mem.qcow2 # 显式指定输出格式 (覆盖扩展名检测) python -m converter -i input.dat -o output.img --format raw ``` ### 提取存档和映像 ``` # 解压归档到目录 python -m converter --extract archive.tar.gz python -m converter --extract archive.tar.gz -d /tmp/extracted # 提取磁盘镜像 (ISO 等) python -m converter --extract cdrom.iso -d /mnt/iso ``` ### 创建存档和映像 ``` # 从目录创建归档 python -m converter --create backup.tar.gz /path/to/folder/ python -m converter --create archive.zip /path/to/folder/ # 从目录创建 ISO 镜像 python -m converter --create cdrom.iso /path/to/cd-contents/ # 创建单文件压缩归档 python -m converter --create document.gz /path/to/single-file.txt ``` ### 列出内容 ``` # 以表格形式列出归档内容 python -m converter --list archive.zip python -m converter --list disk.iso ``` ### 实用程序命令 ``` # 检查必需的外部工具 python -m converter --check-deps # 列出所有支持的格式 python -m converter --list-formats # 显示版本 python -m converter --version # 详细 / 调试模式 (-v = INFO, -vv 或 --debug = DEBUG) python -m converter -i in.img -o out.qcow2 -vv # 强制覆盖现有输出文件 python -m converter -i in.img -o out.qcow2 --overwrite ``` ### 退出码 该工具使用语义化的退出码来区分不同的失败模式,使其适合在脚本和 CI/CD 流水线中使用: | 代码 | 含义 | |------|---------| | 0 | 成功 | | 1 | 一般错误 / 转换失败 | | 2 | 不支持的转换(源 → 目标对不在转换矩阵中) | | 3 | 缺少外部依赖项(在 `$PATH` 中未找到所需的工具) | | 4 | 验证错误(找不到文件、拒绝覆盖、磁盘空间不足) | ## 架构 ``` converter/ __init__.py # Package metadata, version, author __main__.py # Entry point for `python -m converter` cli.py # Argument parser, sub-commands, exit codes plugins.py # Extensible handler registry with decorator API core/ __init__.py # Re-exports from core modules detector.py # Format detection (magic bytes + extension) dispatcher.py # Conversion matrix, routing, error types dependencies.py # External tool discovery and reporting handlers/ __init__.py # Handler re-exports archive.py # Archive/compression handler (11 formats) disk.py # Disk image + forensic handler (16 formats) utils/ __init__.py # Utility re-exports validation.py # File safety, overwrite protection, path guards logging.py # Structured logging with error classification tests/ test_converter.py # 199 unit tests covering all modules ``` ### 设计决策 1. **默认拒绝的转换矩阵** — 每次转换都必须明确列在矩阵中。缺失的条目将导致 `UnsupportedConversion` 错误,而不是静默的数据丢失。这可以防止该工具尝试可能会破坏数据或丢失元数据的转换。 2. **魔数优先于扩展名** — 当魔数和扩展名不一致时,以魔数为准(它们更难被伪造)。复合扩展名 (`.tar.gz`) 是一个例外 —— 它们总是覆盖模糊的魔数匹配,因为 `.tar.gz` 文件在语义上不同于单文件 gzip 数据流,即使它们共享相同的 gzip 魔数。 3. **跨类别拒绝** — 存档到磁盘以及磁盘到存档的转换在调度器级别被明确阻止。用户必须执行两步式“先解压再转换”的工作流。这可以防止该工具对如何跨根本不同的格式类别转换数据做出错误的假设。 4. **大文件流式传输** — 取证转换使用 64 MiB 基于块分片的流式传输来处理多 GB 的内存转储,而无需将整个文件加载到内存中。这对于在实际内存映像可能超过 10 GB 的现实世界取证工作流中至关重要。 5. **安全防护** — ZIP 提取防护 CVE-2007-4559 (zip-slip)。TAR 提取使用 `os.path.realpath()` 针对目标目录验证所有成员路径。在非交互式上下文中的覆盖保护需要显式的 `--overwrite` 标志。转换前的磁盘空间检查可防止在转换中途出现“磁盘已满”的失败情况。 6. **零标准库违规** — 所有核心操作仅使用 Python 标准库模块(`zipfile`, `tarfile`, `gzip`, `bz2`, `lzma`, `struct`, `shutil`)。像 `qemu-img`、`7z` 和 `dmg2img` 这样的外部工具仅在标准库无法处理的格式下才会被调用,并且在它们缺失时会得到优雅地报告,而不是导致程序崩溃。 ## 取证格式详情 ### Windows 崩溃转储 (`.dump` / `.dmp`) Windows 崩溃转储以偏移量 0 处的 `PAGE`(32 位)或 `PAGEDU`(64 位)签名开头,后跟一个 4096 字节的 `DUMP_HEADER` 结构。位于偏移量 8 的 `ValidDump` 字段标识转储类型: | ValidDump | 类型 | 描述 | |-----------|------|-------------| | 1 | MiniDump | 用户模式进程转储 | | 2 | FullDump | 完整的物理内存转储 | | 3 | KernelDump | 内核模式内存转储 | 将 DUMP 转换为 RAW 会 4096 字节的头部。将 RAW 转换为 DUMP 会前置一个最小化的头部(不包含有效的系统上下文)。这些是**部分**转换 —— 头部元数据会丢失或被伪造。原始内存数据本身被无损保留。 ### LiME (`.lime`) LiME (Linux Memory Extractor) 文件具有一个 24 字节的头部: | 偏移量 | 大小 | 字段 | |--------|------|-------| | 0 | 4 | 魔数 (`LiME`) | | 4 | 1 | 版本 (通常为 1) | | 5 | 3 | 保留 | | 8 | 8 | 基地址 (uint64 LE) | | 16 | 8 | 保留 | 将 LIME 转换为 RAW 会剥离 24 字节的头部。将 RAW 转换为 LIME 会前置一个 `base_address=0` 的头部。为了进行准确的取证分析,基地址理想情况下应与源系统匹配,因此可能需要手动调整。 ### EWF / EnCase (`.e01` / `.ex01`) EnCase Expert Witness Format 是 EnCase、Autopsy 和 Guymager 使用的主要取证映像格式。EWF 文件头(624 字节)包含: | 偏移量 | 大小 | 字段 | |--------|------|-------| | 0 | 3 | 签名 (`EVF`) | | 7 | 1 | 版本代码 (0x00=E01, 0x01=EX01) | | 8 | 16 | 案例编号 (null 填充) | | 24 | 4 | 节数量 (uint32 LE) | E01 到 EX01 的转换会保留数据节,仅重塑文件的头部。要进行带有块处理的完整 EWF 解压,请使用 libewf 中的 `ewfexport`。该工具的简化转换会剥离 624 字节的头部,用于原始中间处理。 ### AFF (`.aff`) Advanced Forensics Format 支持压缩和加密。AFF v1 头部(36 字节)包含: | 偏移量 | 大小 | 字段 | |--------|------|-------| | 0 | 4 | 魔数 (`AFF\x00`) | | 4 | 4 | 主版本号 (uint32 BE) | | 8 | 4 | 次版本号 (uint32 BE) | | 12 | 8 | 总大小 (uint64 BE) | | 20 | 8 | 压缩后大小 (uint64 BE) | | 28 | 8 | 页面大小 (uint64 BE,通常为 4096) | 该工具剥离 36 字节的 AFF 头部以进行转换。头部移除后,AFF 页面可能仍处于压缩状态;要进行完整的 AFF 解压,请使用 AFFLIB 中的 `affcat`。 ## Python API 该工具也可作为 Python 库用于编程访问: ### 格式检测 ``` from converter.core.detector import detect_format, FormatID, FormatCategory # 检测文件格式 info = detect_format("memory.lime") print(info.format_id) # FormatID.LIME print(info.detected_by) # "magic" print(info.category) # FormatCategory.DISK_IMAGE print(info.confidence) # "high" ``` ### 转换 ``` from converter.core.dispatcher import Dispatcher dispatcher = Dispatcher() # 转换文件 dispatcher.dispatch("input.lime", "output.raw", overwrite=True) dispatcher.dispatch("input.zip", "output.tar.gz", overwrite=True) # 提取归档 dest = dispatcher.extract("archive.tar.gz", dest_dir="/tmp/out") # 创建归档 dispatcher.create("backup.zip", "/path/to/folder/") # 列出内容 entries = dispatcher.list_contents("archive.zip") for entry in entries: print(f"{entry['name']} {entry['size']} {entry['is_dir']}") ``` ### 取证头部解析 ``` from converter.core.detector import ( parse_lime_header, build_lime_header, parse_dump_header, parse_ewf_header, build_ewf_header, parse_aff_header, build_aff_header, ) # 解析取证文件头 lime_info = parse_lime_header("mem.lime") print(f"Version: {lime_info['version']}, Base: 0x{lime_info['base_address']:x}") dump_info = parse_dump_header("crash.dump") print(f"Type: {dump_info['dump_type']}, Signature: {dump_info['signature']}") ewf_info = parse_ewf_header("evidence.e01") print(f"Case: {ewf_info['case_number']}, Sections: {ewf_info['section_count']}") aff_info = parse_aff_header("image.aff") print(f"Version: {aff_info['major']}.{aff_info['minor']}, Page: {aff_info['page_size']}") # 从头构建文件头 header = build_lime_header(version=1, base_address=0x100000) header = build_ewf_header(case_number="CASE-001", is_ex01=False) header = build_aff_header(page_size=4096, major=1, minor=0) ``` ### 插件系统 ``` from converter.plugins import handler_registry @handler_registry.register("custom", extensions=[".custom"]) class CustomFormatHandler: def extract(self, input_path, dest_dir=None): ... def create(self, output_path, source, target_fmt=None): ... def convert(self, input_path, output_path, **kwargs): ... def list_contents(self, input_path): ... ``` ## 安全性 ### 路径遍历防护 - **ZIP 提取** 防御 CVE-2007-4559 (zip-slip)。存档中的每个成员路径都使用 `os.path.realpath()` 进行验证,以确保其解析在目标目录内。 - **TAR 提取** 类似地验证所有成员路径。任何试图逃逸目标目录的路径都将被拒绝并给出清晰的错误信息。 - **输出路径** 通过 `safe_output_path()` 进行清理,该函数会解析绝对路径并安全地创建父目录。 ### 覆盖保护 - 非交互式上下文(流水线、CI、定时任务)拒绝覆盖现有文件,除非显式设置了 `--overwrite`。 - 交互式 (TTY) 上下文在覆盖前会提示用户进行确认。 ### 无网络访问 该工具不执行任何网络操作。所有转换完全在本地进行。不会向外部传输任何数据。 ### 磁盘空间检查 转换前的磁盘空间验证可防止在转换中途出现“磁盘已满”的失败情况。该检查使用可配置的乘数(默认为输入文件大小的 2 倍)作为启发式估算。 ### 外部工具沙箱化 外部命令(`qemu-img`, `7z`, `dmg2img` 等)在运行时设置 `capture_output=True` 并带有明确的超时时间(1-2 小时),以防止挂起或与终端发生意外交互。 ## 测试 测试套件包含覆盖所有模块的 **199 个单元测试**: ``` # 运行所有测试 python -m pytest tests/test_converter.py -v # 运行特定测试类 python -m pytest tests/test_converter.py::TestForensicConversions -v python -m pytest tests/test_converter.py::TestEwfConversions -v python -m pytest tests/test_converter.py::TestAffConversions -v # 运行覆盖率测试 python -m pytest tests/test_converter.py -v --cov=converter # 运行单个测试 python -m pytest tests/test_converter.py::TestLimeHeader::test_lime_roundtrip_build_parse -v ``` ### 测试覆盖率 | 模块 | 测试类 | 测试 | |--------|-----------|-------| | 格式检测 | `TestFormatDetection` | 扩展名、魔数、冲突、规范化 | | 验证 | `TestValidation` | 文件/目录存在性、覆盖、磁盘空间 | | 存档处理程序 | `TestArchiveHandler` | ZIP, TAR, TAR.GZ/BZ2/XZ、流格式、转换 | | 调度器 | `TestDispatcher` | 转换矩阵、路由、取证支持 | | LiME 头部 | `TestLimeHeader` | 构建、解析、往返、边缘情况 | | Dump 头部 | `TestDumpHeader` | PAGE/PAGEDU、类型、边缘情况 | | EWF 头部 | `TestEwfHeader` | E01/EX01 构建、解析、往返 | | AFF 头部 | `TestAffHeader` | 构建、解析、往返、边缘情况 | | 取证转换 | `TestForensicConversions` | LIME↔RAW, DUMP↔RAW, LIME↔DUMP, BIN、流式传输 | | EWF 转换 | `TestEwfConversions` | E01↔RAW, E01↔EX01, E01↔DUMP/LIME | | AFF 转换 | `TestAffConversions` | AFF↔RAW, AFF↔DUMP/LIME, AFF↔BIN | | 调度器 (EWF/AFF) | `TestEwfAffDispatcher` | 所有取证转换的矩阵条目 | | CLI | `TestCLI` | 参数解析、退出码、所有模式 | | 插件系统 | `TestPluginSystem` | 注册、查找、装饰器、扩展搜索 | | 日志 | `TestLogging` | 级别配置、错误分类 | | 边缘情况 | `TestEdgeCases` | 损坏的文件、空存档、格式冲突 | ## 贡献 欢迎贡献!以下是入门指南: 1. Fork 本代码库 2. 创建一个功能分支:`git checkout -b feature/my-feature` 3. 进行您的更改并添加测试 4. 运行测试套件:`python -m pytest tests/test_converter.py -v` 5. 使用描述性信息进行提交 6. 推送并创建 Pull Request ### 添加新格式 1. 在 `converter/core/detector.py` 中添加一个 `FormatID` 枚举值 2. 在 `_EXTENSION_MAP` 中添加扩展名映射 3. 在 `_MAGIC_SIGNATURES` 中添加魔数签名(如果适用) 4. 在 `_FORMAT_CATEGORY` 中添加类别映射 5. 在 `dispatcher.py` 的 `_build_conversion_matrix()` 中添加转换条目 6. 在相应的处理程序类中实现处理方法 7. 添加全面的测试 ## 环境要求 - **Python**:3.10 或更高版本 - **无必需的第三方包** — 核心功能仅使用 Python 标准库 - **可选的外部工具** 用于扩展格式支持(见安装说明) ## 许可证 版权所有 2024 Cysec Don (cysecdon@gmail.com) 根据 **Apache License, Version 2.0**(以下简称“许可证”)获得许可;除非遵守该许可证,否则您不得使用本软件。您可以在以下地址获取许可证副本: - [LICENSE](LICENSE) — 完整的 Apache 2.0 许可证文本 - [NOTICE](NOTICE) — 署名和第三方致谢要求 - http://www.apache.org/licenses/LICENSE-2.0 ### 强制署名要求 本项目使用一份 **NOTICE 文件**,在标准 Apache 2.0 条款之外附加了强制性的署名要求。总结如下: - **显眼致谢** — 任何衍生作品、分支或再发行版都必须在显眼位置显示以下署名(例如,在“关于”对话框、README、启动横幅或文档首页中): - **文档致谢** — 衍生作品的所有文档和营销材料必须包含: - **源代码署名** — 修改后的源文件必须保留原始版权声明,并在文件顶部附近的注释中指明原始来源: # 原始来源:Forensic File Converter by Cysec Don # https://github.com/cysec-don/forensic-file-converter - **分支命名** — 未经书面许可,公开分支不得使用 "Forensic File Converter" 作为其主要项目名称。请使用具有区分度的名称,例如 *"Forensic File Converter (Fork by [Name])"*,或者在使用致谢的同时使用完全不同的名称。 - **商业用途** — 只要满足所有署名要求,即允许商业用途。严禁移除署名声明以宣称对原始作品享有独占作者权。 - **许可证保留** — 本软件的所有副本或实质性部分都必须包含 LICENSE 和 NOTICE 文件。 有关完整且权威的署名要求,请参阅 [NOTICE](NOTICE) 文件。 ### 第三方工具 当系统中可用时,本软件可能会选择性地调用外部工具(qemu-img, 7z, unrar, cabextract, dmg2img, genisoimage, xorriso, libewf, AFFLIB)。这些工具 **不随** 本软件一起提供,并且分别受其各自许可证的约束。有关第三方致谢的完整列表,请参阅 [NOTICE](NOTICE) 文件。 ## 联系方式 **Cysec Don** — [cysecdon@gmail.com](mailto:cysecdon@gmail.com) GitHub: [github.com/cysec-don](https://github.com/cysec-don)标签:EnCase, Linux内存取证, Python, 内存镜像, 压缩格式, 取证镜像, 大文件处理, 库, 应急响应, 归档文件, 数字取证, 数据恢复, 文件格式转换, 无后门, 流处理, 磁盘镜像, 自动化脚本