본문 바로가기
정상을향해/Program Analysis

PE File Format (1)

by 사이테일 2013. 11. 10.

출처 : http://www.reversecore.com

 

 

PE(Portable Executable) File Format

 

PE 파일의 종류는 다음과 같다.

 

∙ 실행 파일 계열 : EXE, SCR

∙ 라이브러리 계열 : DLL, OCX

∙ 드라이버 계열 : SYS

∙ 오브젝트 파일 계열 : OBJ

 

엄밀히 따지자면 OBJ(오브젝트) 파일을 제외한 모든 파일들은 실행가능한 파일이다.

 

DLL, SYS 파일 등은 쉘(Explorer.exe)에서 직접 실행 할 수는 없지만,

다른 형태의 방법(디버거, 서비스 등)을 이용하여 실행이 가능한 파일들이다.

 

간단한 설명을 위해 메모장(notepad.exe) 파일을 hex editor를 이용해 열어보자.

 

 

위의 그림은 notepad.exe 파일의 시작 부분이며, PE header 부분이다.

 

PE header notepad.exe 파일이 실행되기 위한 모든 정보가 기록되어 있다.

 

어떻게 메모리에 적재되고, 어디서부터 실행되어야 하며, 실행에 필요한 DLL들은 어떤 것들이 있고,

필요한 Stack Heap 메모리의 크기를 얼마로 할 것인지 등,

 

수 많은 정보들이 PE header구조체 형식으로 저정되어 있다.

 

, PE File Format을 공부한다는 것은 PE header 구조체를 공부한다는 것과 같은 말이 된다.

 

 

 

Basic Structure

 

다음은 일반적인 PE File의 기본 구조이다. (notepad.exe)

 

 

<Fig. 2> notepad.exe 파일이 메모리에 적재(loading or mapping)될 때의 모습을 나타낸 그림이다.

 

DOS header 부터 Section header 까지를 PE Header, 그 밑의 Section 들을 PE Body 라고 한다.

∙ 파일에서는 offset 으로, 메모리에서는 VA(Virtual Address) 로 위치를 표현한다.

파일이 메모리에 로딩되면 모양이 달라진다. (Section의 크기, 위치 등)

∙ 파일의 내용은 보통 코드(".text" 섹션), 데이터(".data" 섹션), 리소스(".rsrc") 섹션에 나뉘어서 저장된다.

 - 반드시 그런것은 아니며 개발도구(VB/VC++/Delphi/etc)와 빌드 옵션에 따라서 섹션의 이름, 크기, 개수, 저장내용 등은  달라진다. 중요한 것은 섹션이 나뉘어서 저장 된다는 것!

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

PE Header의 끝부분과 각 Section들의 끝에는 NULL padding 이라고 불리는 영역이 존재한다.

 - 컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해 최소 기본 단위 개념을 사용하는데, PE 파일에도 같은 개념이 적용된 것이다.

∙ 파일 / 메모리에서 섹션의 시작위치는 각 파일 / 메모리의 최소 기본 단위의 배수에 해당하는 위치여야 하고, 빈 공간은 NULL로 채운다.

  - <Fig. 2>를 보면 각 섹션의 시작이 딱딱 끊어지는 것을 볼 수 있다.

 

 

 

VA & RVA


VA (Virtual Address) : 프로세스 가상 메모리의 절대 주소

RVA (Relative Virtual Address) : 어느 기준위치(ImageBase) 에서부터의 상대 주소

 

VA RVA 의 관계는 아래 식과 같다.

 

RVA + ImageBase = VA

 

PE header 내의 많은 정보는 RVA 형태로 된 것들이 많다.

그 이유는 PE 파일(주로 DLL)이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간 이미 그 위치에 다른 PE 파일(DLL) 이 로딩 되어 있을 수 있기 때문이다.

 

위와 같은 상황이 발생했을 시 재배치(Relocation) 과정을 통해서 비어 있는 다른 위치에 로딩되어야 하는데,

만약 PE header 정보들이 VA (Virtual Address - 절대주소)로 되어 있다면 정상적인 엑세스가 이루어질 수 없다.

 

정보들이 RVA (Relative Virtual Address - 상대주소) 로 되어 있으면 Relocation 이 발생하더라도

기준위치에 대한 상대주소는 변하지 않기 때문에 아무런 문제없이 원하는 정보에 엑세스 할 수 있게 된다.


'정상을향해 > Program Analysis' 카테고리의 다른 글

PE File Format (4)  (0) 2013.11.10
PE File Format (3)  (0) 2013.11.10
PE File Format (2)  (0) 2013.11.10
Calling Convention  (0) 2013.11.10
Stack Frame  (0) 2013.11.10
IA-32 Register  (0) 2013.11.10