PE FILE Format 0x02

Kail-KM
|2015. 1. 9. 01:33

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