PE Format Reference
Windows PE 파일 형식 레퍼런스
PE Format Reference 소개
PE 파일 포맷 레퍼런스는 Windows 실행 파일(.exe), 동적 링크 라이브러리(.dll), 드라이버(.sys)에 사용되는 Portable Executable 포맷의 구조를 체계적으로 정리한 검색 가능한 가이드입니다. MZ/DOS 헤더, COFF 파일 헤더, ImageBase와 EntryPoint를 포함한 Optional Header, 데이터 디렉토리, 주요 섹션 타입을 모두 다룹니다.
Import Directory Table, Import Address Table(IAT), Import Name Table(INT), 이름/오디널 기반 Export Directory, 익스포트 포워딩, RT_VERSION 및 RT_MANIFEST를 포함한 리소스 디렉토리 트리 구조까지 상세히 설명합니다.
리버스 엔지니어, 악성코드 분석가, 보안 연구자를 위해 각 항목에 C 구조체 정의, 오프셋 값, pefile Python 코드 예제를 포함하여 실무에 바로 활용할 수 있도록 구성했습니다. Rich Header, PDB 디버그 경로, 바인드 임포트 등도 함께 다룹니다.
주요 기능
- DOS MZ 스텁부터 Optional Header, Data Directory까지 PE 헤더 전체 계층 구조
- .text, .data, .bss, .rdata, .rsrc 섹션의 특성 플래그와 역할 설명
- IAT, INT, 바인드 임포트 상세 설명 및 pefile Python 열거 코드
- 이름/오디널 익스포트와 DLL 포워딩 메커니즘을 포함한 Export 테이블 레퍼런스
- RT_VERSION, RT_MANIFEST 예제를 포함한 리소스 디렉토리 3단계 트리 구조
- PDB 경로 추출과 Rich Header 디코딩을 포함한 디버그 디렉토리 항목
- 헤더, 섹션, 임포트, 익스포트, 리소스, 디버그 카테고리별 키워드 검색 지원
- 모든 항목에 실용적인 C 구조체 정의와 Python pefile 코드 스니펫 제공
자주 묻는 질문
PE 파일 포맷이란 무엇인가요?
Portable Executable(PE) 포맷은 Windows 환경의 실행 파일, DLL, 오브젝트 코드에 사용되는 표준 파일 형식입니다. 오프셋 0x00의 DOS MZ 헤더로 시작하여 PE 시그니처, COFF 파일 헤더, Optional Header, 섹션 테이블, 섹션 데이터로 구성됩니다. 이 레퍼런스는 각 구성 요소를 구조체 정의와 필드 수준까지 상세히 설명합니다.
PE 헤더 오프셋을 바이너리에서 어떻게 찾나요?
DOS 헤더의 e_lfanew 필드(오프셋 0x3C)에 PE 시그니처("PE\0\0", 0x50450000)에 대한 4바이트 포인터가 저장되어 있습니다. 그 다음에 COFF File Header, 그리고 ImageBase, AddressOfEntryPoint, Data Directory 배열을 포함한 Optional Header가 이어집니다.
IAT(Import Address Table)는 어떻게 동작하나요?
IAT는 Windows 로더가 런타임에 임포트된 DLL에서 해석한 실제 함수 주소로 채웁니다. 로딩 전에는 Import Name Table(INT)과 동일한 내용을 가집니다. Import Directory Table이 각 DLL 이름을 OriginalFirstThunk(INT)와 FirstThunk(IAT) 배열에 연결합니다. Python pefile의 pe.DIRECTORY_ENTRY_IMPORT로 임포트를 열거할 수 있습니다.
PE32와 PE32+(64비트) 파일을 어떻게 구분하나요?
Optional Header의 Magic 필드로 구분합니다. 0x10B이면 PE32(32비트), 0x20B이면 PE32+(64비트)입니다. COFF File Header의 Machine 필드로 아키텍처를 추가 확인할 수 있으며, 0x14C는 x86, 0x8664는 x64를 나타냅니다.
PE 파일의 주요 섹션 이름과 용도는 무엇인가요?
.text 섹션은 IMAGE_SCN_MEM_EXECUTE 플래그가 있는 실행 코드를 담습니다. .data 섹션은 초기화된 전역/정적 변수, .bss는 초기화되지 않은 데이터, .rdata는 임포트/익스포트 디렉토리를 포함한 읽기 전용 데이터, .rsrc는 아이콘, 버전 정보, 매니페스트 등의 리소스를 저장합니다.
PE 파일에서 버전 정보를 어떻게 추출하나요?
버전 정보는 .rsrc 섹션의 RT_VERSION 리소스 타입에 저장됩니다. FileVersion, ProductVersion이 포함된 VS_FIXEDFILEINFO와 CompanyName, FileDescription 등의 메타데이터가 포함된 StringFileInfo로 구성됩니다. pefile 등의 도구로 자동 파싱이 가능합니다.
익스포트 포워딩이란 무엇인가요?
익스포트 포워딩은 DLL이 함수를 직접 구현하지 않고 다른 DLL로 리다이렉트하는 기능입니다. 예를 들어 kernel32.dll이 HeapAlloc을 NTDLL.RtlAllocateHeap으로 포워딩합니다. 포워딩된 익스포트의 AddressOfFunctions 항목에는 코드 대신 "DLL.함수명" ASCII 문자열의 RVA가 들어있습니다.
Python으로 PE 파일을 프로그래밍 방식으로 분석하려면 어떻게 하나요?
pefile 라이브러리가 PE 분석의 표준 Python 도구입니다. pe = pefile.PE("sample.exe")로 파일을 로드한 후 pe.OPTIONAL_HEADER.ImageBase, pe.OPTIONAL_HEADER.AddressOfEntryPoint, pe.sections로 섹션 열거, pe.DIRECTORY_ENTRY_IMPORT로 임포트 목록을 확인할 수 있습니다. 이 레퍼런스 전체에 pefile 예제가 포함되어 있습니다.