Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
zeroturnaround__zt-zip_CVE-2018-1002201_1-12 — ZIP 아카이브 조작을 위한 편의 메서드를 제공하는 Java 라이브러리로, 압축, 압축 해제, 항목 반복, 변환 및 비교 기능을 포함합니다. | Kitploit
도구/GitHubGitHub/shoucheng3/zeroturnaround__zt-zip_cve-2018-1002201_1-12
General Purpose UtilitiesUtilities & Frameworks
GitHubshoucheng3/zeroturnaround__zt-zip_cve-2018-1002201_1-12

zeroturnaround__zt-zip_CVE-2018-1002201_1-12

ZIP 아카이브 조작을 위한 편의 메서드를 제공하는 Java 라이브러리로, 압축, 압축 해제, 항목 반복, 변환 및 비교 기능을 포함합니다.

저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
31년 전아직 검토되지 않음
공유

ZIP - 편의 메서드

지속적 통합

Build Status

빠른 개요

이 프로젝트는 Rein Raudjärv가 LiveRebel 내부에서 대량의 대형 ZIP 아카이브를 처리해야 할 필요가 있을 때 시작되어 코딩되었습니다. 얼마 지나지 않아 사용의 용이성과 그냥 작동한다는 점 때문에 다른 프로젝트에서도 이 유틸리티를 사용하기 시작했습니다.

이 프로젝트는 스트림 기반 접근을 위해 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. 디렉토리를 재귀적으로 압축 및 압축 해제
    1. 항목 포함/제외
    2. 항목 이름 변경
    3. 제자리 압축/압축 해제 - ZIP이 디렉토리가 되고 그 반대도 가능
  2. ZIP 항목 순회
  3. 파일 또는 바이트 배열에서 항목 추가 또는 교체
  4. ZIP 항목 변환
  5. 두 아카이브 비교 - 타임스탬프를 무시하고 모든 항목 비교

그리고 다음과 같은 비기능적 요구 사항이 있었습니다.

  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");

특정 Charset으로 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 {
      // returning null from the map method will disregard the entry
      return null;
    }
  }
});

ZIP 아카이브에서 .class 항목 이름 출력

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());
  }
});

ZIP 아카이브에서 .txt 항목 출력 (Commons IO의 IoUtils 사용)

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 라이브러리의 로그 문을 표시할 수 있습니다. 로깅 프레임워크를 사용하여 패키지별 로그 메시지의 수준과 포함을 더 세밀하게 조정할 수 있습니다.

도구 다운로드