从可执行文件中删除.reloc节区
基址重定位表对于DLL和SYS文件来说是必须得,但在EXE格式的PE文件中,基址重定位表并无作用,将其删除后程序仍然能够正常运行。
VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件可正常运行,并且缩减了文件大小。
.reloc节区一般位于所有节区的最后,可以使用PEView和Win Hex Editor来手动删除。这里对reloc.exe程序进行演示。
1、删除.reloc节区头:
先用PEView打开查看.reloc节区头信息:
可以看到.reloc节区头从文件偏移270开始,大小为28(270~297)。
用Win Hex打开找到该区域,然后全部用0覆盖(Ctrl+L):
2、删除.reloc节区:
文件中.reloc节区的起始偏移为C000,因此从C000开始一直使用Win Hex删除到文件末端所有数据即可(Del):
删除之后如下:
3、修改IMAGE_FILE_HEADER:
删除一个节区后,要修改IMAGE_FILE_HEADER的Number of Sections项,如图,当前该项值为5,修改为4:
用Win Hex修改:
4、修改IMAGE_OPTIONAL_HEADER:
删除.reloc节区后,整个映像大小缩减了,映像大小的值保存在IMAGE_OPTIONAL_HEADER的Size of Image项中,需要对其进行修改。
可以看到,当前该项值为11000,而由之前的.reloc节区头可知其VirtualSize值为E40,然后将其根据Section Alignment扩展后变为1000,所以应当从Size of Image项减去1000而不是E40:11000 - 1000 = 10000
保存之后,程序能够正常运行。