Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
Инструменты/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-архивами, включая упаковку, распаковку, итерацию по записям, преобразование и сравнение.

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
1 год назадЕщё не проверено

ZIP - удобные методы

Непрерывная интеграция

Build Status

Краткий обзор

Проект был начат и написан Рейном Раудъярвом, когда ему понадобилось обработать большое количество больших ZIP-архивов для внутренних нужд LiveRebel. Вскоре после этого мы начали использовать эту утилиту в других проектах из-за её простоты и того, что она просто работала.

Проект построен на пакетах java.util.zip.* для потокового доступа. Также поддерживается большинство удобных методов для работы с файловой системой.

Установка

Maven Central

Артефакты проекта доступны в Maven Central Repository. Чтобы включить его в ваш Maven-проект, необходимо указать зависимость.

root@kitploit:~
...
<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-архиве

root@kitploit:~
boolean exists = ZipUtil.containsEntry(new File("/tmp/demo.zip"), "foo.txt");

Извлечение записи из ZIP-архива в массив байт

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

Извлечение записи из ZIP-архива с определённой кодировкой в массив байт

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

Извлечение записи из ZIP-архива в файловую систему

root@kitploit:~
ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt", new File("/tmp/bar.txt"));

Распаковка ZIP-архива

root@kitploit:~
ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"));

Распаковка ZIP-архива, который становится директорией

root@kitploit:~
ZipUtil.explode(new File("/tmp/demo.zip"));

Извлечение директории из ZIP-архива с включением имени директории

root@kitploit:~
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-архива с исключением имени директории

root@kitploit:~
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-архива, соответствующих шаблону имени

root@kitploit:~
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 {
      // возврат null из метода map приведёт к игнорированию записи
      return null;
    }
  }
});

Вывод имён записей .class в ZIP-архиве

root@kitploit:~
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());
  }
});

Вывод записей .txt в ZIP-архиве (использует IOUtils из Commons IO)

root@kitploit:~
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-архив

root@kitploit:~
ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"));

Сжатие директории, которая становится ZIP-архивом

root@kitploit:~
ZipUtil.unexplode(new File("/tmp/demo.zip"));

Сжатие директории в ZIP-архив с родительской директорией

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

Добавление записи из файла в ZIP-архив

root@kitploit:~
ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt", new File("f/tmp/oo.txt"), new File("/tmp/new.zip"));

Добавление записи из массива байт в ZIP-архив

root@kitploit:~
ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt", "bar".getBytes(), new File("/tmp/new.zip"));

Добавление записей из файла и массива байт в ZIP-архив

root@kitploit:~
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"));

Добавление записей из файла и массива байт в выходной поток

root@kitploit:~
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-архиве из файла

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

Замена записи в ZIP-архиве из массива байт

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

Замена записей в ZIP-архиве из файла и массива байт

root@kitploit:~
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-архиве

root@kitploit:~
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-архива в верхний регистр

root@kitploit:~
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-архивов (игнорируя временные метки записей)

root@kitploit:~
boolean equals = ZipUtil.archiveEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"));

Сравнение двух записей ZIP-архива с одинаковым именем (игнорируя временные метки записей)

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

Сравнение двух записей ZIP-архива с разными именами (игнорируя временные метки записей)

root@kitploit:~
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. Вы можете дополнительно настроить уровни и включение сообщений лога для каждого пакета с помощью вашего фреймворка логирования.

Скачать инструмент