PE(Portable Executable)는 Windows 운영 체제에서 사용되는 실행 파일 형식입니다. Unix의 COFF(Common Object File Format)를 기반으로 하고 있습니다.
| 계열 | 파일 확장자 |
|---|---|
| 실행 계열 | EXE, SCR |
| 드라이버 계열 | SYS, VXD |
| 라이브러리 계열 | DLL, OCX, CPL, DRV |
| 오브젝트 계열 | OBJ |
PE 파일은 크게 PE 헤더와 바디(섹션)로 구성됩니다.

PE 헤더는 파일의 메타데이터포함하고 있으며, 다음과 같은 많은 구조체를 가집니다:
DOS 헤더
DOS Stub
NT 헤더
PE 파일
│
├─ DOS 헤더 ("MZ")
│
├─ DOS Stub
│
└─ NT 헤더
├─ File Header
└─ Optional Header
└─ Data Directories
PE 헤더는 프로그램의 "설계도"와 같아서, 이를 통해 Windows가 프로그램을 올바르게 실행할 수 있습니다.
섹션은 실제 데이터를 포함하는 파일의 본문 부분입니다. 주요 섹션은 다음과 같습니다:
PE 파일은 디스크에 저장될 때와 메모리에 로드될 때 구조가 다릅니다:
파일에서의 위치: Offset
파일에서는 각 요소의 위치를 파일의 시작부터의 오프셋으로 표현합니다.
메모리에서의 위치: Virtual Address (VA)
메모리에 로드된 후에는 각 요소의 위치를 가상 주소로 표현합니다.
File on Disk:
[PE Header] [.text] [.data] [.rdata] ...
Memory Image:
[PE Header] [.text] [...] [.data] [...] [.rdata] ...
메모리에 로드될 때, 섹션들은 재배치되며 각 섹션 사이에 여유 공간이 생길 수 있습니다.
PE 파일의 각 섹션은 특정 단위로 정렬됩니다:
Section on Disk: [...Data...][Padding]
Section in Memory: [...Data...][Padding][................]
PE 헤더의 끝과 각 섹션의 끝에 null padding 영역이 있습니다.
이는 최소 기본 단위를 채우기 위함입니다.
VA(Virtual Address)와 RVA(Relative Virtual Address)에 대한 자세한 내용은 이곳을 참조하세요. ()
1. DOS 헤더
2. DOS Stub
3. NT 헤더
4. NT 헤더 - File header
5. NT 헤더 - Optional header
6. 섹션 헤더
각 헤더의 세부 내용은 다음 포스팅에서 자세히 다루도록 하겠습니다.