Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
zeroturnaround__zt-zip_CVE-2018-1002201_1-12 — Java 库,提供便捷方法用于 ZIP 归档操作,包括打包、解包、条目迭代、转换和比较。 | Kitploit
工具/GitHubGitHub/shoucheng3/zeroturnaround__zt-zip_cve-2018-1002201_1-12
通用工具实用工具与框架
GitHubshoucheng3/zeroturnaround__zt-zip_cve-2018-1002201_1-12

zeroturnaround__zt-zip_CVE-2018-1002201_1-12

Java 库,提供便捷方法用于 ZIP 归档操作,包括打包、解包、条目迭代、转换和比较。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
251年前尚未审核

ZIP - 便捷方法

持续集成

Build Status

快速概览

该项目由 Rein Raudjärv 发起并编写,当时他需要为 LiveRebel 内部组件处理大量大型 ZIP 压缩包。不久之后,由于该工具易于使用且开箱即用,我们开始在其他项目中使用它。

该项目使用 java.util.zip.* 包构建,用于基于流的访问。同时还支持大多数用于文件系统操作的便捷方法。

安装

Maven Central

项目构件可在 Maven 中央仓库 中获取。要在您的 Maven 项目中包含它,您需要指定依赖项。

...
<dependency>
    <groupId>org.zeroturnaround</groupId>
    <artifactId>zt-zip</artifactId>
    <version>1.11</version>
    <type>jar</type>
</dependency>
...

请注意,1.8 是最后一个兼容 Java 1.4 的版本。此后需要 Java 1.5。

背景

我们有以下功能需求:

  1. 递归打包和解包目录
  2. 包含/排除条目
  3. 重命名条目
  4. 原地打包/解包 - ZIP 变成目录,反之亦然
  5. 遍历 ZIP 条目
  6. 从文件或字节数组添加或替换条目
  7. 转换 ZIP 条目
  8. 比较两个压缩包 - 比较所有条目,忽略时间戳

以及以下非功能需求:

  1. 尽可能使用现有 API
  2. 使用简单
  3. 使用高效 - 如果只需要单个条目,不要遍历整个 ZIP 文件
  4. 使用安全 - 不要让用户保持流打开并锁定文件
  5. 不声明异常
  6. 兼容 Java 1.5

示例

解压

检查 ZIP 压缩包中是否存在某个条目

boolean exists = ZipUtil.containsEntry(new File("/tmp/demo.zip"), "foo.txt");

将 ZIP 压缩包中的条目提取到字节数组

byte[] bytes = ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt");

使用指定字符集将 ZIP 压缩包中的条目提取到字节数组

byte[] bytes = ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt", Charset.forName("IBM437"));

将 ZIP 压缩包中的条目提取到文件系统

ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt", new File("/tmp/bar.txt"));

解压 ZIP 压缩包

ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"));

解压 ZIP 压缩包并使其变成目录

ZipUtil.explode(new File("/tmp/demo.zip"));

从 ZIP 压缩包中提取目录(包含目录名)

ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {
  public String map(String name) {
    return name.startsWith("doc/") ? name : null;
  }
});

从 ZIP 压缩包中提取目录(不包含目录名)

final String prefix = "doc/"; 
ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {
  public String map(String name) {
    return name.startsWith(prefix) ? name.substring(prefix.length()) : name;
  }
});

从 ZIP 压缩包中提取匹配名称模式的文件

ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {
  public String map(String name) {
    if (name.contains("/doc")) {
      return name;
    }
    else {
      // returning null from the map method will disregard the entry
      return null;
    }
  }
});

打印 ZIP 压缩包中的 .class 条目名称

ZipUtil.iterate(new File("/tmp/demo.zip"), new ZipInfoCallback() {
  public void process(ZipEntry zipEntry) throws IOException {
    if (zipEntry.getName().endsWith(".class"))
      System.out.println("Found " + zipEntry.getName());
  }
});

打印 ZIP 压缩包中的 .txt 条目(使用 Commons IO 中的 IoUtils)

ZipUtil.iterate(new File("/tmp/demo.zip"), new ZipEntryCallback() {
  public void process(InputStream in, ZipEntry zipEntry) throws IOException {
    if (zipEntry.getName().endsWith(".txt")) {
      System.out.println("Found " + zipEntry.getName());
      IOUtils.copy(in, System.out);
    }
  }
});

打包

将目录压缩为 ZIP 压缩包

ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"));

压缩目录并使其变成 ZIP 压缩包

ZipUtil.unexplode(new File("/tmp/demo.zip"));

将目录压缩为带有父目录的 ZIP 压缩包

ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"), new NameMapper() {
  public String map(String name) {
    return "foo/" + name;
  }
});

将文件作为条目添加到 ZIP 压缩包

ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt", new File("f/tmp/oo.txt"), new File("/tmp/new.zip"));

将字节数组作为条目添加到 ZIP 压缩包

ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt", "bar".getBytes(), new File("/tmp/new.zip"));

将文件和字节数组作为条目添加到 ZIP 压缩包

ZipEntrySource[] entries = new ZipEntrySource[] {
    new FileSource("doc/readme.txt", new File("foo.txt")),
    new ByteSource("sample.txt", "bar".getBytes())
};
ZipUtil.addEntries(new File("/tmp/demo.zip"), entries, new File("/tmp/new.zip"));

将文件和字节数组作为条目添加到输出流

ZipEntrySource[] entries = new ZipEntrySource[] {
    new FileSource("doc/readme.txt", new File("foo.txt")),
    new ByteSource("sample.txt", "bar".getBytes())
};
OutputStream out = null;
try {
  out = new BufferedOutputStream(new FileOutputStream(new File("/tmp/new.zip")));
  ZipUtil.addEntries(new File("/tmp/demo.zip"), entries, out);
}
finally {
  IOUtils.closeQuietly(out);
}

从文件替换 ZIP 压缩包条目

boolean replaced = ZipUtil.replaceEntry(new File("/tmp/demo.zip"), "doc/readme.txt", new File("/tmp/foo.txt"), new File("/tmp/new.zip"));

从字节数组替换 ZIP 压缩包条目

boolean replaced = ZipUtil.replaceEntry(new File("/tmp/demo.zip"), "doc/readme.txt", "bar".getBytes(), new File("/tmp/new.zip"));

从文件和字节数组替换 ZIP 压缩包条目

ZipEntrySource[] entries = new ZipEntrySource[] {
    new FileSource("doc/readme.txt", new File("foo.txt")),
    new ByteSource("sample.txt", "bar".getBytes())
};
boolean replaced = ZipUtil.replaceEntries(new File("/tmp/demo.zip"), entries, new File("/tmp/new.zip"));

在 ZIP 压缩包中添加或替换条目

ZipEntrySource[] addedEntries = new ZipEntrySource[] {
        new FileSource("/path/in/zip/File1.txt", new File("/tmp/file1.txt")),
        new FileSource("/path/in/zip/File2.txt", new File("/tmp/file2.txt")),
        new FileSource("/path/in/zip/File3.txt", new File("/tmp/file2.txt")),
    };
ZipUtil.addOrReplaceEntries(new File("/tmp/demo.zip"), addedEntries);

转换

将 ZIP 压缩包条目转换为大写

boolean transformed = ZipUtil.transformEntry(new File("/tmp/demo"), "sample.txt", new StringZipEntryTransformer() {
    protected String transform(ZipEntry zipEntry, String input) throws IOException {
        return input.toUpperCase();
    }
}, new File("/tmp/demo.zip"));

比较

比较两个 ZIP 压缩包(忽略条目的时间戳)

boolean equals = ZipUtil.archiveEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"));

比较两个 ZIP 压缩包中同名的条目(忽略条目的时间戳)

boolean equals = ZipUtil.entryEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"), "foo.txt");

比较两个 ZIP 压缩包中不同名称的条目(忽略条目的时间戳)

boolean equals = ZipUtil.entryEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"), "foo1.txt", "foo2.txt");

调试

该库使用 slf4j-api 日志框架。所有日志语句均为 DEBUG 或 TRACE 级别。根据您使用的日志框架,只需 -Dorg.slf4j.simpleLogger.defaultLogLevel=debug 或 System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", "debug"); 即可显示来自 zt-zip 库的日志语句。您还可以使用自己的日志框架进一步微调每个包的日志级别和日志消息的包含情况。

下载工具