PE File Format Header 요약

2020. 5. 9. 10:38OS/Windows

[PE_File_Format]

1. VA = Virtual Address는 프로세스 가상 메모리의 절대주소.

 

2. RVA = RelativeVirtual Address는 어느 기준 위치(ImageBase)에서부터의 상대주소.

    2.1. RVA + ImageBase = VA

 

3. DOS Header.

    3.1. PE Header의 제일 앞부분.

    3.2. IMAGE_DOS_HEADER 구조체가 존재.

        * e_magic = DOS Signature(MZ - 4D5A)

        * e_lfanew = NT Header의 옵셋을 표시(파일에 따라 가변적인 값을 가짐)

 

4. DOS Stub = DOS Header 밑에 존재.

 

5. NT Header.

    5.1. IMAGE_NT_HEADERS.

        * IMAGE_FILE_HEADER = 파일의 개략적인 속성을 나타냄.

            - Machine = CPU별로 고유한 값.

            - NumberOfSections = 코드, 데이터, 리소스 등 섹션의 개수 (반드시 0보다 커야 실행됨)

            - SizeOfOptionalHeader = IMAGE_OPTIONAL_HEADER32 구조체의 크기.

            - Characteristics = 파일의 속성을 나타냄 (DLL인지 등)

        * IMAGE_OPTIONAL_HEADER32 = PE 헤더 구조체 중 가장 큰 크기.

            - AddressOfEntryPoint = EP의 RVA 값을 가지고 있음 (프로그램에서 최초로 실행되는 코드의 시작 주소)

            - ImageBase = PE 파일이 가상 메모리에 로딩되는 시작 주소.

                > PE 로더는 PE 파일을 실행시키기 위해 프로세스를 생성하고 파일을 메모리에 로딩한 후 EIP 레지스터

                   값을 ImageBase+AddressOfEntryPoint 값으로 세팅함.

            - FileAlignment = 파일에서 섹션의 최소단위를 나타냄.

            - SectionAlignment = 메모리에서 섹션의 최소단위를 나타냄.

                > 파일/메모리의 섹션 크기는 반드시 각각 FileAlignment/SectionAlignment의 배수여야함.

            - SizeOfImage = PE 파일이 메모리에 로딩되었을 때 가상 메모리에서 PE Image가 차지하는 크기.

                > 파일의 크기와 메모리에 로딩된 크기는 다름.

            - SizeOfHeader = PE 헤더의 전체 크기.

                > FileAlignment의 배수여야함.

                > 파일 시작에서 SizeOfHeader 옵셋만큼 떨어진 위치에 첫 번째 섹션이 존재.

            - Subsystem = sys, dll, exe인지 구분.

            - NumberOfRvaAndSized = IMAGE_OPTIONAL_HEADER32 구조체의 마지막 멤버인 DataDirectory 배열의 수.

            - DataDirectory = IMAGE_DATA_DIRECTORY 구조체의 배열.

                > EXPORT, IMPORT, RESOURCE, TLS 등의 Directory가 있음.

 

6. Section Header.

    6.1. IMAGE_SECTION_HEADER = 각 섹션별 IMAGE_SECTION_HEADER 구조체의 배열로 되어있음.

        * VirtualSize = 메모리에서 섹션이 차지하는 크기.

        * VirtualAddress = 메모리에서 섹션의 시작 주소 (RVA)

        * SizeOfRawData = 파일에서 섹션이 차지하는 크기.

        * PointerToRawData = 파일에서 섹션의 시작 위치.

        * Characteristics = 섹션의 속성 (bit OR)

            - VirtualAddress와 PointerToRawData는 SectionAlignment와 FileAlignment에 맞게 결정됨

              (아무 값이나 가질 수 없음)

            - VirtualSize와 SizeOfRawData는 일반적으로 서로 다른 값을 가짐.

 

7. RVA to RAW.

    7.1. RAW - PointerToRawData = RVA - VirtualAddress

    7.2. RAW = RVA - VirtualAddress + PointerToRawData

    7.3. VirtualSize 값이 SizeOfRawData 값보다 크면 비정상.

'OS > Windows' 카테고리의 다른 글

Process와 Thread  (0) 2020.05.03