Image Base Relocation

기준재배치..(exe파일은 예외)

pe파일이 메모리에 로드될 경우 .exe파일의 경우 가장 먼저 로드될 것이기 때문에 원하는 번지(0x00400000)에 로드될 수 있다.
하지만 .dll일 경우 하나의 실행파일에 여러개의 dll이 로드될 수 있으므로 원하는 번지(0x01000000)에 로드되긴 어렵다.
그럴때를 위해 pe파일에는 relocation정보를 담아두고 로드되기 원하는 번지와 실제 로드된 번지의 차이인 delta를 기준으로
재배치를 수행하게 된다.

이 재배치 정보는 IMAGE_OPTIONAL_HEADER의 Data Directory에 존재하고 인덱스값은 winnt.h에
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 라고 정의되어 있다.
또한 재배치섹션의 처음 시작정보를 담을 구조체는 아래와 같이 정의되어 있고
//
// Based relocation format.
//
typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
//  WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

위의 구조체 이후에 word데이터가 뒤따라 오게된다. 뒤따라 오는 word데이터는 상위 4bit는 타입정보를 하위 12bit는 오프셋값을 가진다.
VirtualAddress는 Rva를 담고있다. 따라서 재배치가 필요한 데이터는 (VirtualAddress + 오프셋) 한 값이 가리키는 데이터가 재배치가 필요한 값이다. (((VirtualAddress + 오프셋 이 가리키는값) - imageSize) + 실제 로드된 베이스번지) 를 하게 되면 재배치 정보고 완성되게 된다.

위의 이미지에서 빨간줄이 쳐진 부분이 바로 재배치가 필요한 부분이라 할수 있다.
예를 들자면 (앞의 주소부분+1)한 값이 재배치가 필요한 데이터를 가르키는 부분이 되겠고, 거기에 있는값이 재배치가 필요한 데이터가 되겠다.

Posted by hazeyun
,