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 구조체의 배열
배열의 각 항목마다 정의된 값을 가진다
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 구조체의 배열
배열의 각 항목마다 정의된 값을 가진다