64byte(0x40)의 고정된 크기를 가지며, 디스크상의 첫 부분과 메모리상 ImageBase에 위치하고 있다. ImageBase는 프로세스의 가상 메모리 0 ~ FFFFFFFFh 범위(32bit의 경우)에서 PE파일이 로딩(매핑)되는 시작 주소를 나타내는 부분이다.
DOD Header의 처음 2byte는 DOS Header 구조체의 e_magic 인자로 MZ로 시작한다. 이는 DOS 개발자 가운데 한명인 Mark Zbikowski의 이니셜로 DOS Header의 시그니쳐로 사용하고 있다.
e_magic은 MZ를 나타내는 첫 2bytes 로 DOS Header 의 식별자이고, 마지막의 e_lfanew는 가변적인 값을 가지는 것으로 PE Header(NT header)의 주소를 알아볼 수 있다. e_lfanew의 값은 offset 0x000000XX로 여기에는 "PE"라는 값이 저장된 위치를 가리키고 있으며, 이 값을 통해 이 파일의 구조가 PE형태임을 인식하게 된다.
WORD와 LONG은 각각 2bytes, 4bytes 크기를 가지고 있다. 그래서 이 구조체를 계산해보면 WORD형 데이터 16개, 배열에서 WORD형의 합 14개, LONG형 1개로 (2*30bytes) + 4bytes = 64bytes / 16 = 4 즉 0x40의 고정된 공간을 할당 받게 된다는 것을 알 수 있다.
위 구조는 winnt.h의 2300라인에서 찾아 볼 수 있다.
2300 typedef struct _IMAGE_DOS_HEADER {
2301 WORD e_magic; /* 00: MZ Header signature */
2302 WORD e_cblp; /* 02: Bytes on last page of file */
2303 WORD e_cp; /* 04: Pages in file */
2304 WORD e_crlc; /* 06: Relocations */
2305 WORD e_cparhdr; /* 08: Size of header in paragraphs */
2306 WORD e_minalloc; /* 0a: Minimum extra paragraphs needed */
2307 WORD e_maxalloc; /* 0c: Maximum extra paragraphs needed */
2308 WORD e_ss; /* 0e: Initial (relative) SS value */
2309 WORD e_sp; /* 10: Initial SP value */
2310 WORD e_csum; /* 12: Checksum */
2311 WORD e_ip; /* 14: Initial IP value */
2312 WORD e_cs; /* 16: Initial (relative) CS value */
2313 WORD e_lfarlc; /* 18: File address of relocation table */
2314 WORD e_ovno; /* 1a: Overlay number */
2315 WORD e_res[4]; /* 1c: Reserved words */
2316 WORD e_oemid; /* 24: OEM identifier (for e_oeminfo) */
2317 WORD e_oeminfo; /* 26: OEM information; e_oemid specific */
2318 WORD e_res2[10]; /* 28: Reserved words */
2319 DWORD e_lfanew; /* 3c: Offset to extended header */
2320 } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
출처 : source.winehq.org - winnt.h
또한 기본적으로 Little Endian에 대한 지식을 알고 있어야 값을 보다 쉽게 이해할 수 있다.
'Information Technology > File Format' 카테고리의 다른 글
PE 코드섹션 흐름도 (0) | 2013.04.25 |
---|---|
IMAGE_NT_HEADERS - Signature (0) | 2013.04.24 |
IMAGE_NT_HEADERS (0) | 2013.04.24 |
MS-DOS Stub Program (0) | 2013.04.24 |
Runtime Data Areas의 구조 (0) | 2013.04.18 |