Portable Executable File로 Windows 운영체제에서 사용되는 실행 파일
| 종류 | 주요 확장자 |
|---|---|
| 실행 계열 | EXE, SCR |
| 드라이버 계열 | SYS, VXD |
| 라이브러리 계열 | DLL, OCX, CPL, DRV |
| 오브젝트 파일 계열 | OBJ |
OBJ를 제외한 모든 파일은 실행 가능

1. Dos Header ~ Section Header : PE Header
2. Section + NULL : PE Body --> 여기서 NULL Padding을 사용하는 이유 : 처리 효율을 높이기 위해 최소 기본 단위 개념을 사용
VA(Virtual Address) : 프로세스 가상 메모리의 절대 주소RVA(Relative Virtual Address) : 프로세스 가상 메모리의 상대 주소Image Base : 기준 위치RVA + Image Base = VA ( 상대 주소 + 기준 위치 = 절대 주소 )
IMAGE_DOS_HEADER의 크기 : 40he_magic : DOS Signature(4D5A -> "MZ")e_lfanew : NT Header의 offset(가변적)

IMAGE_NT_HEADERS 구조체의 크기 : F8hSignature 멤버 변수 : 50450000h -> "PE"00File Header 멤버 변수 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;
MachineNumberOfSectionsSizeOfOptionalHeaderCharacteristicsTimeDataStampOptional Header 멤버 변수
Magic Address Of Entry PointImageBaseSectionAlignment, FileAlignmentSectionAlignment, FileAlignment의 배수가 되어야 함SizeOfImageSizeOfHeaderFileAlignment의 배수여야 함Subsystem
NumberOfRvaAndSizesDataDirectory 배열의 개수를 의미DataDirectory
| 종류 | 액세스 권한 |
|---|---|
| code | 실행, 읽기 권한 |
| data | 비실행, 읽기, 쓰기 권한 |
| resource | 비실행, 읽기 권한 |

| 항목 | 의미 |
|---|---|
| VirtualSize | 메모리에서 섹션이 차지하는 크기 |
| VirtualAddress | 메모리에서 섹션의 시작 주소(RVA) |
| SizeOfRawData | 파일에서 섹션이 차지하는 크기 |
| PointerToRawData | 파일에서 섹션의 시작 위치 |
| Characteristics | 섹션의 속성(bit OR) |
정의
파일이 메모리에 로딩되기 전의 file offset과 로딩되고 나서의 주소를 매칭하는 것
--> RVA는 메모리에 로딩되었을 때의 주소, RAW는 로딩되기 전의 file offset을 의미
비례식
RAW - PointerToRawData = RVA - VirtualAddress
RAW = RVA - VirtualAddress + PointerToRawData
예외 상황
: RVA가 2번째 섹션인데, RAW가 3번째 섹션이다.
--> "해당 RVA에 대한 RAW 값은 정의할 수 없다"라고 표현
PE View를 통해서 간단히 구할 수 있지만, 이정도는 밥 먹듯이 할 줄 알아야 한다.