从可执行文件中删除.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


保存之后,程序能够正常运行。

猜你喜欢

转载自blog.csdn.net/ski_12/article/details/80636900