PE 구조 - 1
PE구조 개요 (Portble Executable)
Microsoft의 운영체제 Window 3.1부터 지원되는 실행파일의 구조를 말합니다. 다양한 운영체제에서의 이식성(대대적인 개정 없이도, 하나 이상의 운영체계에서 사용될 수 있는지의 여부를 나타내는 컴퓨터 프로그램의 특성)을 보여준다는 뜻에서 이식이 가능한 실행 형식(Portble Executable)이라는 이름을 붙였습니다.
PE 파일의
계열 | 확장자 명 |
실행 파일 계열 | EXE, SCR(Screen Saver) |
라이브러리 계열 | DLL, OCX(Active X), CPL(Windows Control panel item), DRV(Device Driver) |
드라이브 계열 | SYS, VXD(Virtual Device Driver) |
오브젝트 파일 계열 | OBJ |
세부 구조
DOS Header부터 Section Header까지 PE Header이며 밑에 Section들을 합쳐서 PE Body입니다.
파일에서는 offest, 메모리에서는 VA(Virtual Address)로 위치를 표현합니다.
NULL Padding
헤더의 끝 부분과 섹션별로 사이사이에 Null 값이 존재, 파일 또는 메모리에서 섹션의 시작 위치는 각각 최소 기본 단위의 배수에 해당하는 위치여야 하므로 빈 공간은Null로 채워버림 이를 Alignment라 부르며 여러 가지 내부 연산 등 처리상의 효율성을 위해 특정 단위로 간격을 맞추며 빈 공간은 Null로 채우는 것이다.
리틀 엔디언(Little Endian) 표기법
PE에서는 리틀 엔디언 표기법을 갖습니다.
Intel 계열 CPU에서 사용하는 표기법으로 낮은 주소부터 시작하여 하위 바이트를 기록하는 것입니다.
ex) 0x075BCD15(실제 값) -> 0x15CD5B07(리틀 엔디언)
Offset, VA, RVA
offset : 파일의 첫 바이트부터 거리
VA(Virtual Address) : 프로세스 가상 메모리의 절대 주소
※ VA = RVA + ImageBase
RVA(Relative Virtual Addess) : 기준(ImageBase)으로부터 상대 주소
절대 주소와 상대 주소
PE헤더 내의 정보는 RVA형태로 된 것이 많음 PE파일(주로 DLL)이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간 이미 그 위치에 다른 PE 파일이 로딩되어 있을 수 있음 이때 재배치(Relocation)를 통해서 비어있는 다른 자리에 로딩되어야 하는데 만약 PE헤더 정보들이 VA로 되어있다면 정상적인 액세스가 이루어지지 않는다.
현재 0x1~0x3, 0x7이 사용 중입니다 중간중간 비어있는 공간이 있습니다. 하지만 프로그램은 연속적으로 메모리를 사용해야 하기 때문에 빈 공간인0x4~0x6, 0x8~0x9를 사용하면 안 됩니다. 그래서 나온 개념이 가상 주소입니다. 프로그램은 가상 메모리인0x1~0x3, 0x4~0x5(가상)까지 접근하게 되고 운영체제는 알아서 물리적인 메모리인 0x4~0x6, 0x8~0x9를 찾아가서 값을 읽어오게 됩니다. 한마디로 물리적인 빈 공간을 가상 주소에 연결해서 가상주소에 접근하면 운영체제가 알아서 가상 주소와 연결된 물리 주소를 찾아가서 값을 읽어 옵니다. 가상 주소는 0x0~0xFFFFFFFF까지이며 프로그램은 4byte 메모리를 사용해야 합니다.