PE파일 종류:

 실행 계열 

 exe, scr 

 드라이버 계열 

 sys,vxd 

 라이브러리 계열 

 dll, ocx, cpl, drv 

 오브젝트 파일 계열 

 obj 


기본구조:

DOS header부터 Section header까지 PE 헤더 그 밑의 Section들을 합쳐 PE 바디

파일에서는 offset, 메모리에서는 VA로 위치표현


PE 헤더의 끝부분과 각 세션의 끝에는 NULL padding이 존재


VA와 RVA:

VA는 가상메모리의 절대주소

RVA는 상대주소


RVA + ImageBase = VA


DOS Header:

PE 헤더의 앞부분에 DOS EXE Header를 확장시킨 IMAGE_DOS_HEADER 구조체존재


IMAGE_DOS_HEADER 구조체 크기 : 40

e_magic : DOS signature (4D5A = "MZ")

e_lfanew : NT header의 옵션 표시


DOS Stub:

DOS Stub은 DOS Header 밑에 존재

존재여부는 옵션 크기도 일정하지않음

16비트 어셈블리 명령어기 때문에 Windows OS에서는 실행되지않음

DOS환경이나 DOS용 디버거를 이용하면 가능


NT Header:

-IMAGE_NT_HEADERS

IMAGE_NT_HEADERS 구조체는 3개의 멤버로 구성

-Signature 

50450000h("PE"00)의 값을 가짐


-File Header

파일의 개략적인 속성을 나타는 IMAGE_FILE_HEADER 구조체

-Machine

Machine 넘버는 CPU별로 고유한값이다

-NumberOfSections

섹션의 개수, 반드시 0보다 커야한다

-SizeOfOptionalHeader

IMAGE_OPTIONAL_HEADER32의 구조체 크기를 나타낸다

-Chearacteristics

파일의 속성을 나타낸다, bit OR형식으로 조합


-Optional Header

PE 헤더중에서 크기가 가장큰 IMAGE_OPTIONAL_HEADER32 구조체

-Magic

Magic 넘버는 IMAGE_OPTIONAL_HEADER32 구조체에서 10B

IMAGE_OPTIONAL_HEADER64 구조체에서는 20B 값을 가진다


-AddressOfEntryPoint

AddressOfEntryPoint는 EntryPoint의 RVA값을 가진다


-ImageBase

PE 파일이 로딩되는 시작주소

EXE, DLL파일은 user memory 영역 0~7FFFFFFF

SYS 파일은 kernel memory 영역 80000000~FFFFFFFF

일반적인 개발도구가 만들어내는 EXE파일의 Image base값은 00400000, DLL 파일은 10000000이다

PE 파일을 실행하면 EIP 값을 ImageBase + AddressOfEntryPoint로 지정


-SectionAlignment, FileAlignment

PE 파일의 바디 부분은 섹션으로 나뉘어져있다

각각 메모리와 파일의 최소단위값이다


-SizeOfImage

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

일반적으로 파일의 크기와 메모리에 로딩된 크기는 다르다


-SizeOfHeader

PE 헤더의 전체 크기를 나타낸다

파일 시작에서 SizeOfHeader 만큼 떨어진 위치에 첫번째 섹션이 위치


-Subsystem

Subsystem값을 보고 실행파일, 시스템 드라이버 파일인지 구분가능

 1 

 Driver file 

 시스템 드라이버(ntfs, sys) 

 2 

 GUI 

 창 기반 애플리케이션 

 3 

 CUI 

 콘솔 기반 애플리케이션 


-NumberOfRvaAndSizes

IMAGE_OPTIONAL_HEADER32 구조체의 마지막 멤버인 DataDirectory 배열의 개수를 나타낸다

-Datadirectory

Datadirectory는 IMAGE_DATA_DIRECTORY 구조체의 배열

배열의 각 항목마다 정의된 값을 가진다











Junyoung.dev