👷 Coming Soon!

현재 열심히 글을 쓰고 있어요. 조금만 기다려주세요!

😀정의

PE파일Windows 운영체제에서 사용되는 실행 파일 형식이다. 기존 UNIX에서 사용되는 COFF를 기반으로 Microsoft에서 만들었다. 애초에는 다른 운영체제에 이식성을 좋게 하려는 의도였으나 실제로는 Windows 계열의 운영체제에서만 사용되고 있다. PE파일은 32비트 형태의 실행파일을 의미하며 PE32라는 용어를 사용하기도 한다. 64비트 형태의 실행파일은 PE+또는 PE32라고 부르며 PE파일의 확장형태이다.(PE64와는 별개이다!)


PE파일의 종류는 아래와 같다.


종류 주요확장자 종류 주요확장자
실행계열 EXE, SCR 드라이버 계열 SYS, VXD
라이브러리 계열 DLL, OCX, CPL, DRV 오브젝트 계열 OBJ



🙂기본구조

DOS Header부터 Section header 까지를 PE 헤더, 그 밑의 Section들을 합쳐서 PE 바디 라고 한다. 파일에서는 offset으로 메모리에서는 VA로 위치를 표현한다. 파일이 메모리에 로딩되면 모양이 달라진다.

섹션 헤더에 각 Section에 대한 파일/메모리 에서의 크기, 위치, 속성 등이 정의되어 있다.

PE헤더의 끝부분과 각 섹션의 끝에는 NULL padding 이라고 불리우는 영역이 존재한다.

컴퓨터에서의 파일, 메모리, 네트워크 패킷등을 처리할 때 효율을 높이기 위해 최소 기본단위 개념을 사용하는데, PE 파일에도 같은 개념이 적용된 것이다. 파일/메모리 에서 섹션의 시작 위치는 각 파일/메모리의 최소 기본단위 배수에 해당하는 위치여야 하고 빈공간은 NULL로 채워버린다.

PE구조



😵 VA(Virtual Address) & RVA(Relative Virtual Address)

VA(Virtual Address)는 프로세스 가상 메모리의 절대주소를 말하며, RVA(Relative Virtual Address)는 어느 기준 위치(ImageBase)에서 부터의 상대주소를 말한다. VA와 RVA의 관계는 다음 식과 같다.


RVA + ImageBase = VA


PE헤더 내의 정보는 RVA형태로 된 것이 많다. 그 이유는 PE파일(주로 DLL)이 프로세스 가상메모리의 특정 위치에 로딩되는 순간 이미 그 위치에 다른 PE 파일이 로딩되어 있을수 있다. 그럴 때 재 배치과정을 통해서 비어있는 다른위치에 로딩되어야 하는데 만약 PE 헤더 정보들이 VA로 되어있다면 정상적인 엑세스가 이루어지지 않을 것이다. 그러므로 정보를 RVA로 해두면 Relocation이 발생해도 기준 위치에 대한 상대주소가 변하지 않기 때문에 아무런 문제없이 원하는 정보에 엑세스 가능하다.


👨‍💻섹션의 종류

1. .text

코드 섹션으로써 프로그램을 실행하기 위한 코드를 담는 섹션

2. .data

데이터 섹션으로써 초기화된 전역 변수들을 담고 있는 읽고 쓰기가 가능한 섹션 64bit에서는 PE 파일에서부터 .bss섹션(초기화 되지 않은 공간)과 .data섹션에 병합됨

3. .rsrc

리소스 섹션으로써 대화상자, 아이콘 등 윈도우 PE 파일이 담고있는 리소스 관련 데이터를 담은 섹션

4. .rdata

읽기전용 데이터 섹션으로써 문자열 상수나 C++ 가상 함수 테이블(vftable) 등을 배치 코드 상에 참조하는 읽기 전용 데이터도 이 섹션에 포함