windows 실행파일.hwp

 

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

 typedef struct _IMAGE_NT_HEADERS {

   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로 구성 된 구조체.

 typedef struct _IMAGE_FILE_HEADER {

   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;


/* These are the settings of the Machine field. */

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

+ Recent posts