Windows 운영체제의 PE(Portable Executable) File Format에 대해
🤓 책 '리버싱 핵심원리'를 읽고 공부한 내용을 정리한 글입니다.
: PE(Portable Executable), Windows 운영체제에서 사용되는 실행 파일 형식
종류 | 주요확장자 |
---|---|
실행 계열 | EXE, SCR |
드라이버 계열 | SYS, VXD |
라이브러리 계열 | DLL, OCX, CPL,DRV |
오브젝트 파일 계열 | OBJ |
=> OBJ(오브젝트)파일을 제외한 모든 것은 실행 가능한 파일
(디버거, 서비스 기타 등등의 방법을 통해)
notepad.exe파일을 헥스 에디터를 이용해 열어보면 PE파일의 헤더 확인 가능
=> 실행되기 위해 필요한 정보 적혀있음
즉, PE File Format 공부 = PE 헤더 구조체 공부
VA : Virtual Address 프로세스 가상 메모리의 절대주소
RVA : Relative Virtual Address 기준 위치(ImageBase)부터의 상대주소
=> RVA로 되어 있는 경우가 많음
Relocation이 발생해도 기준위치에 대한 상대 주소 변경이 없기 때문
모든 PE파일은 시작 부분에 DOS signature ("MZ")가 존재하고 e_lfanew값이 가리키는 위치에 NT Header 구조체가 존재해야함.
=> 이 값들이 변경되면 정상 실행 되지 않음
: DOS Header 밑에 존재
ㄴ 16비트 어셈블리 명령어
-> Windows OS에서는 실행X
-> DOS 환경에서 실행하면 가능
"PE"00 값을 가짐
파일의 개략적인 속성을 나타내는 구조체
=> 이 4가지의 값들이 정확히 세팅되어 있지 않으면 정상적 실행 불가
: PE 헤더 구조체 중 가장 거대한 IMAGE_OPTIONAL_HEADER(32)
파일 실행에 필수적 값들 | |
---|---|
Magic | 32구조체 - 10B / 64구조체 20B |
AddressOfEntryPoint | EP(Entry Point)의 RVA 값, 매우 중요 |
ImageBase | PE파일이 로딩되는 시작 주소 |
SectionAlignment, FileAlignment | 메모리/파일에서 섹션의 최소단위 => 파일/메모리의 섹션 크기는 Alignment의 배수가 되어야 함 |
SizeOflmage | 가상 메모리에서 PEImage가 차지하는 크기(파일크기 =/= 메모리에 로딩된 크기 |
SizeOfHeader | PE헤더의 전체크기 (FileAlignment의 배수) |
Subsystem | |
NumberOfRvaAndSizes | DataDirectory 배열의 개수를 나타냄 |
DataDirectory | IMAGE_DATA_DIRECTORY 구조체의 배열, 각 항목마다 정의된 값을 가짐 |
: PE파일은 code data resource등을 각각의 섹션을로 나누어 저장, 섹션 헤더는 각 섹션의 속성을 정의
PE 파일이 메모리에 로딩되었을 때, 각 섹션에서 메모리의 주소와 파일 옵셋을 매핑하는 것
1. RVA가 속해있는 섹션 찾기
2. 비레씩을 사용해 파일 옵셋(RAW)계산
PAW - PointerToRawData = RVA - VirtualAddress
RQW = RVA - VirtualAddress + PointerToRawData