2. Windows PE_Header
2.1 IMAGE_DOS_HEADER
Dos Header는 64바이트로 의미있는 필드는 가장 앞의 WORD e-magic과 가장 마지막의 LONG e_flanew 필드이다.
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; /* 00: MZ Header signature */
WORD e_cblp; /* 02: Bytes on last page of file */
WORD e_cp; /* 04: Pages in file */
WORD e_crlc; /* 06: Relocations */
WORD e_cparhdr; /* 08: Size of header in paragraphs */
WORD e_minalloc; /* 0a: Minimum extra paragraphs needed */
WORD e_maxalloc; /* 0c: Maximum extra paragraphs needed */
WORD e_ss; /* 0e: Initial (relative) SS value */
WORD e_sp; /* 10: Initial SP value */
WORD e_csum; /* 12: Checksum */
WORD e_ip; /* 14: Initial IP value */
WORD e_cs; /* 16: Initial (relative) CS value */
WORD e_lfarlc; /* 18: File address of relocation table */
WORD e_ovno; /* 1a: Overlay number */
WORD e_res[4]; /* 1c: Reserved words */
WORD e_oemid; /* 24: OEM identifier (for e_oeminfo) */
WORD e_oeminfo; /* 26: OEM information; e_oemid specific */
WORD e_res2[10]; /* 28: Reserved words */
DWORD e_lfanew; /* 3c: Offset to extended header */
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
[DOS_HEADER DUMP]
1) Dos Signature : 4D5A, 도스 설계자 중 한명인 Mark Zbikowski 의 이니셜 "MZ" 로 고정.
2) e_lfanew : 0x00000040, PE헤더가 시작되는 위치의 주소 값.
2.2 Dos Stub
해당 프로그램을 도스나 Win3.1버전에서 실행시켰을 때 출력되는“This program cannot be run in DOS mode" 라는 문자열을 가지고 있으며 크기는 가변적이다.
2.3 IMAGE_NT_HEADER
DWORD Signature; /* "PE"\0\0 */ /* 0x00 */
IMAGE_FILE_HEADER FileHeader; /* 0x04 */
IMAGE_OPTIONAL_HEADER32 OptionalHeader; /* 0x18 */
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
2.3.1 DWORD Signature
파일임을 나타내는 값으로 "PE" (0x00004550) 고정.
2.3.2 IMAGE_FILE_HEADER
20 byte로 구성 된 구조체.
WORD Machine;
CPU의 ID
WORD NumberOfSections;
섹션의 수
DWORD TimeDateStamp;
컴파일러 또는 링커가 해당 파일을 만들어 낸 시간. 1970년 1월 1일 오전 9 시부터 파일을 생성한 시간까지의 초를 표현한다.
DWORD PointerToSymbolTable;
COFF 심벌의 파일 오프셋. COFF 디버그 정보를 가진 파일에만 표현된다.
DWORD NumberOfSymbols;
PointerToSymbolTable필드가 가리키는 COFF심벌 내에서의 심벌 수
WORD SizeOfOptionalHeader;
IMAGE_OPTIONAL_HEADER의 바이트 수.
OBJ는 0, 32bit PE는 0xE0(224), 62bit PE는 0xF0(240)
WORD Characteristics;
PE 파일에 대한 특성.
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
2389 #define IMAGE_FILE_MACHINE_UNKNOWN 0
2390 #define IMAGE_FILE_MACHINE_I860 0x014d
2391 #define IMAGE_FILE_MACHINE_I386 0x014c
2392 #define IMAGE_FILE_MACHINE_R3000 0x0162
...
2408 #define IMAGE_FILE_MACHINE_IA64 0x0200
...
/* These defines describe the meanings of the bits in the Characteristics
2369 field */
2371 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 /* No relocation info */
재배치 정보가 없음
2372 #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
실행파일 이미지로 OBJ나 LIB파일이 아님
2373 #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
라인정보가 없음
2374 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
로컬 심벌이 없음
2375 #define IMAGE_FILE_AGGRESIVE_WS_TRIM 0x0010
적극적으로 워킹셋을 정리
2376 #define IMAGE_FILE_LARGE_ADDRESS_AWARE 0x0020
어플이 2G이상의 가상주소번지를 제어할 수 있게 함
2377 #define IMAGE_FILE_16BIT_MACHINE 0x0040
2378 #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
2379 #define IMAGE_FILE_32BIT_MACHINE 0x0100
32bit머신을 필요로 함
2380 #define IMAGE_FILE_DEBUG_STRIPPED 0x0200
디버그 정보가 _DBG파일에만 존재
2381 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0x0400
PE이미지가 이동 가능한 장치 위에 존재할 때 고정 디스크상의 스왑파일로 카피해서 실행
2382 #define IMAGE_FILE_NET_RUN_FROM_SWAP 0x0800
PE이미지가 네트워크상에 존재할 때 고정 디스크상의 스왑파일로 카피해서 실행
2383 #define IMAGE_FILE_SYSTEM 0x1000
2384 #define IMAGE_FILE_DLL 0x2000
동적라이브러리 파일임
2385 #define IMAGE_FILE_UP_SYSTEM_ONLY 0x4000
하나의 프로세서만을 장착한 머신에서 실행 됨
2386 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
[IMAGE_FILE_HEADER DUMP]
1) DWORD Signature : 0X00005045, PE
2) WORD Machine : 014C, Intel 386
WORD NumberOfSections : 섹션 수 3개
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader : E0, 32bit에서의 크기(224바이트)
WORD Characteristics : 010F , IMAGE_FILE_RELOCS_STRIPPED
IMAGE_FILE_EXECUTABLE_IMAGE
IMAGE_FILE_LINE_NUMS_STRIPPED
IMAGE_FILE_LOCAL_SYMS_STRIPPED
IMAGE_FILE_32BIT_MACHINE
2.3.3 IMAGE_OPTIONAL_HEADER
224바이트로 구성 된 구조체. 96바이트의 필드와 8바이트 크기의 데이터 디렉토리 16개(128바이트)로 구성.
2565 typedef struct _IMAGE_OPTIONAL_HEADER {
2566
2567 /* Standard fields */
2568
2569 WORD Magic; /* 0x10b or 0x107 */ /* 0x00 */
2570 BYTE MajorLinkerVersion;
2571 BYTE MinorLinkerVersion;
2572 DWORD SizeOfCode;
2573 DWORD SizeOfInitializedData;
2574 DWORD SizeOfUninitializedData;
2575 DWORD AddressOfEntryPoint; /* 0x10 */
2576 DWORD BaseOfCode;
2577 DWORD BaseOfData;
...
'WINDOWS' 카테고리의 다른 글
윈도우 실행명령 (0) | 2013.07.17 |
---|---|
컴파일러 (0) | 2012.12.24 |
1. Windows PE_개요 (0) | 2012.09.09 |
Windows Script Host (WSH) (0) | 2012.09.07 |
Windows Command (0) | 2012.09.06 |