크리에이티브 커먼즈 라이선스
Creative Commons License

아직 작성 중입니다.

3.   Local File

1.    Overview

전편에서 ZIP의 전체 구조를 살펴봤다. ZIP파일은 n개의 Local file entry 1개의 Central directory로 구성되어 있다능. Local file entry Local file header File data, Data descriptor로 구성되어 있다고 했따능. 일단 그림을 다시 한번 살펴보자능.


 

그림 4 Local File Entry

 

Local file header는 파일의 메타 데이터를 담고 있고 실제 데이터는 File data에 저장되어 있다. Data descriptor Local file header의 어떤 필드의 값에 의해서 있을 수도 있고 업ㅂ을 수도 있다. 각 섹션들이 어떤 필드들로 구성되어 있고, 각 필드 길이와 의미만 알면 그리 어렵지 않게 ZIP파일을 읽어낼 수 있다. 어떤 ZIP 파일의 local file entry를 통체로 들고 올태니 그걸 반찬삼아 각 섹션들을 분석해 보자능.

 

2.    Local file header

시험삼아 만든 ZIP 파일의 Local file entry 중 하나를 들고 왔다. 동일한 파일을 아래에 링크해 놓을태니 전체를 보고 싶으면 거걸 받아서 HxD 같은 툴을 사용하면 된다능. 일단 눈으로 읽기 쉽게 필드별로 색을 입혀 놓았다.

 

offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  50 4B 03 04 0A 00 00 00 00 00 EA 72 25 3D CB 1A  PK........er%=E.

00000010  49 DD 0B 00 00 00 0B 00 00 00 09 00 00 00 66 69  IY............fi

00000020  6C 65 31 2E 74 78 74 66 69 6C 65 31 0D 0A 74 65  le1.txtfile1..te

00000030  73 74                                            st

 

Local file header local file header signature로 시작한다. local file header signature의 값은 0x04034B50 인데, ZIP파일 포맷은 멀티 바이트 필드들은 little endian으로 저장하게 되어 있다. 따라서 눈으로 읽으면 순서가 거꾸로 뒤집힌 값을 보게 된다능. offset 0x0에서 나오는 50 4B 03 04 signature가 된다. 이런식으로 필드들을 해석하면 된다능. 역시 Local file header의 전체 구조를 살펴보고 이야기를 진행하자. 이제부터는 좀 지루한 내용이 될꺼라능.

 

Field

size

comment

local file header signature

4 bytes

0x04034b50

version needed to extract

2 bytes

 

general purpose bit flag

2 bytes

 

compression method

2 bytes

 

last mod file time

2 bytes

 

last mod file date

2 bytes

 

crc-32

4 bytes

 

compressed size

4 bytes

 

uncompressed size

4 bytes

 

file name length

2 bytes

 

extra filed length

2 bytes

 

file name

variable size

 

extra filed

variable size

 

1 Local file header

필드가 참...빌어도 못 먹을 만큼 많다. compressed size와 같이 직관적으로 의미도 알 수 있고 해석도 가능할 것 같은 것도 있고 general purpose bit flag 처럼 정체 불명인 것도 있다. 파일의 내용만을 복구할 거라면 compression method하고 file name만 가지고도 충분하지만...위에서 설명한 local file header signature를 제외한 12 필드의 의미를 다 살펴보고 넘어가자능.

 

1.     version needed to extract

2.     general purpose bit flag

3.     compression method

4.     last mod file time

5.     last mod file date

6.     crc-32

7.     compressed size

8.     uncompressed size

9.     file name length

10.   extra filed length

11.   file name

12.   extra filed

 

3.    File data

 

4.    Data descriptor

 



 




저작자 표시 비영리 동일 조건 변경 허락

댓글을 달아 주세요

크리에이티브 커먼즈 라이선스
Creative Commons License

2.   Overall Structure of ZIP

1.    Overall Structure

앞 쳅터에서 우리는 ZIP 파일 포맷을 하향식으로 살펴본다고 했다. 모르는 사람은 업ㅂ겠지만 하향식 (Top-Down)으로 살펴본다는 말은 최상위 구조를 먼저 파악한 후 디테일한 내용은 나중에 설명하겠다는 말이다. 그래서 이번 쳅터에서 설명할 ZIP 파일 포맷의 전체 구조는 뒤에 오는 내용들을 가늠하게 될 중요한 내용이다. 최상위 레벨에서 바라 보았을 때 ZIP 파일의 구조는 심플하기 짝이 업ㅂ으니 일단 가벼운 맘으로 시작하자능.

 

ZIP 파일의 전체 구조는 위의 그림처럼 생겼다. 자질구레한 섹션들은 삭제하고 굵직굵직한 섹션만 포함시켰을 때 위와 같은 모습이 된다. 복수의 Local File Entry와 하나의 Central Directory로 구성되어 있다. 저것만 알아도 ZIP파일의 Hex 덤프를 보고 내용을 어떤 파일들이 압축되어 있는지 내용을 파악할 수 있다.

 

2.    Local File Entry

Local File Entry가 어떻게 생겼는지 구조만 살펴보고 넘어가보자. 자세한 내용들은 다음 쳅터에서 설명하기로 했으니 우리는 그림만 살펴보고 넘어가자.


점선으로 표시한 Data Descriptor Local File Header의 내용에 따라 있을 수도 있고 업ㅂ을 수도 있다. 짐작은 하겠지만 Local File Header에 파일 이름이나 뭐 이런 정보가 저장돼있고 File Data에 실제 파일의 내용이 압축된 상태로 저장돼 있다. Local File Local File Header File Data의 내용만 멀쩡하다면 전체 ZIP 파일이 완전하지 않더라도 원본 파일로 복원할 수 있다. 우리가 받다 말은 ZIP파일의 내용을 훔쳐볼 수 있는 이유가 바로 이 때문이다.

 

3.    Central Directory

Central Directory Local File Entry들의 메타 데이터를 담고 있다. 역시 자세한 내용은 뒤에서 다룰 테니 그림을 먼저 보자.

Central Directory File Header Local File Entry Local File Header와 매우 유사한 데이터를 담고 있다. 데이터가 중복 저장되는 이유는 이렇게 하면 Central Directory만 파싱하면 전체 ZIP 파일의 구조를 한번에 파악할 수 있기 때문이다. Central Directory를 파싱하면 한번에 모든 Local File의 메타 데이터를 획득할 수 있으니 꽤 중요하다고 할 수 있겠다. 이런 이유로 Central Directory File Header Local File Header와의 relative offset도 담고 있어 빠르게 Local File을 찾을 수 있게 해준다. 참고로 실제 압축 파일에 Local File Entry가 담겨 있는 순서와 Central DirectoryFile Header가 담겨 있는 순서가 틀려도 관계 없다.

 

Digital Signature는 있어도 그만 없어도 그만인 것 같은데 PKWARE Application Note에서 정확한 정보를 찾을 수 없었다. 실제로 파일을 압축해보면 Digital Signature가 들어있지 않다. 정확한 정보를 계속 찾고 있으니 찾아 내는 데로 문서에 반영될 꺼라능.

 

4.    miscellaneous

전체 구조를 대충 살펴 봤으니 이제 PKWAREApplication Note에서 소개해주는 진짜 전체 구조를 살펴보자.


위에서 봤던 구조랑 비슷한데 뭐가 이것저것 더 붙어 있다. 일단 처음 나오는걸 살펴보자능. EFS라고 표시된 섹션들은 Strong Encryption Specification과 관련이 있다. 우리는 Encryption과 관련된 내용은 다루지 않을 거기 때문에 저건 없다고 생각하자.

 

이름이 Zip64로 시작하는 섹션들은 오리지널 ZIP 포맷의 크기 제한을 없에는 ZIP64 포맷과 관련이 있다. 우리는 이 내용도 다루지 않을 꺼다. 참고로 오리지널 ZIP 포맷의 크기 제한이란 전체 ZIP 파일의 크기와 Local File의 압축된 크기 및 압축이 해제된 크기의 4GB 제한과 전체 Local File Entry의 개수가 65535개로 제한되는 것을 말한다. 아무튼 저 두 섹션들도 없다고 생각하자.

 

각각의 Central Directory File Header version needed to extract라는 이름으로 자신의 압축을 해제하기 위해 구현해야 되는 ZIP 파일 포맷의 스펙의 버전을 명시하고 있다. 이걸 보고 위의 두 가지 특징들이 사용되었는지 알 수 있다.

 

다음 챕터부터 Local File Entry Central Directory의 구조를 살펴보면서 리얼 월드에서 돌아다니고 있는 ZIP파일의Hex dump를 분석해볼 꺼라능. 이 과정에서 프로그램으로 ZIP파일을 분석하려면 어떻게 해야 하는지에 대한 노하우도 조금은 얻을 수 있을꺼라능.....아마도 -_-



 

저작자 표시 비영리 동일 조건 변경 허락

댓글을 달아 주세요

  1. LaLuna 2010/11/03 11:11  댓글주소  수정/삭제  댓글쓰기

    어디서 퍼왔나요.
    오덕체가 없네요

크리에이티브 커먼즈 라이선스
Creative Commons License
연재가 끝나면 적당히 순화를 거친후 PDF로 제공될 예정입니다.

완성 버전의 라이센스 정책도 위의 CCL과 동일하니 참고하시라능.
-----------------------------------------------------------------------------------------------------------

1.   Overview

1.    Introduction

이 문서에서 우리는 .ZIP 압축 파일을 읽는 방법을 살펴볼 꺼라능. 물론 ZIP 파일 포맷을 읽어내는 라이브러리가 많이 있긴 하지만 우리는 배움을 목적으로 바퀴를 다시 발명해 볼 껑미.

 

아마도 이 문서는 ZIP 파일 포맷을 하향식으로 분석해 보면서 기존의 압축 유틸리티를 사용해 생성된 ZIP 파일의 Hex dump를 눈으로 읽어보는 방식으로 진행 될 꺼라능. 그리고 부록으로 소스코드가 제공 될 꺼라능. 내 계획이 바뀌지 않는다면 말이삼. 실습에 사용하는 압축 유틸리티는 7zip을 사용할 꺼고 hex 에디터는 HxD를 사용할 태니 긔찬아도 설치를 하도록 하자능.

 

 

2.    ZIP History

모두들 알다시피 ZIP 파일 포맷은 데이터를 압축해서 보관하기 위해서 사용하는 파일 모맷이라능. N개의 파일을 묶어서 하나로 묶어서 크기를 줄여서 저장하는데 사용하는 파일 포맷임. 스펙에는 꽤 많은 압축 알고리즘을 지원하지만 근래에는 Deflate 알고리즘이 대세다. 다른 건 쌩까도 될 정도로 Deflate 알고리즘이 많이 사용되고 있다능.

 

ZIP 파일 포맷은 1989 Phil Katz PKZIP에 사용하려고 만들었다고 한다. ARC 파일 압축을 발전 시킨 건데 지금에 와서는 메이저 OS는 모두 별다른 유틸리티 프로그램이 없이 ZIP 파일 포맷을 해제 또는 압축 할 수 있다능.  사실상 업계에서 가장 널리 쓰이고 있는 압축 포맷임.

 

일반적으로 확장자는 “.zip” 또는 “.ZIP”를 사용하고 MIME 형식으로는 application/zip으로 표시한다고 한다. 알께뭐임..나는 임베디드 플머라 MIME 형식 따위는 모름. 아무튼 많은 소프트웨어에서 파일 저장 형식으로 사용된다고 한다. 대표적으로 .jar, .odt, .docx 등이 ZIP 파일 포맷으로 저장된다고 한다. 이 경우에는 확장자의 이름만 바꾼 방식으로 사용되고 있다. 못 믿겠으면 .docx 7zip같은 압축 유틸리티로 풀어보라능.

 

여담이지만 ZIP의 아버지인 Phil Katz 알코올중독으로 고생하다가 2000년에 4월에 호텔방에서 급성 알콜 중독으로 사망했따능. 손에는 술병을 들고 있었다던데.....나도 조금 조심해야겠음.

저작자 표시 비영리 동일 조건 변경 허락

댓글을 달아 주세요

  1. Favicon of http://lazygyu.tistory.com BlogIcon lazygyu 2010/10/19 13:22  댓글주소  수정/삭제  댓글쓰기

    악 이거 좆네염 ㅋㅋ 이거 담엔 RAR ㄱㄱ?

  2. 푸르름 2010/12/23 08:42  댓글주소  수정/삭제  댓글쓰기

    잘읽고갑니다 ㅎㅣ

플러그인 만들어보기

리눅스 | 2010/07/24 09:59 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License
리눅스에서는 Shared Object 라고 부르는 DLL을 로드해서 사용하는걸 플러그인이라구 불르는거 같더라능. 윈도우라면 DLL을 불러오면 될태고.....아무튼 플러그인과 메인 프로그램 사이의 인터페이스를 잘 정의하는게 관건있거 같더라능.

뭐...어짜피 난 잘모르구 -_-;;;; 리눅스에서 Shared Object를 불러다 쓰는건  dl 라이브러리를 사용하면 된다능. dlopen() 으로 .so를 연 다음, dlsym() 으로 써서 잘 사용하구 나서 dlclose() 를 해주면 된다능. 자세한 사용법은 man page를 보는게 훨 좋을태니 아래 링크를 눌르라능

헬로우 월드 문자열을 플러그인을 불러다 적당히 변형해서 출력하는 프로그램을 싸봤다능. 소스코드 전체를 올려놓을태니 궁금하면 이걸 받아서 보라능. make 한담에 아래 처럼 켜보면 된다능. downcase.so를 아규먼트로 넣어주면 소문자로 출력해준다능. 끵.

dmw@dmw-desktop:~/works/linux_plugin_example$ ./hello_plugin upcase.so
ORIGINAL MESSAGE : HelLO wOrLD

LOAD PLUG-IN ... success!
        converting message using plug-in

CONVERTED MESSAGE : HELLO WORLD


메인 프로그램은 아래처럼 생겼고....

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

typedef int(*p2func)(char*);

int open_plugin(void** plugin_handle, char* plugin_name);
int close_plugin(void* plugin_handle);
p2func import_function(void* plugin_handle, const char** error);

int main(int argc, char** argv) {
	int res;
	void* plugin_handle;
	const char* error;
	char hello_message[] = "HelLO wOrLD\n";
	p2func converter;
	
	if(argc == 1) {
		printf("hello_plugin upcase.so or downcase.so\n");
		return 1;
	}

	printf("ORIGINAL MESSAGE : %s\n", hello_message);
	
	printf("LOAD PLUG-IN ... ");
	res = open_plugin(&plugin_handle, argv[1]);
	if(res) {
		fprintf(stderr, "\nplug-in load error : %s\n", dlerror());
		return 1;
	}

	converter = import_function(plugin_handle, &error);
	if(error) {
		fprintf(stderr, "\nplug-in load error : %s\n", error);
		close_plugin(plugin_handle);
		return 1;
	} else {
		printf("success!\n");
	}

	printf("\tconverting message using plug-in\n");
	converter(hello_message);
		
	printf("\nCONVERTED MESSAGE : %s\n", hello_message);

	close_plugin(plugin_handle);
	return 0;
}

int open_plugin(void** plugin_handle, char* plugin_name) {
	*plugin_handle = dlopen(plugin_name, RTLD_NOW);

	if(*plugin_handle == NULL) {
		return 1;
	}

	return 0;
}

p2func import_function(void* plugin_handle, const char** error) {
	p2func func;

	// dlsym() is return NULL if there is no symbol in DL library.
	// If symbol has a NULL as it's value. We can not determine calling dlsym()
	// is success or not. So, We are using dlerror()
	*error = dlerror();						// clear error code

	func = dlsym(plugin_handle, "conv");
	*error = dlerror();
	if(*error) {
		return NULL;
	}

	return func;
}

int close_plugin(void* plugin_handle) {
	return dlclose(plugin_handle);
}

 플러그인이랍시고 만들어본건 저러캐 생겼다능.

1
2
3
4
5
6
7
8
9
10
11
int conv(char* str) {
	char *ptr;

	ptr = str;
	while(*ptr != '\0') {
		*ptr = toupper(*ptr);
		ptr++;	
	}

	return 0;
}


전체 소스코드

빌드 방법은 그리 어렵지 않으니 Makefile을 보시라능.

끵?!
저작자 표시 비영리 동일 조건 변경 허락

'리눅스' 카테고리의 다른 글

Ubuntu 8.10에 Ruby/SDL 설치하기  (4) 2010/08/21
플러그인 만들어보기  (4) 2010/07/24
How to install Boost Library in Ubuntu 9.04  (2) 2009/10/22
The Linux Kernel - 2.0.33  (0) 2009/08/13
내 vimrc  (0) 2009/05/19
ubuntu 설치  (7) 2008/08/17

댓글을 달아 주세요

  1. Favicon of http://lazygyu.tistory.com BlogIcon LazyGyu 2010/08/02 10:04  댓글주소  수정/삭제  댓글쓰기

    으, 음난한 리눅스 프로그래밍이근염

  2. Favicon of http://www.filepang.co.kr BlogIcon DMW 2010/08/02 21:07  댓글주소  수정/삭제  댓글쓰기

    으...음란하다니...불건전하다!

  3. Favicon of http://jkherald.com BlogIcon 정기 2010/08/06 15:43  댓글주소  수정/삭제  댓글쓰기

    dlopen -> dlsym -> dlclose
    LoadLibrary -> GetProcAddress -> FreeLibrary
    이렇게 대응되는 거냐능

퍼셉트론 튜토리얼

튜토리얼/퍼셉트론 | 2009/11/21 19:24 | Posted by DMW
크리에이티브 커먼즈 라이선스
Creative Commons License



아래 링크들을 타고 가서 보자

1. 뉴로 컴퓨터 개요 : http://www.filepang.co.kr/entry/뉴로-컴퓨터-개요
2. 생물학적 신경명와 인공 신경망 : http://www.filepang.co.kr/entry/생물학적-신경망과-인공-신경망
3. 신경망의 분류와 학습 : http://www.filepang.co.kr/entry/신경망의-분류와-학습
4. 단층 신경망 : http://www.filepang.co.kr/entry/단층-신경망

저작자 표시 비영리 동일 조건 변경 허락

'튜토리얼 > 퍼셉트론' 카테고리의 다른 글

퍼셉트론 튜토리얼  (0) 2009/11/21

댓글을 달아 주세요