PE File Format 0x02
0x01. Dos Header
Windows에서 제공하는 winNT.h의 _IMAGE_DOS_HEADER 구조체입니다.
Dos 시절의 파일과의 호환성을 고려해서 만들었습니다.
IMAGE_DOS_HEADER 구조체의 크기는 0x40 입니다.
각각의 역할은 주석으로 설명되어 있습니다.
중요한 부분은 e_magic과 e_lfanew입니다.
e_magic /* Dos signature입니다.
ASCII 값으로 "MZ"(4D 5A) 입니다.
모든 PE 파일은 시작 부분에 Dos signature("MZ")가 존재합니다.
MZ는 Dos 실행 파일을 설계한 Mark Zbikowski의 이니셜입니다. */
e_lfanew /* Long File Address of NEW exe header를 줄인 말입니다.
앞의 Long은 자료형 DWORD를 의미합니다.
NT header의 offset을 저장하고 있습니다.
모든 PE 파일은 e_lfanew가 가리키는 위치에 NT header 구조체가 존재합니다. */
실행파일을 PEview로 열어본 모습입니다.
위쪽의 파란 줄의 상자는 Dos header를 나타내고
아래쪽의 파란 줄의 상자는 NT header를 나타냅니다.
시작 부분에 "MZ"가 있는 것을 확인할 수 있습니다.
Dos header의 마지막 DWORD는 00 01 00 00 으로 little endian을 적용해 0x00000100을 가리키고 있습니다.
해당 주소를 따라가면 NT header가 나오는 것을 확인할 수 있습니다.
Little endian의 개념을 모르시면 다음 글을 읽고 오세요.
-> http://slimv.tistory.com/entry/Little-endian
0x02. Dos Stub
Dos header의 바로 다음에는 Dos stub가 있습니다.
Dos stub는 있는 경우도 있고 없는 경우도 있습니다.
Dos stub는 Dos mode로 실행한 경우 실행되는 코드입니다.
16-bit assembly code와 data의 혼합으로 이루어져 있습니다.
파란 줄의 상자 속의 코드가 Dos stub 입니다.
Dos header가 끝난 바로 다음에 위치하는 것을 확인할 수 있습니다.
일반적으로는 "This program cannot be run in DOS mode"
또는 "This program must be run under Win32"과 같은 메시지를 출력하고 종료합니다.
'Reversing > PE File Format' 카테고리의 다른 글
PE File Format 0x06 (0) | 2012.11.11 |
---|---|
PE File Format 0x05 (0) | 2012.11.07 |
PE File Format 0x04 (0) | 2012.10.31 |
PE File Format 0x03 (0) | 2012.10.29 |
PE File Format 0x01 (1) | 2012.10.28 |