컴퓨터/자료

IMAGE_OPTIONAL_HEADER와 IMAGE_OPTIONAL_HEADER64의 차이점

ahdelron 2020. 4. 8. 17:37

< IMAGE_OPTIONAL_HEADER와 IMAGE_OPTIONAL_HEADER64 차이점 >

 

  MSDN 문서에서 IMAGE_OPTIONAL_HEADER와 IMAGE_OPTIONAL_HEADER64의 정의를 볼 수 있다. 내용에 따르면, 둘은 64비트에서의 PE 파일이냐 아니냐 문제이다. 먼저 정의를 한번 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
typedef struct _IMAGE_OPTIONAL_HEADER {
  WORD                 Magic;
  BYTE                 MajorLinkerVersion;
  BYTE                 MinorLinkerVersion;
  DWORD                SizeOfCode;
  DWORD                SizeOfInitializedData;
  DWORD                SizeOfUninitializedData;
  DWORD                AddressOfEntryPoint;
  DWORD                BaseOfCode;
  DWORD                BaseOfData;
  DWORD                ImageBase;
  DWORD                SectionAlignment;
  DWORD                FileAlignment;
  WORD                 MajorOperatingSystemVersion;
  WORD                 MinorOperatingSystemVersion;
  WORD                 MajorImageVersion;
  WORD                 MinorImageVersion;
  WORD                 MajorSubsystemVersion;
  WORD                 MinorSubsystemVersion;
  DWORD                Win32VersionValue;
  DWORD                SizeOfImage;
  DWORD                SizeOfHeaders;
  DWORD                CheckSum;
  WORD                 Subsystem;
  WORD                 DllCharacteristics;
  DWORD                SizeOfStackReserve;
  DWORD                SizeOfStackCommit;
  DWORD                SizeOfHeapReserve;
  DWORD                SizeOfHeapCommit;
  DWORD                LoaderFlags;
  DWORD                NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
cs

출처 : https://docs.microsoft.com/ko-kr/windows/win32/api/winnt/ns-winnt-image_optional_header32

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
typedef struct _IMAGE_OPTIONAL_HEADER64 {
  WORD                 Magic;
  BYTE                 MajorLinkerVersion;
  BYTE                 MinorLinkerVersion;
  DWORD                SizeOfCode;
  DWORD                SizeOfInitializedData;
  DWORD                SizeOfUninitializedData;
  DWORD                AddressOfEntryPoint;
  DWORD                BaseOfCode;
  ULONGLONG            ImageBase;
  DWORD                SectionAlignment;
  DWORD                FileAlignment;
  WORD                 MajorOperatingSystemVersion;
  WORD                 MinorOperatingSystemVersion;
  WORD                 MajorImageVersion;
  WORD                 MinorImageVersion;
  WORD                 MajorSubsystemVersion;
  WORD                 MinorSubsystemVersion;
  DWORD                Win32VersionValue;
  DWORD                SizeOfImage;
  DWORD                SizeOfHeaders;
  DWORD                CheckSum;
  WORD                 Subsystem;
  WORD                 DllCharacteristics;
  ULONGLONG            SizeOfStackReserve;
  ULONGLONG            SizeOfStackCommit;
  ULONGLONG            SizeOfHeapReserve;
  ULONGLONG            SizeOfHeapCommit;
  DWORD                LoaderFlags;
  DWORD                NumberOfRvaAndSizes;
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
cs

출처 : https://docs.microsoft.com/ko-kr/windows/win32/api/winnt/ns-winnt-image_optional_header64

 

  이 정도의 정보만 가지고 있으면 차이점을 알 수 있다. 

 

- IMAGE_OPTIONAL_HEADER와 IMAGE_OPTIONAL_HEADER64 차이점 

1. DWORD BaseOfCode의 유무

  정의를 살펴보면 IMAGE_OPTIONAL_HEADER에 있는 BaseOfCode 속성이 IMAGE_OPTIONAL_HEADER64에는 존재하지 않는 것을 볼 수 있다.

2. SizeOf~ 를 접두어로 갖는 속성의 데이터 형의 종류

  IMAGE_OPTIONAL_HEADER에서 SizeOfStackReserve, ... 의 데이터형은 4바이트(32비트)인 DWORD이다. 그러나, IMAGE_OPTIONAL_HEADER64에서의 SizeOfStackReserve, ... 의 데이터형은 8바이트(64비트)인 ULONGLONG이다.

3. 총 사이즈 비교 (IMAGE_NUMBEROF_DIRECTORY_ENTRIES=16 가정)

  IMAGE_OPTION_HEADER의 사이즈는 총 F2h 이다. IMAGE_OPTION_HEADER64는 102h 이다.

 

- 총 정리

  이렇게 IMAGE_OPTION_HEADER와 IMAGE_OPTION_HEADER64의 정의 그리고 차이점을 살펴볼 수 있었다. 32비트 프로그램과 64비트 프로그램이 사용하는 구조체를 각각 표현한 것 같았다. 나중에는 IMAGE_OPTION_HEADER128이 나오지는 않을까 기대를 하게 되었다. 참고로, 위의 정의들은 실제 PE 파일이 이루는 구조이니 봐두면 좋다.