PE(Portable Executable)파일 포맷은 윈도우에 해당하는 파일 포맷으로 .exe, .dll, .cpl, .sys, .scr, .drv, .vxd, .ocx확장자를 가진 파일들에게서 볼 수 있다.

그림1. PE구조 구분


PE구조를 보면 IMAGE로 시작하는 구조체들을 많이 볼 수 있다. 이것은 윈도우에서 실행 파일을 IMAGE라는 명칭으로 대신하기 때문에 이름을 이렇게 지은것이다.


1. DOS 영역

윈도우 실행파일을 DOS모드에서 실행하려고 할때 사용자에게 에러 메시지를 보여주기위해 존재한다. 실제로 윈도우 실행파일을 윈도우에서 실행할 때는 아무런 영향을 주지 않는 부분이다. 


1.1. DOS MZ Header

이 영역은 WinNT.h 헤더파일에 정의되어 있으며, 여기서 중요한 구조체 멤버는 e_magic과 e_lfanew 구조체 멤버이다. 

※e.magic : 이 구조체 멤버는 DOS MZ Header의 맨 앞(PE 파일 맨 앞)을 나타낸다. 16진수 '0x4D, 0x5A' 값을 가지고 아스키 코드로 변환하면 'MZ'라는 값을 가진다. MZ는 도스를 최초로 개발한 Mark Zbikowksi의 이니셜이다.

※e.lfanew : 이 구조체 멤버는 PE파일의 머리인 IMAGE_NT_HEADER를 가리키는 오프셋 값을 가지고 있다.


그림2. e.magic이 가리키는 PE포맷 시작 OFFSET


그림3. notepad.exe의 DOS MZ HEADER 영역


이 두 값(e.magic, e.lfanew)값만 올바르다면 프로그램을 실행하는데 문제가 없다.


1.2. DOS Stub Program

이 부분은 사용자가 DOS 모드에서 윈도우용 실행파일을 실행했을 때 아래와 같은 문구를 출력해주기 위한 코드가 있는 부분이다.

'This Program cannot be run is DOS mode'


그림4. notepad.exe의 DOS Stub Program부분


2. PE Header 영역

PE Header 영역은 PE 파일의 시작 부분이라고 할 수 있다. PE Header 영역에는 그림.1 과 같이 PE File Signature, PE File Header, PE File Optional Header 영역이 있다. PE Header 영역은 IMAGE_NT_HEADERS 구조체로 이루어져 있다.


2.1. PE File Signature

이 영역은 DOS의 e.magic 구조체 멤버처럼 PE영역의 시작을 알리는 값을 가지고 있는 영역이다. 모든 파일에서 그 값은 항상 동일하며 그 값은 'PE/0/0(0x50/0x45/0x00/0x00)'이다. Signature 값도 중요한 정보이니 무시하면 안된다.


그림5. notepad.exe의 PE File Signature


그림.2에서 설명한 DOS MZ HEADER 영역의 e.lfanew 구조체 멤버가 IMAGE_NT_HEADER의 주소를 가지고 있다고 한 내용을 다시한번 기억하자!.


2.2. PE File Header

이 영역은 실행 파일 자체의 메타데이터를 가지고 있으며, 길이는 20바이트이다. 구조체는 IMAGE_FILE _HEADER 구조체를 사용한다.

※메타데이터 : 데이터에 대한 데이터 예를 들면 사진파일의 해상도, 사진크기등등..


그림6. notepad.exe의 IMAGE_FILE_HEADER 부분


각 Description항목들이 무엇을 의미하는지 살펴보자. 이 부분은 IMAGE_FILE_HEADER 구조체 정보와 일치한다.


(1) Machile : 실행 파일이 사용하는 CPU를 나타내는 번호를 가지고 있다. 그림6 에서는 'IMAGE_FILE_MACHINE_i386'이라고  되어 있다. 이 내용을 포함한 다른 목록들을 보자.


그림7. Machine 목록


이 외에도 많지만 나름 생각대로 대표적이라 생각되는 CPU만 작성 하였다.


(2) Number of Sections(NoS) : 실행파일이 가지고 있는 섹션의 개수를 의미한다. 섹션을 삭제, 추가하면 이 구조체의 값도 변경해 주어야 한다. 그림6에서는 4개 인것을 확인 할 수 있다.


(3) Time Data Stamp : 실행파일이 컴파일된 시간. 그림6에서는 '2009/7/13 23:41:03 UTC'의 시간을 나타내고 있다.


(4) Pointer To Symbol Table(PTST) : COFF심볼 파일의 오프셋을 값으로 가지고 있다. 컴파일러에 의해 생성된 OBJ파일이나 디버그 모드로 만들어 져서 COFF 디버그 정보를 가진 PE파일에서만 사용된다. COFF  심볼테이블은 이제 더이상 사용하지 않아  값은 항상 0으로 설정되어야 한다.

※COFF(Common Object File Format) : 공동 개체 파일 Windows NT 실행 파일 (이미지) 파일 및 개체 파일에 대 한 특수 서식. PE포멧이 COFF기반으로 나온것이다. 


(5) Number Of Symbols(NoS) : 심볼 테이블에 있는 엔트리 개수를 나타내며, COFF 심볼테이블은 사용하지 않으므로 0으로 설정되어야 한다.


(6) Size Of Optional Header(SOOH) : Optional Header의 크기르르 값으로 가지고 있다. 이 값은 실행파일에서만 필요하다. 일반적으로 32bit 시스템은 'E0'의 값을 가진다.


(7) Characteristics(Char) : 파일의 속성을 결정한는 값을 가지고 있다. 해당 값은 'http://www.reversecore.com/20'을 참조 하길 바란다.


2.3 Relative Virtual Address(RVA)

실행파일이 프로세스를 만들고 실행파이릐 코드와 데이터가 가상메모리에 올라가게 되면 메모리에 올라오는 지점의 시작주소가 베이스 주소가 된다. Relative Virtual Address는 이 가상 메모리상의 베이스 주소를 기준으로 로드된 실행 파일의 상대적 위치를 나타낸다. 가상메모리에서의 가상주소는 다음과 같다.


가상 주소 = 베이스 주소(Base Address) + Relative Virtual Address


PE 파일상의 오프셋과는 다르다. Relative Virtual Address는 가상 메모리에 올라온 이후의 오프셋 값이다.


'Forensic' 카테고리의 다른 글

하드디스크 데이터 수집  (0) 2015.01.12
하드 디스크 숨김 영역  (0) 2015.01.12
가상 메모리 구조  (0) 2015.01.05
슬랙공간이란?  (0) 2014.11.26
윈도우 부팅 절차  (0) 2014.11.25

+ Recent posts