튜기's blogggg

PE파일에서 .reloc섹션을 제거하기

by St1tch

EXE형식의 PE파일에서 Base Relocation Table항목은 실행에 큰 영향을 끼치지 않는다.

DLL, SYS 형식의 파일은 Base Relocation Table이 거의 필수이다.


VC++에서 생성된 PE파일의 Relocation 섹션 이름은 .reloc이다.

.reloc섹션이 제거되면 PE파일의 크기가 약간 줄어드는 효과를 볼 수 있다.


PEView와 Hex editor가지고 제거를 할 수 있다.


1 - .reloc 섹션 헤더 정리

2 - .reloc 섹션 제거

3 - IMAGE_FILE_HEADER 수정

4 - IMAGE_OPTIONAL_HEADER 수정

이 과정을 통해 제거를 할 수 있다.


#1 .reloc 섹션 헤더 정리

위의 그림에서 offset이 270인 것을 알 수 있다.

섹션헤더의 크기가 0x28이기 때문에 HxD를 이용해 이 부분을 0으로 덮어 쓴다.




블록 선택을 이용해서 270부터 28만큼 선택을 해준다.


그리고 위 그림처럼 0으로 모두 채워주었다.


#2 .reloc 섹션 제거

첫 번째 그림의 6번째 항목을 보면 .reloc섹션의 시작 offset이 C000이다.

.reloc은 마지막에 있기 때문에 이곳부터 파일 끝까지가 .reloc 섹션 영역이다.


이 부분을 제거 해버리면 된다.

이 부분을 제거한다고 해서 실행이 되지는 않는다. 이와 관련된 PE헤더 정보를 수정해야한다.



#3 IMAGE_FILE_HEADER 수정


이 부분에서 섹션의 개수가 5개로 되어있는데 .reloc섹션을 제거 했기 때문에 4개로 바꿔야 한다.



요롷게 4로 수정을 해주면 된다.


#4 IMAGE_OPTIONL_HEADER 수정

.reloc 섹션이 제거되면서 섹션 크기만큼 이미지 크기가 줄어 들었다.

따라서 이미지 크기를 수정해야 하는데  IMAGE_OPTIONL_HEADER - Size of Image값에 크기가 명시되어 있다.


이제 크기를 알았는데 .reloc의 크기가 얼마 인지 모른다.


첫 번째 그림에서 Size of Raw Data의 값(파일에서 섹션이 차지하는 크기)이 1000이다.

따라서 Size of Image의 값을 1000빼줘야 한다.


 

이렇게 수정을 해주면 된다.





이 과정을 통해 수정을 마치면 .reloc섹션이 제거되더라도 정상적으로 실행이 가능하다.






블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기