fixzt

Crates.iofixzt
lib.rsfixzt
version0.3.0
created_at2025-11-30 03:14:38.809655+00
updated_at2025-11-30 03:14:38.809655+00
descriptionA tool to fix ZIP file offset issues caused by prepended data (e.g., image seeds)
homepage
repositoryhttps://github.com/lglfr-nlsidf/fixt
max_upload_size
id1957786
size26,135
(nlsidf)

documentation

README

ZIP文件偏移修复工具 (fixt)

一个用于修复ZIP文件偏移量问题的命令行工具,专门解决"图种"或其他在ZIP文件头部添加数据导致的ZIP结构损坏问题。

功能特点

  • ✅ 支持普通ZIP格式(32位偏移)
  • ✅ 支持ZIP64格式(64位偏移)
  • ✅ 修复因头部附加数据导致的偏移量错误
  • ✅ 自动识别ZIP格式类型
  • ✅ 保持原始文件完整性
  • ✅ 命令行界面,使用简单

解决的问题

当ZIP文件头部被添加额外数据时(如图种文件),会导致以下问题:

unzip -l corrupted.zip
# 输出:
# warning [corrupted.zip]:  100 extra bytes at beginning or within zipfile
#   (attempting to process anyway)

这些问题出现的原因是:

  1. ZIP文件内部记录的偏移量仍然基于原始ZIP结构
  2. 添加头部数据后,实际ZIP结构位置发生偏移
  3. 解压工具无法正确定位文件数据

工作原理

ZIP文件结构基础

ZIP文件由以下几部分组成:

  1. 本地文件头 - 存储每个文件的元数据和偏移信息
  2. 文件数据 - 实际的压缩文件内容
  3. 中央目录 - 所有文件的索引信息
  4. 中央目录结束记录(EOCD) - ZIP文件的尾部结构

修复逻辑

1. 定位ZIP尾部结构

  • 在文件末尾64KB范围内搜索ZIP签名
  • 优先查找ZIP64定位器签名(0x07064b50
  • 其次查找普通EOCD签名(0x06054b50

2. 计算偏移量

prefix_len = 实际中央目录位置 - 记录的中央目录偏移量

如果prefix_len > 0,说明存在前置数据需要修复。

3. 修复中央目录条目

  • 遍历中央目录中的每个文件条目
  • 修正32位本地头偏移量(位于条目+42字节处)
  • 对于ZIP64格式,同时修正扩展字段中的64位偏移量

4. 修复结构偏移

  • 普通ZIP:修正EOCD中的中央目录偏移(+16字节处)
  • ZIP64
    • 修正ZIP64 EOCD中的中央目录偏移(+48字节处)
    • 修正ZIP64定位器中的EOCD偏移(+8字节处)

使用方法

编译程序

cargo build --release

运行修复

# 编译后直接运行
./target/release/fixt <待修复ZIP文件>

# 或使用cargo运行
cargo run <待修复ZIP文件>

使用示例

# 创建图种文件(示例)
echo "图片头部数据" > header.txt
zip normal.zip file1.txt file2.txt
cat header.txt normal.zip > image_seed.zip

# 修复文件
cargo run image_seed.zip

# 验证修复结果
unzip -l image_seed.zip  # 应该无警告

技术细节

支持的ZIP格式

格式 特点 处理方式
普通ZIP 32位偏移,最大4GB 修正中央目录中的32位偏移字段
ZIP64 64位偏移,支持超大文件 额外处理扩展字段中的64位偏移

ZIP签名常量

const EOCD_SIG: u32 = 0x06054b50;           // 中央目录结束记录
const ZIP64_LOCATOR_SIG: u32 = 0x07064b50; // ZIP64定位器
const CENTRAL_DIR_SIG: u32 = 0x02014b50;   // 中央目录条目
const ZIP64_EXT_TAG: u16 = 0x0001;         // ZIP64扩展字段标签

错误处理

程序包含完善的错误处理机制:

  • IO错误:文件读写问题
  • EOCD未找到:无法识别的ZIP格式
  • ZIP格式错误:文件结构损坏

安全性

  • ✅ 原地修复,不创建临时文件
  • ✅ 修正前验证ZIP结构完整性
  • ✅ 防止越界访问,避免文件损坏
  • ✅ 处理边界情况,确保数据安全

限制与注意事项

  1. 仅修复偏移量问题:无法修复其他类型的ZIP损坏
  2. 需要写权限:程序需要读写文件的权限
  3. 建议备份:对重要文件建议先备份再修复

开发信息

  • 语言:Rust
  • 依赖:thiserror(错误处理)
  • 版本:0.1.0
  • 兼容平台:支持Rust的所有平台

许可证

本项目采用开源许可证,具体请查看LICENSE文件。

贡献

欢迎提交Issue和Pull Request来改进这个工具。


注意:此工具主要用于修复因图种等技术导致的ZIP偏移问题,对于其他类型的ZIP文件损坏可能无效。

Commit count: 0

cargo fmt