DXE 모듈 구조 학습
UEFI PE/COFF 개요 정리
필요한 샘플 바이너리 수집 (OVMF)
dxe 모듈 구조

DXE (Driver Execution Environment)의 구조 자체는
code, data, reloction section으로 구분된다.( https://patents.google.com/patent/EP2047364A1/en)
모듈의 실행 부분은
PE/COFF 포맷(32비트는 PE32, 64비트는 PE32+)으로 구성되어 있고,
PE는 FV(Firware Volume) 안의 FFS 파일 형태로 들어간다.
FFS는 PE32(64bit에서는 PE32+, 이미지와 출처 같음) + DEPEX( 의존성)으로 구성되어 있다.
UEFI PE/COFF
UEFI의 PE(Portable Executable)과 COFF(Common Object File Format)는 기반이 되는 구조로써,
UEFI이미지에는 PE/COFF 헤더가 포함되어 있다.
PE는 일반적으로 알고 있는
.acm, .ax, .cpl, .dll, .drv, .efi, .exe, .mui, .ocx, .scr, .sys, .tsp 형태의 실행파일들이고,
COFF는
none, .o, .obj 형태의 파일이다.
PE 파일은 동적 링커에게 파일을 메모리에 매핑하는 것을 설명하는 헤더로 구성되어 있다.

PE헤더
DXE가 PE로 구성되어 있기에 PE와 PE헤더에 대해서 더 알 필요가 있다고 판단하였다.
(https://soyammou.tistory.com/24 참고)

IMAGE_DOS_HEADERS
e_magic : 4D 5A(MZ)인지 확인하는 파트, 불일치할 시 실행하지 않는다.
... : 파일 마지막 페이지의 크기, 파일의 페이지, 최대/최소 파라그래프 등의 정보가 들어감(e_aaa의 형태)
e_ifanew : PE HEADER의 시작 ~ PE SIGNATURE(위의 e_magic과 동일)까지의 offset

WORD == 2byte
DWORD == 4byte
LONG == 4byte(32bit), 8byte(64bit)
MS DOS Stub HEADERS
Dos헤더 바로 아래에 존재하며, 반드시 필수는 아닌 아니다(∴ 크기도 일정하지 않다)
특정 DOS에서는 실행될 수 없다는 내용 등을 알리기 위해서 존재하는 부분이다.
위의 IMAGE_DOS_HEADERS와 합쳐서 DOS header라고 총칭한다.
IMAGE_NT_HEADERS
NT헤더는 아래의 두 헤더 외에도 가장 먼저 signature를 가진다.
이때 해당 signature 값은 50 45 (PE)이다.
IMAGE_FILE_HEADERS
구성 요소는 아래와 같다
1. Machine
cpu 고유 값
2. NumberOfSections
코드, 데이터, 리소스등이 저장되는 섹션의 개수( > 0)
3. DWORD TimeDateStamp
IMAGE_OPTIONAL_HEADERS의 크기를 담고 있다. PE로더가 해당 부분을 통해 크기를 추정함
헤더이름: IMAGE_OPTIONAL_HEADER32(32bit), IMAGE_OPTIONAL_HEADER64(64bit)
4. DWORD PointerToSymbolTable
파일의 속성을 bit OR로 조합(실행 가능 형태 여부, DLL인지 etc)
IMAGE_OPTIONAL_HEADERS
1. Magic
0x10B(32bit)
0x20B(64bit)
2. AddressOfEntryPoint
EP(Entry Point) 의 RVA(Relative Virtual Address) 값을 가짐
- RVA값이기 때문에 실제 EP의 VA(실제 주소)는 AddressOfEntryPoint+ImageBase
- PE로더는 파일을 메모리에 올리고 EIP를 AddressOfEntryPoint+ImageBase로 설정
3. ImageBase
메모리에 로딩되는 시작 주소
4. SectionAlignment
메모리에서 섹션 최소 단위를 나타내는것
5. FileAlignment
파일에서 섹션의 최소 단위를 나타내는것
파일/메모리의 섹션 크기는 반드시 각각 FileAlignment/SectionAlignment 의 배수가 되어야 함
6. SizeOflmage
PE파일이 메모리에 로딩됐을 때 가상 메모리(VA)에서 PE Image(PE구조)가 차지하는 크기
7. SizeOfHeader
PE header 의 전체 크기를 나타냅니다.
8. Subsystem
파일의 타입을 나타냄
1 : Driver file
2 : GUI file
3 : CUI file
.text, .data는 실행 코드와 전역변수를 담고 있는 부분으로 이 정보들이 IMAGE_FILE_HEADERS의 NumberOfSections에 들어가는 것으로 보인다.
PEview
UEFI Tool
https://www.dell.com/support/product-details/ko-kr/product/xps-15-9560-laptop/drivers