2020. 5. 9. 10:38ㆍOS/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 |
---|