'PEsigniture'에 해당되는 글 1건

  1. 2008.12.05 [PE 구조] MS-DOS stup

이미지 파일에서 처음 나오는 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 시그니처까지 알아보았다. 

Posted by skensita