PE(Portable Executable) 파일


PE 파일에 대해서 알아보겠습니다.

​
PE 파일은 윈도우 운영체제에서 실행 가능한 파일을 말합니다.
'.acm', '.ax', '.cpl', '.dll', '.drv', '.efi', '.exe', '.mui', '.ocx', '.scr', '.sys', '.tsp' 등이 있습니다.
​
​
파일 내부를 보게 되면, 대부분 'MZ'와 'This program cannot be run in DOS mode'라는 글자가 나타납니다.
그리고 아래에 'PE'라는 글자가 있습니다.











Section은 9 가지가 있습니다.
.text, .bss, .rdata, .data, .rsrc, .edata, .idata, .pdata, .debug


Executable Code Section: .text
Data Section: .data, .rdata, .bss
Export Data Section: .edata
Import Data Section: .idata
Debug Information Section: .debug


그리고 실행 시, 물리 주소에서 빈 공간을 뽑아 가상주소를 만듭니다.
이때, VA와 RVA로 나뉩니다.
VA는 가상 주소의 절대값이고, RVA는 가상 주소의 상대값입니다.
​


OS는 Page Table을 만들어, 물리 주소와 가상 주소를 관리합니다.
Page Table을 만들면, 각 섹션이 독립적일 수 있고, 섹션이 깨끗한 Page에서 시작할 수 있습니다.
그리고, 섹션이 작동하지 않을 때에는 HDD에 임시 저장을 할 수 있어, RAM의 한계를 늘려줍니다.




File Offset 구하는 법은 다음과 같습니다.
File Offset = RVA - VirtualAddress + PointerToRawData입니다.
시작 주소가 70000000이고, 데이터의 주소가 70002000이면, RVA는 2000입니다.
여기서, VirtualAddress가 100(메모리에서 해당 섹션 시작 주소), PointerToRawData이 400(파일에서 해당 섹션 시작 주소)이라고 그냥 가정하고 File Offset을 구해보면 다음과 같습니다.
File Offset = 2000 - 100 + 400입니다.
File Offset = 2300

만약, File Offset 값이 파일 섹션 위치와 메모리 섹션 위치가 다르다면, 정의할 수 없게 됩니다.
(예를 들어, 메모리 섹션 위치는 .text인데, 구해본 File Offset의 위치가 .data인 경우)
​
​




DOS header부터 NT header까지를 PE Header,
Section 부분을 PE Body라고 부릅니다.
​
​PE 파일이 메모리(ROM)에 있을 때를 PE Image라고 부릅니다.
​
끝.




카테고리: Reversing

댓글

이 블로그의 인기 게시물

KiCad 시작하기 7 (FreeRoute 사용하기 2)

일본어 문장부호

KiCad 시작하기 3 (새로운 소자 추가하기)

Python urllib.parse.quote()

음악 총보(Score), 파트보(Part)

Forensics .pyc 파일 .py로 복구하기

KiCad 시작하기 2 (PCB 만들기)

Hand Counter App

KiCad 시작하기 6 (FreeRoute 사용하기 1)

RFC 9421