PE 파일은 Window 운영체제에서 사용되는 실행 파일 형식이다. (리눅스 계열은 ELF..)
아래는 표로 정리한 PE파일의 종류이다.
PE파일의 종류들 | |
종류 | 주요 확장자 |
실행 계열 | EXE, SCR |
라이브러리 계열 | DLL, OCX, CPL, DRV |
드라이브 계열 | SYS, VXD |
오브젝트 계열 | OBJ |
OBJ파일을 제외한 모든 것은 실행 가능하다. DLL, SYS파일은 쉘에서 직접 실행할 수는 없지만 디버거나 서비스 등을 이용해 실행 가능하다. OBJ파일은 어떤 형태로라도 실행 불가능하다.
아래 이미지는 메모장을 HxD로 열어보았다.
PE구조로 되어있다는 것을 알 수 있다. 이것이 메모장의 시작 부분이며, PE헤더 부분이다.
PE헤더에는 파일이 실행 되기 위해 필요한 정보들이 적혀있다. 어떻게 메모리에 적재되고 필요한 DLL은 무엇인지 등.
여러가지 정보가 PE헤더에 구조체 형식으로 저장되어 있다.
아래 이미지는 PE파일이 메모리에 적재 될 때의 모습이다.
DOS header부터 Section header까지를 PE 헤더라고 하고 그 밑의 3개의 Section들을 PE 바디라고 한다.
- 파일에서는 offset으로, 메모리에서는 VA(Virtual Address, 절대주소)로 위치를 표현한다.
- 파일이 메모리에 올라가면 Section의 크기, 위치 등이 달라지게 된다.
- 파일의 내용은 코드(.text), 데이터(.data), 리소스(.rsrc) 섹션에 나뉘어서 저장된다.
Section header에 각 Section에 대한 파일/메모리에서의 크기, 위치, 속성 등이 정의되어 있다.
- NULL padding
컴퓨터에서는 파일,메모리,네트워크,패킷 등을 처리할 때 효율을 높이기위해 최소 기본단위
개념을 사용하는데 PE파일에도 같은 개념이 적용되어있다.
파일,메모리에서 섹션의 시작위치는 각 파일,메모리의 최소 기본단위의 배수에
해당해야하고 빈공간은 NULL로 딱 채웁니다.
예시) 프로그래밍한 코드가 컴파일을 했을 때 크기가 메모리 01001000에서 01001203까지 차지 한다면 섹션의 기본단위가 300바이트라고 했을 때, 나머지 97바이트의 영역에는 NULL(0) 으로 채워지는데 그 영역을 NULL Padding 영역이라 한다.
padding은 기본단위를 맞추기 위해 추가하는 dummy라고 생각하면 쉽다.
- VA & RVA
VA는 프로세스 가상 메모리의 절대주소를 말한다.
RVA는 어느 기준 위치에서부터의 상대주소를 말한다.
이 두개의 관계는 다음과 같다. (디버깅 해보면 이게 이거였구나 싶은게 있다.)
RVA + ImageBase = VA
PE헤더 안에는 RVA형태로 된 것이 많은데 이는 PE파일이 메모리에 올라가는 순간 그 위치에 다른 PE파일이 로딩 되어 있다면 재배치 과정을 거쳐서 비어있는 자리에 로딩이 되어야 하는데, 이것이 VA로 되어 있다면 메모리 위치가 겹치는 상황이 일어날 것이고 프로그램은 정상적으로 작동하지 못하게 된다.
그렇기 때문에 상대적인 경로(RVA)로 해두면 재배치 과정이 일어나도 기준위치는 변할 수 있어도 기준을 따르는 상대 주소는 변하지 않기 때문에 정상적으로 작동할 수 있다.
'윈도우 > PE 구조' 카테고리의 다른 글
PE 구조 (6) - IAT (0) | 2022.04.19 |
---|---|
PE 구조 (5) - (RVA to RAW) 예제 포함 (0) | 2022.04.05 |
PE 구조 (4) - (Section Header) (0) | 2022.04.02 |
PE 구조 (3) - (NT Header) (0) | 2022.03.31 |
PE구조 (2) - (DOS Header, DOS Stub) (0) | 2022.03.30 |
최근댓글