KOROMOON

착한 사마리아인이 되고 싶습니다.

2/10/2020

ZIP File Format


( 1 ) ZIP 파일 포맷

ZIP 파일 형식은 데이터를 압축하고 보관하기 위한 파일 형식임.
ZIP 파일은 하나 혹은 여러개의 파일들을 그 크기를 줄여 압축하고 하나로 묶어 저장함.
ZIP 파일 형식에서는 다양한 종류의 압축 알고리즘의 사용이 가능하나 현재 Deflate 알고리즘만이 가장 많이 사용되고 지원되는 압축 알고리즘임.
1989 년 Phil Katz 가 PKZIP 에서 사용하기 위해 만들어진 것으로 Thom Henderson의 ARC 파일 압축 형식을 발전시킨 것임.

ZIP 파일은 일반적으로 그 파일의 확장자로 ".zip" 혹은 ".ZIP"으로 사용하며 MIME 형식으로는 application/zip 으로 표시하여 사용함.
또한 다양한 소프트웨어에서 파일 저장형식으로 사용되고 있으나 그럴 경우 일반적으로 그 파일의 확장자가 다른 형태로 저장됨.
(ex. 확장자 jar, xpi, pk3, pk4, odt, docx, apk 등등)

헥사에디터 중의 유료 010 Editor 에서 ZIP 파일 포맷 템플릿을 지원하므로 ZIP 파일을 분석할 때 유용함.



( 2 ) 일반적인 구조

< Zip 파일의 일반적인 구조 >

Zip 파일의 일반적인 구조는 크게 3 개의 파일 구조(Local File Header, Central Directory, End of central directory record)로 되어 있음.

Local File Header
압축 파일에 대한 기본 정보들이 포함됨.
압축 전후 파일 크기, 파일 수정 시간, CRC-32 체크섬, 파일 이름의 지역 포인터, 압축 해제시 필요한 아카이브 버전 등이 포함됨.

File Name
압축된 파일 이름 형식에 대한 임의의 길이와 바이트 순서를 나타냄.
파일 이름의 길이는 65536 문자를 초과할 수 없음.

File Data
임의의 길이로 구성된 바이트 배열 형태로 압축된 파일 컨텐츠임.
파일이 비어 있거나 디렉토리를 포함하는 경우 이 배열은 사용되지 않지만 그 다음 Local File Header 제목은 해당 파일이나 디렉토리를 설명함.

Central Directory
Local File Header 의 확장된 데이터 뷰를 제공함.
Local File Header 에 포함된 데이터를 더하여 파일 속성, 구조에 대한 로컬 기준를 가짐.

End of central directory record
모든 아카이브의 싱글 템플릿으로 제공하며 아카이브의 종료를 작성함.
포함된 데이터에서 가장 중요한 데이터는 Central Directory 블록의 시작과 로컬 참조의 시작, 아카이브 레코드들의 숫자임.

< HelloWorld.txt 파일을 압축한 ZIP 파일 >

참고로 아래 바이트 차트들은 HelloWorld.txt 파일(Helloworld! 문자열이 포함된 메모장 파일)을 WinRAR 툴을 이용하여 압축한 ZIP 파일임.



( 3 ) Local File Header 구조

< Local File Header 구조 바이트 차트 >

필드
크기
설명
Signature
4 바이트
시그니처 (0x04034b50, 리틀엔 - 50 4B 03 04)
Version
2 바이트
압축 해제 시 필요한 버전
Flags
2 바이트
바이트 식별자

Bit 00    : 암호화된 파일
Bit 01    : 압축 옵션
Bit 02    : 압축 옵션
Bit 03    : 데이터 기술자(data descriptor)
Bit 04    : 강화된 디플레이션(deflation)
Bit 05    : 압축된 패치 데이터
Bit 06    : 강력한 암호화
Bit 07-10 : 사용하지 않음
Bit 11    : 언어 인코딩
Bit 12    : 예약
Bit 13    : 헤더값을 마스크
Bit 14-15 : 예약
Compression method
2 바이트
압축 유형 선택 (보통 0x08 Deflated 사용함)

00    : 더 이상 압축하지 않음
01    : 수축(shrunk)
02    : 1 압축 요소로 감소
03    : 2 압축 요소로 감소
04    : 3 압축 요소로 감소
05    : 4 압축 요소로 감소
06    : 파열(imploded)
07    : 예약
08    : 수축(deflated)
09    : 강화된 수축(enhanced deflated)
10    : PKWare DCL 파열(imploded)
11    : 예약
12    : BZIP2 압축
13    : 예약
14    : LZMA
15-17 : 예약
18    : IBM TERSE 압축
19    : IBM LZ77 z
98    : PPMd version I, Rev 1
File modification time
2 바이트
마지막으로 파일 수정 시간
Bits 00-04 : seconds divided by 2
Bits 05-10 :
Bits 11-15 : 시간
File modification date
2 바이트
마지막으로 파일 수정 날짜
Bits 00-04 :
Bits 05-08 :
Bits 09-15 : years from 1980
Crc-32 checksum
4 바이트
파일 내용의 오류 체크
이 필드가 작성되지 않을 경우 압축 프로그램은 손상된 파일로 간주하여 압축해제를 거부함.
Compressed size
4 바이트
압축된 데이터의 바이트 크기
Uncompressed size
4 바이트
원본 데이터의 바이트 크기
File name length
2 바이트
파일 이름의 길이
Extra field length
2 바이트
추가 예약 필드로 현재 사용하지 않음.
File name
가변 크기
상대 경로를 포함하는 파일의 이름
Extra field
가변 크기
추가 정보를 저장하는 데 사용됨.
이 필드는 헤더와 데이터 쌍의 순서로 구성됨.
여기서 헤더는 2 바이트 식별자와 2 바이트 데이터 사이즈 필드를 갖음.



( 4 ) Central Directory 구조

< Central Directory 구조 바이트 차트 >

필드
크기
설명
Signature
4 바이트
시그니처 (0x02014b50, 리틀엔 - 50 4B 01 02)
Version
2 바이트
압축 생성 버전

상위 바이트 :
00 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)
01 - Amiga
02 - OpenVMS
03 - UNIX
04 - VM/CMS
05 - Atari ST
06 - OS/2 H.P.F.S.
07 - Macintosh
08 - Z-System
09 - CP/M
10 - Windows NTFS
11 - MVS (OS/390 - Z/OS)
12 - VSE
13 - Acorn Risc
14 - VFAT
15 - alternate MVS
16 - BeOS
17 - Tandem
18 - OS/400
19 - OS/X (Darwin)
20 - 255: unused

하위 바이트 :
zip 사양 버전
Vers. needed
2 바이트
압축 해제 시 필요한 버전
Flags
2 바이트
바이트 식별자

Bit 00    : 암호화된 파일
Bit 01    : 압축 옵션
Bit 02    : 압축 옵션
Bit 03    : 데이터 기술자(data descriptor)
Bit 04    : 강화된 디플레이션(deflation)
Bit 05    : 압축된 패치 데이터
Bit 06    : 강력한 암호화
Bit 07-10 : 사용하지 않음
Bit 11    : 언어 인코딩
Bit 12    : 예약
Bit 13    : 헤더값을 마스크
Bit 14-15 : 예약
Compression method
2 바이트
압축 유형 선택 (보통 0x08 Deflated 사용함)

00    : 더 이상 압축하지 않음
01    : 수축(shrunk)
02    : 1 압축 요소로 감소
03    : 2 압축 요소로 감소
04    : 3 압축 요소로 감소
05    : 4 압축 요소로 감소
06    : 파열(imploded)
07    : 예약
08    : 수축(deflated)
09    : 강화된 수축(enhanced deflated)
10    : PKWare DCL 파열(imploded)
11    : 예약
12    : BZIP2 압축
13    : 예약
14    : LZMA
15-17 : 예약
18    : IBM TERSE 압축
19    : IBM LZ77 z
98    : PPMd version I, Rev 1
File modification time
2 바이트
마지막으로 파일 수정 시간
Bits 00-04 : seconds divided by 2
Bits 05-10 :
Bits 11-15 : 시간
File modification data
2 바이트
마지막으로 파일 수정 날짜
Bits 00-04 :
Bits 05-08 :
Bits 09-15 : years from 1980
Crc-32 checksum
4 바이트
파일 내용의 오류 체크
이 필드가 작성되지 않을 경우 압축 프로그램은 손상된 파일로 간주하여 압축해제를 거부함.
Compressed size
4 바이트
압축된 데이터의 바이트 크기
Uncompressed size
4 바이트
원본 데이터의 바이트 크기
File name length
2 바이트
파일 이름의 길이
Extra field length
2 바이트
추가 예약 필드로 현재 사용하지 않음.
File comm. len
2 바이트
파일 코멘트 길이
Disk # start
2 바이트
디스크의 수 (거의 항상 0 )
Internal attr.
2 바이트
내부 파일 속성
External attr.
4 바이트
확장 파일 속성 (호스트 시스템에 의존적임)
Offset of local header
4 바이트
Local File Header 구조의 시작 주소
File name
가변 길이
상대 경로를 포함하는 파일의 이름
Extra field
가변 길이
추가 정보를 저장하는 데 사용됨.
이 필드는 헤더와 데이터 쌍의 순서로 구성됨.
여기서 헤더는 2 바이트 식별자와 2 바이트 데이터 사이즈 필드를 갖음.
File comment
가변 길이
파일 코멘트



( 5 ) End of Central Directory Record 구조

< ECDR 구조 바이트 차트 >

필드
크기
설명
Signature
4 바이트
시그니처 (0x06054b50, 리틀엔 - 50 4B 05 06)
Disk Number
2 바이트
디스크 갯수 (Central Directory 레코드의 종료를 포함)
Disk # w/cd
2 바이트
Central Directory 가 시작되는 디스크 번호
Disk entries
2 바이트
Central Directory 에 있는 항목의 총 수
(파일과 디렉토리 수)
Total entries
2 바이트
모든 항목의 총 수
(파일과 디렉토리 수)
Central directory size
4 바이트
Central Directory 의 바이트 크기
Offset of cd wrt to starting disk
4 바이트
Central Directory 가 시작되는 오프셋 주소
Comment len
2 바이트
코멘트 필드의 길이
ZIP file comment
가변 길이
ZIP 파일 코멘트



참고 사이트 :



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 3개:

  1. 네이버에서 어제 처음 알구, 구글에서 하신다구해서 일루 쫄쫄왔는댕, 헿.. 전 컴퓨터두 잘모르지만. 어짜다 코딩을 접하게...된건대여.. 벌써 두달째 이것저것 보면서 혼자서 탐정수사..하다보니..이게 또 잼있어져성..
    긍대 넘 어려워여 ㅠ,,,ㅠ..어릴때두 수학..은..0점이였는댐.. ㅠㅠ.. 하... 근댕 넘 멋있으세여 !!!!!!!
    +_+) 글구 저두 일루미나티 음모론 예전부터 마니 봤거둔욤 저랑 관심사가 비슷하세염 0_0)웅웅
    제가 1호 팬 해드릴께여!!!

    답글삭제
  2. 아..궁대..저.. 혹시.. 그.. ㅜ_ㅜ).. 제가 얼마전에 크게 사기를 당했는대여
    그래서 코딩 이걸..죽어라 ..하게댄건댐.. 혹시.. 그 바뀐전화번호도 .. 찾을수있을까요 ?
    이걸루요 ? ..꼭 찾아야하는댕..

    답글삭제
  3. 글구 좋아보이는거 막 다 깔았는대 .. 바이러스 걸려서 또 복구했거든요,, 코딩 이거 파다가 지금 컴퓨터 8번 넘게 윈도우 다시 깔았어요 . 방어막 잘치는 방법좀 가르켜주세요 ㅜㅜ

    답글삭제