이미지 파일에서 처음 나오는 MS-DOS stup에 대해서 알아보자.
이 부분은 PE 파일이 실행하는데 별 도움은 안된다. 단지, 이전 버전인 DOS 모드에서도 실행이 가능하도록 호환을 위해 만들어 놓은 구조체이다. 실제적으로 DOS 모드에서 실행시키면 "This program cannot be run in DOS mode"라는 문구를 출력해줄뿐 실행은 되지 않는다.
어째든 존재하는 헤더니 정리해보자. 우선 WinNT.h에 어떻게 정의 되었는지 찾아보자.
(※참고로 PE 구조에 따른 구조체들은 WinNT.h에 정의되어 있다.)
=========================================================================================
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
WORD e_magic; // Magic number
WORD e_cblp; // Bytes on last page of file
WORD e_cp; // Pages in file
WORD e_crlc; // Relocations
WORD e_cparhdr; // Size of header in paragraphs
WORD e_minalloc; // Minimum extra paragraphs needed
WORD e_maxalloc; // Maximum extra paragraphs needed
WORD e_ss; // Initial (relative) SS value
WORD e_sp; // Initial SP value
WORD e_csum; // Checksum
WORD e_ip; // Initial IP value
WORD e_cs; // Initial (relative) CS value
WORD e_lfarlc; // File address of relocation table
WORD e_ovno; // Overlay number
WORD e_res[4]; // Reserved words
WORD e_oemid; // OEM identifier (for e_oeminfo)
WORD e_oeminfo; // OEM information; e_oemid specific
WORD e_res2[10]; // Reserved words
LONG e_lfanew; // File address of new exe header
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
==========================================================================================
머 PE 구조에서 그리 중요한 부분이 아니라서 자세한 설명은 정리하지 않았다. 단지, 이런 부분이 있다는 정도로 알고 넘어가면 될거 같다. 좀 중요한 필드라면 e_lfanew와 e_magic 필드 정도 일것이다. e_lfanew 필드는 실제 PE 구조의 시그니처인 "PE\0\0"이 위치하는 오프셋을 가지고 있다. e_magic 필드는 MZ로 고정되어 있다. 시작 부분이 MZ로만 시작해도 이 파일이 PE구조라는 것을 짐작하는 데는 충분하다.
이 헤더 다음부터 PE 시그니처 전까지 오는 것은 DOS 모드에서 실행할 경우 출력해주는 문자열들이다. 기본적으로 위에서 언급한 문자열이 들어있지만 링킹을 할 때 /STUB 옵션을 이용하여 지정하여 줄 수도 있다. 아래 2자의 스크린 샷은 PEView로 본 PE 구조 중에서 MS-DOS stub 부분과 문자열이 저장된 부분이다.
첫 번째 그림의 마지막 필드 값이 0x118이다. 이 오프셋 값은 아래 그림과 같이 PE 구조의 시그니처가 존재하는 곳의 오프셋이다.
이상으로 MS-DOS stub과 PE 구조의 시작을 알리는 PE 시그니처까지 알아보았다.
[출처] [PE 구조] MS-DOS stup