NT Header
IMAGE_NT_HEADERS
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //PE Signature
50450000 ("PE"00)
...} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
(*위의 구조체는 32bit용이며 64bit 용은 세번째 멤버가 IMAGE_NT_HEADERS64 입니다.)
NT Header의 첫부분에는 "PE"라는 Signature가 나오며 이는 DOS Header에서의 "MZ"와 같이 필수적인 요소입니다.
IMAGE_NT_HEADERS -IMAGE_FILE_HEADER //파일의 대략적인 속성을 나타내는 구조체
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
...
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
- Machine
CPU별로 고유한 값을 나타냅니다.
- NumberOfSections
PE Body에서와 같이 PE파일은 Code,Data,Resource 등이 각각의 섹션에 나뉘어 저장이 되는데 그 섹션의 수를 나타냅니다. (0보다 커야함)
- SizeOfOptionalHeader
IMAGE_OPTIONAL_HEADER32구조체의 크기를 나태냅니다.
*Windows의 PE Loader은 IMAGE_OPTIONAL_HEADER의 SizeOfOptionalHeader를 보고 IMAGE_OPTIONAL_HEADER32구조체의 크기를 인식합니다.
- Characteristics;
파일의 속성을 나타내는 값입니다.
//Notepad.exe 의 IMAGE_FILE_HEADER
IMAGE_NT_HEADERS - IMAGE_OPTIONAL_HEADERS32 //64bit PE파일의 경우 64 사용
- Magic
32bit의 경우 10Bh, 64bit의 경우 20Bh를 나타냅니다.
- AddressOfEntryPoint
EP의 RVA(Relative Virtual Address)값을 가지고 있습니다.
- ImageBase
-PE파일이 로딩(매핑)되는 시작주소를 나타냅니다.
-EXE,DLL 파일은 user memory 영역인 0~7FFFFFFFh 범위에 위치하고 SYS 파일은 kernel memory영역인 80000000h~FFFFFFFFh범위에 위치합니다.
-개발도구들이 만들어내는 EXE파일의 값은 00400000h이고, DLL파일의 값은 010000000h을 보통 사용합니다.
-PE loader는 PE 파일을실행시키기 위해 프로세스를 생성하고 파일을 메모리에 로딩(매핑)시킨후 EIP레지스터 값을 ImageBase+AddressOfEntryPoint 값으로 세팅합니다.
- SectionAlignment & FileAlignment
SectionAlignment은 메모리에서 섹션의 최소단위를 나타내고 파일에서 섹션의 최소단위를 나태내는것이 FileAlignment 이다.
- SizeOfImage
PE파일이 메모리에 로딩되었을떄 가상 메모리에서 PE Image가 차지하는 크기를 나타내며 일반적으로 파일의 크기와 메모리에 로딩된 크기는 다릅니다.
- SizeOfHeader
PE Header의 전체크기를 나타낸다.
- Subsystem
-Driver File(*.sys)
-GUI File : Graphic User Interface
-CUI File : Console User Interface
- NumberOfRvaAndSize
DataDirectory 배열의 수를 나타내며 PE loader는 이 값을 보고 배열의 크기를 인식합니다.
- DataDirectory
IMAGE_DATA_DIRECTORY 구조체의 배열로, 각 항목마다 정의된 값을 가지게 됩니다.
//Notepad.exe 의 IMAGE_OPTIONAL_HEADERS32
**본 게시물은 http://www.reversecore.com 을 참고하여 복습용으로 옮겨 적거나 한 것이지 결코 제 머리에서 나온게 아님을 알려드립니다. 자세한건 Reversecore로 가시는게 더 좋습니다.
'Reversing > Theory' 카테고리의 다른 글
PE File Format 0x04 (0) | 2015.01.13 |
---|---|
IDA PRO 단축키 (0) | 2015.01.13 |
PE FILE Format 0x03 (0) | 2015.01.10 |
PE FILE Format 0x01 (0) | 2015.01.08 |
C언어의 const 선언이 과연 리버싱에서 또한 값을 변경못하게끔 만들수 있는가? (3) | 2015.01.08 |