실행파일에서 .reloc 섹션 제거하기
PE 파일에서 .reloc 섹션을 수동으로 제거하는 실습을 해보자. 본 실습을 통해 PE File Fomat에 대한 이해가 깊어지고 Hex Editor 등의 툴을 사용하는데 익숙해질 것이다.
1. reloc 섹션
EXE형식의 PE 파일에서 Base Relocation Table항목은 실행에 큰 영향을 끼치지 않는다. 실제로 제거 후 실행 테스트를 해보면 정상적으로 실행이 잘 된다. (DLL, SYS형식의 파일은 BASE Relocation Table이 거의 필수적이다.)
VC++에서 생성된 PE 파일의 Relocation 섹션 이름은 ',reloc'이다. .reloc섹션이 제거되면 PE 파일의 크기가 약간 줄어드는 효괄르 볼 수 있다.(실제로 이런 유틸리티도 있다.) .reloc 섹션은 보통 마지막에 위치하는데 이렇게 마지막에 위치한(사용되지 않는)섹션을 제거하는 것 생각보다 어렵지 않다. PE View와 Hex editor만 가지고 충분히 할 수 있다.
2. reloc.exe
.reloc 섹션을 정확히 제거하려면 다음과 같은 작업을 거쳐야 한다.
1단계 - .reloc 섹션 헤더 정리
2단계 - .reloc 섹션 제거
3단계 - IMAGE_FILE_HEADER 수정
4단계 - IMAGE_OPTIONAL_HEADER 수정
차례대로 해보자
2-1 .reloc섹션 헤더 정리
위 그림을 보면 .reloc 섹션 헤더는 파일 옵셋 270에서 시작된다.(섹션 헤더 크기는 28) 이 부분(270~297)을 Hex Editor를 이용해서 0으로 덮어쓰자.
위 부분을
다음과 같이 덮어 쓰자.
2-2 .reloc섹션 제거
위 PE view에서 파일에서 .reloc 섹션의 시작 옵셋은 C000이다.(이곳부터 파일 끝까지 .reloc섹션의 영역이다.)
Hex Editor로 C000 옵셋부터 파일 끝까지 삭제하자.
이로써 .reloc 섹션은 물리적으로 제거되었다. 하지만 다른 PE 헤더 정보들이 아직 수정되지 않아서 파일이 정상적으로 실행되지는 않는다.
이제부터 관련 PE 헤더 정보를 수정하여 정상실행되도록 만들어보자.
2-3 IMAGE_FILE_HEADER 수정
섹션을 하나 제거했으니 IMAGE_FILE_HEADER -Numver of Sections 항목을 수정해야 한다.
Numver of Sections 항목의 값은 현재 5로 되어있는데 섹션이 하나 줄었으므로 이 값을 4로 바꾸어주자.
2-4 IMAGE_OPTIONAL_HEADER 수정
.reloc 섹션이 제거되면서(프로세스 가상 메모리에서)섹션 크기만큼 전체 이미지 크기는 줄어들었다. 이미지 크기는 IMAGE_OPTIONAL_HADER -Size of Imgae 값에 명시되어 있으므로 이를 수정해줘야 한다.
위 그림을 보면 현재 Size of Image 값은 11000이다. 문제는 얼마만큼 빼줘야 정상적으로 실행될지 계산해야 한다. 아까 .reloc 섹션의 VirtualSize 값은 E40이고, 이를 Section Alignment에 맞게 확장하면 1000이 된다. 따라서 Size of Image 값은 1000만큼 빼야 한다.
이제 수정된 reloc.exe 파일은 정상적으로 실행될 것이다. 이처럼 PE View와 Hex Editor만 가지고 실행파일을 마음대로 다룰수 있다. 이 외에도 마지막 섹션의 크기변경, 섹션 추가 등의 작업을 할 수있다.