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

댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python OpenCV 빈 화면 만들기

tensorflow tf.random.uniform()

Android Notification with Full Screen

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

Android Minimum touch target size

Python bs4.SoupStrainer()

KiCad 시작하기 4 (기존 회로도 수정 및 추가)

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

tensorflow tf.expand_dims()