📌 PE 재배치란?
PE 파일이 ImageBase에 로딩되지 못하고 다른 주소에 로딩될 때 수행되는 일련의 과정

📌 동작 원리
- 프로그램에서 하드코딩된 주소 위치를 찾는다.
- 하드코딩된 주소들의 offset을 모아놓은 Base Relocation Table을 확인한다.
- Base Relocation Table = DataDirectory[5]

- reloc Section Header에서
VA와 PointertoRawData를 구해서 RAW를 구하면 2F000-2F000+2AE000=2AE000이고 실제 BASE_RELOCATION 주소를 보면 아래와 같다.

- 예를 들어 2AE08의 3420의 값을 이용하여 찾아보면,
offset은 하위 12비트의 값이므로 420이 offset이다.
따라서 VirtualAddress(1000) + Offset(420) = 1420(RVA)이다.
- 이 주소에 가서 확인해 보면 아래와 같다.

- 값을 읽은 후 ImageBase만큼 뺀다 (VA --> RVA)
- 010010C4 - 01000000 = 000010C4
- 실제 로딩 주소를 더한다.(RVA --> VA)
- 000010C4 + 00FF0000 = 00AF10C4

📌 .reloc 제거하기
📢 필요 과정
-
.reloc Section Header 정리

-
.reloc 섹션 제거
HxD를 이용하여 0000C000 이후 영역은 모두 삭제
-
IMAGE_FILE_HEADER의 NumberOfSections 항목 변경

-
IMAGE_OPTIONAL_HEADER의 SizeOfImage 항목 변경

이 과정을 진행하면 정상적으로 작동하는 것을 알 수 있다.