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 파일이 이루는 구조이니 봐두면 좋다.
'컴퓨터 > 자료' 카테고리의 다른 글
오픈소스 목록 볼 수 있는 사이트 (0) | 2020.08.08 |
---|---|
계수, 멱지수, 차수, 항, 다항식 영어로 무엇? (0) | 2020.04.18 |
[Solved] 터미널 (apt-get) 다운로드 속도가 너무 느려요 ㅠㅠ (0) | 2020.03.30 |
[VIM 설정] .vimrc Setting (0) | 2020.03.30 |
C# volatile 변수 쓰는 이유 (0) | 2020.03.23 |