이번에는 파일 헤더에 대해서 정리해보겠다.
이 헤더는 이전에 살펴 보았던 MS-DOS stub과 PE 시그니처 뒤에 바로 나온다.
이 헤더의 구조체 역시 WinNT.h에 정의 되어 있다.
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
헤더 중에서 가장 단순한 듯 싶다. 파일 정보를 담고 있는 헤더이다. 각 필드 값들을 간단히 나열해 보면 아래와 같다.
Machine : 필요한 머신의 타입을 지정해준다.
대부분 PE 파일은 가장 흔히 쓰이는 0x14C의 값을 가질 것이다. 이 값은 Intel 386 머신을 가르킨다.
많은 타입이 존재하기 때문에 더 많은 정보는 WinNT.h를 참조하도록 하자.
NumberOfSections : 이 필드는 파일의 섹션의 수를 저장하고 있다.
한 파일이 가질 수 있는 섹션의 수는 96개이다.
TimeDateStamp : 파일이 생성되었을 때의 날짜와 시간을 저장하고 있다.
어떤 방식으로 오더링 되어있는 지를 모르겠다. 알아봐야 하는데...
PointerToSymbolTable : 파일의 심볼 내용을 담고 있는 테이블의 오프셋을 저장하고 있다.
없으면 0이다.
NumberOfSymbols : 심볼 테이블에 저장된 심볼의 수를 저장하고 있다.
당연이 이 필드도 0의 값을 가질 수 있다.
SizeOfOptionalHeader : 이 헤더 다음에 오는 Optional Header의 크기를 저장하고 있다.
Characteristics : 파일의 속성을 가지고 있다.
속성의 종류도 여러가지가 존재한다. 자세한 내용은 WinNT.h를 참조하자.
대표적인 속성을 몇가지 적어보면 아래와 같다.
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
-> 실행가능한 이미지 임을 나타낸다. 셋팅되지 않는다면 실행파일이 아니겠지??
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
-> 심볼 내용이 삭제 되었음을 나타낸다. 기본적으로 심볼은 삭제 된다고 한다.
#define IMAGE_FILE_32BIT_MACHINE 0x0100
-> 32비트 워드 프로세서에서 작동한다는 것을 나타낸다.
파일 헤더를 간단히 정리해보았다. 머신 타입과 속성들도 자세히 조사하면 좋겠지만 너무 길어지면 오히려 정리한 맛이 안날 거 같아서 말았다.
아래 그림은 PEView를 통해 살펴본 파일 헤더이다.
위 그림에 나타난 속성 중 IMAGE_FILE_DLL은 파일이 EXE 실행파일이 아닌 DLL 파일임을 나타낸다.
[출처] [PE 구조] FILE HEADER