출처 : 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 |