Archive File Format 중 하나로 무손실 데이터 압축 방식을 지원.
Zip 파일 형식에서는 다양한 종류의 압축 알고리즘이 사용 가능, 하지만 현재 Deflate 알고리즘만이 가장 많이 사용되는 압축 알고리즘.
일반적인 확장자 명: .zip .ZIP
MINE 형식: application/zip
- 값은 리틀엔디안으로 읽는다.
다양한 소프트웨어에서 파일 저장형식으로 사용 중 하지만 그럴 경우 확장자가 다른 형태로 저장
ex) zip, docx, jar등의 파일 시그니처가 같음
크게 3개의 파일 구조 (Local File Header, Central Directory, End of Central directory record)로 이루어짐
Local File Header
압축 파일들에 대한 기본 정보 포함
압축 전후 파일 크기, 파일 수정 시간, CRC-32 체크섬, 파일이름 지역 포인터, 압축 해제시 필요한 아카이브 버전 등 포함
File Name
압축된 파일 이름 형식에 대한 임의의 길이와 바이트 순서 표시
파일 이름의 길이는 65536 문자 초과 불가
File Data
임의의 길이로 구성된 바이트 배열 형태로 압축된 파일 컨텐츠
파일이 비거나 디렉토리 포함시 이 배열 사용 X
하지만 그 다음 Local File Header 제목은 해당 파일이나 디렉토리 설명
Central Directory
Local File Header의 확장 데이터 뷰 제공
Local File Header의 포함된 데이터를 더하여 파일 속성, 구조에 대한 로컬 기준 가짐
End of central directory record
모든 아카이브의 싱글 템플릿으로 제공하며 아카이브의 종료 작성
포함된 데이터에서 가장 중요한 데이터는 Central Directory 블록의 시작과 로컬 참조의 시작, 아카이브 레코드들의 숫자임
ZIP파일을 실행 하면 먼저 End of Central Directory 로 들어감
그리고 End of Central Directory 에 존재 하는 값인 Central Header Offset 에 존재 하는 Offset으로 이동
Central Header Offset에 들어있는 값을 따라 이동을 해보면 Central Directory 시작 Offset으로 감
Central Directory의 맨위 부터 아래로 내려오면서 내부에 존재하는 Central Header의 개수를 구별하면서 Central Directory에 존재하는 Local Header Offset에 들어있는 값을 확인
확인한 Local Header Offset의 값을 바탕으로 Local Header 시작 Offset으로 감
Local Header Offset 으로 간 뒤 해당 File Data로 이동함으로서 zip파일 사용자가 zip파일 내부 압축 데이터를 확인
필드 | 크기 | 설명 |
---|---|---|
Signature | 4 바이트 | 시그니처 (0x04034b50, 리틀엔 - 50 4B 03 04) |
Version | 2 바이트 | 압축 해제 시 필요한 버전 |
Flags | 2 바이트 | 바이트 식별자 |
비트 00: 암호화된 파일 | ||
비트 01: 압축 옵션 | ||
비트 02: 압축 옵션 | ||
비트 03: 데이터 설명자 | ||
비트 04: 향상된 디플레이션 | ||
비트 05: 패치된 압축 데이터 | ||
비트 06: 강력한 암호화 | ||
비트 07-10: 사용되지 않음 | ||
비트 11: 언어 인코딩 | ||
비트 12: 예약됨 | ||
비트 13: 마스크 헤더 값 | ||
비트 14-15: 예약됨 | ||
Compression method | 2 바이트 | 압축 유형 선택 (보통 0x08 Deflated 사용) |
00: 압축 없음 | ||
01: 수축 | ||
02: 압축 계수 1로 감소 | ||
03: 압축 계수 2로 감소 | ||
04: 압축 계수 3으로 감소 | ||
05: 압축 계수 4로 감소 | ||
06: 내파됨 | ||
07: 예약 됨 | ||
08: 수축됨 | ||
09: 향상 수축됨 | ||
10: PKWare DCL 내파됨 | ||
11: 예약 됨 | ||
12: BZIP2를 사용하여 압축됨 | ||
13: 예약됨 | ||
14: LZMA | ||
15-17: 예약됨 | ||
18: IBM TERSE를 사용하여 압축됨 | ||
19: IBM LZ77 z | ||
98: PPMd 버전 I, Rev 1 | ||
File modification time | 2 바이트 | 마지막 파일 수정 시간 |
비트 00-04: 초를 2로 나눈 값 | ||
비트 05-10: 분 | ||
비트 11-15: 시간 | ||
File modification date | 2 바이트 | 마지막 파일 수정 날짜 |
비트 00-04: 일 | ||
비트 05-08: 월 | ||
비트 09-15: 1980년부터 연도 | ||
Crc-32 checksum | 4 바이트 | 파일 내용의 오류 체크 |
이 필드가 작성되지 않을 경우 압축 프로그램은 손상된 파일로 간주 압축해제 거부 | ||
Compressed size | 4 바이트 | 압축된 데이터의 바이트 크기 |
Uncompressed size | 4 바이트 | 원본 데이터의 바이트 크기 |
File name length | 2 바이트 | 파일 이름의 길이 |
Extra field length | 2 바이트 | 추가 예약 필드로 사용 X |
File name | 가변 크기 | 상대 경로를 포함하는 파일의 이름 |
Extra field | 가변 크기 | 추가 정보 저장하는데 사용 |
이 필드는 헤더와 데이터 쌍의 순서로 구성 | ||
여기서 헤더는 2 바이트 식별자와 2 바이트 데이터로 사이즈 필드를 가짐 |
필드 | 크기 | 설명 |
---|---|---|
Signature | 4 바이트 | 시그니처 (0x02014b50, 리틀엔 - 50 4B 01 02) |
Version | 2 바이트 | 압축 생성 버전 |
상위 바이트: | ||
0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems) | ||
1 - Amiga | ||
2 - OpenVMS | ||
3 - UNIX | ||
4 - VM/CMS | ||
5 - Atari ST | ||
6 - OS/2 H.P.F.S. | ||
7 - Macintosh | ||
8 - Z-System | ||
9 - 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 바이트 | 바이트 식별자 |
비트 00: 암호화된 파일 | ||
비트 01: 압축 옵션 | ||
비트 02: 압축 옵션 | ||
비트 03: 데이터 설명자 | ||
비트 04: 향상된 디플레이션 | ||
비트 05: 패치된 압축 데이터 | ||
비트 06: 강력한 암호화 | ||
비트 07-10: 사용되지 않음 | ||
비트 11: 언어 인코딩 | ||
비트 12: 예약됨 | ||
비트 13: 마스크 헤더 값 | ||
비트 14-15: 예약됨 | ||
Compression method | 2 바이트 | 압축 유형 선택 (보통 0x08 Deflated 사용) |
00: 압축 없음 | ||
01: 수축 | ||
02: 압축 계수 1로 감소 | ||
03: 압축 계수 2로 감소 | ||
04: 압축 계수 3으로 감소 | ||
05: 압축 계수 4로 감소 | ||
06: 내파됨 | ||
07: 예약됨 08 | ||
08: 수축됨 | ||
09: 향상 수축됨 | ||
10: PKWare DCL 내파됨 | ||
11: 예약 됨 | ||
12: BZIP2를 사용하여 압축됨 | ||
13: 예약됨 | ||
14: LZMA | ||
15-17: 예약됨 | ||
18: IBM TERSE를 사용하여 압축됨 | ||
19: IBM LZ77 z | ||
98: PPMd 버전 I, Rev 1 | ||
File modification time | 2 바이트 | 마지막 파일 수정 시간 |
비트 00-04: 초를 2로 나눈 값 | ||
비트 05-10: 분 | ||
비트 11-15: 시간 | ||
File modification date | 2 바이트 | 마지막 파일 수정 날짜 |
비트 00-04: 일 | ||
비트 05-08: 월 | ||
비트 09-15: 1980년부터 연도 | ||
Crc-32 checksum | 4 바이트 | 파일 내용의 오류 체크 |
이 필드가 작성되지 않을 경우 압축 프로그램은 손상된 파일로 간주 압축해제 거부 | ||
Compressed size | 4 바이트 | 압축된 데이터의 바이트 크기 |
Uncompressed size | 4 바이트 | 원본 데이터의 바이트 크기 |
File name length | 2 바이트 | 파일 이름의 길이 |
Extra field length | 2 바이트 | 추가 예약 필드로 사용 X |
File comn. 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 commet | 가변 길이 | 파일 코멘트 |
필드 | 크기 | 설명 |
---|---|---|
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 파일 코멘트 |
https://blog.naver.com/koromoon/220612641115
https://users.cs.jmu.edu/buchhofp/forensics/formats/pkzip.html
정리가 잘 된 글이네요. 도움이 됐습니다.