본문 바로가기
정상을향해/Program Analysis

PE File Format (2)

by 사이테일 2013. 11. 10.

출처 : http://www.reversecore.com

 

 

DOS Header

 

Microsoft PE File Format을 만들 때 당시에 널리 사용되던 DOS 파일에 대한 하위 호환성을 고려해서 만들었다.

그 결과로 PE header 의 제일 앞부분에 기존 DOS EXE header 를 확장시킨 IMAGE_DOS_HEADER 구조체가 존재하는 것이다.

 

typedef struct _IMAGE_DOS_HEADER {     

    WORD   e_magic;          // DOS signature : 4D5A ("MZ")

    WORD   e_cblp;                    

    WORD   e_cp;                      

    WORD   e_crlc;                    

    WORD   e_cparhdr;                 

    WORD   e_minalloc;                

    WORD   e_maxalloc;                

    WORD   e_ss;                      

    WORD   e_sp;                      

    WORD   e_csum;                    

    WORD   e_ip;                      

    WORD   e_cs;                      

    WORD   e_lfarlc;                  

    WORD   e_ovno;                    

    WORD   e_res[4];                  

    WORD   e_oemid;                   

    WORD   e_oeminfo;                 

    WORD   e_res2[10];                  

    LONG   e_lfanew;         // offset to NT header 

  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

 

* 출처 : Microsoft Visual C++ 에서 제공하는 winnt.h

 

IMAGE_DOS_HEADER 구조체의 크기는 40h 이다.

이 구조체에서 멤버 중 e_magic  e_lfanew 에 대해서는 꼭 알아두어야 한다.

 

e_magic : DOS signature (4D5A => ASCII "MZ")

e_lfanew : NT header 의 옵셋을 표시 (가변적인 값을 가짐)

 

 - 모든 PE 파일은 시작 부분(e_magic) DOS signature ("MZ") 가 존재하고, e_lfanew 값이 가리키는 위치에 NT header 구조체가 존재해야 한다.

   (NT header 구조체의 이름은 IMAGE_NT_HEADERS.)

 

 * 'MZ' Microsoft 에서 DOS 실행파일을 설계한 Mark Zbikowski 라는 사람의 이니셜입니다.

 

notepad.exe hex editor 로 열어 IMAGE_DOS_HEADER 구조체를 확인해 보자.

 

 

PE 구조에 맞게 파일 시작 2bytes 4D5A 이며, e_lfanew 값은 000000E0 이다.

(E0000000 이 아니다. Intel 계열 PC는 자료를 역순으로 저장한다. (Little Endian) )

 

만약 이 값들을 변경한 후 저장한다면 정상 실행되지 않을 것이다. (변경하면 더 이상 PE파일이 아니기 때문이다.)

 

 

 

DOS Stub

 

DOS Header 밑에는 DOS Stub 이 존재하는데, DOS Stub 의 존재여부는 옵션이며 크기도 일정하지 않다. 

(DOS Stub은 없어도 파일 실행에는 문제가 없다.)

 

DOS Stub은 코드와 데이터의 혼합으로 이루어져 있다.

notepad.exe DOS Stub 부분을 살펴보자.

 

 

위 그림에서 붉은 박스로 표시된 부분은 16bit 어셈블리 명령어 부분이다.

32bit 윈도우에서는 이쪽 명령어가 실행되지 않는다. (PE 파일로 인식하기 때문에 아예 이쪽 코드를 무시한다.)

 

이 명령어는 DOS 환경에서 실행하거나, DOS용 디버거 (debug.exe)를 이용해서 실행할 수 있다.

 

 

 

'정상을향해 > Program Analysis' 카테고리의 다른 글

Python Hacking Programming (1)  (0) 2013.11.10
PE File Format (4)  (0) 2013.11.10
PE File Format (3)  (0) 2013.11.10
PE File Format (1)  (0) 2013.11.10
Calling Convention  (0) 2013.11.10
Stack Frame  (0) 2013.11.10