
EXE形式的PE文件中,“基址重定位表”项对运行没什么影响。实际上,将其删除后程序仍然正常运行(基址重定位表对DLL/SYS形式的文件来说几乎是必需的)。
VC++中生成的PE文件的重定位节区名为 .reloc,删除该节区后文件照常运行,且文件大小将缩减(实际上存在这种实用小程序)。.reloc 节区一般位于所有节区的最后,删除这最后一个(不使用的)节区不像想得那么难。只使用PEView与HexEditor(手动删除)就足够了。
想要准确删除文件尾部的 .reloc 节区,需要按以下四部操作即可
IMAGE_FILE_HEADER;IMAGE_OPTIONAL_HEADER
当然现在可以直接用010editor直接删除
从图可以看到,.reloc 节区头从文件偏移270h处开始,大小为 28h。使用010打开该区域(270~297),

全部用0覆盖填充

首先获取 .reloc 的节区偏移 C000h 大小为 1000h

直接删掉

此时,.reloc 节区就被物理删除了。但是由于还没有修改其他PE头的信息,文件是无法正常运行的。 下面我们修改相关PE头的信息,使文件可以正常运行
IMAGE_FILE_HEADER删除1个节区后,首先要修改 IMAGE_FILEHEADER-NumberofSections 项

当前的值为 5,我们删除了一个节区,所以要修改为 4
IMAGE_OPTIONAL_HEADER删除 .reloc 节区后,(进程虚拟内存中)整个映像就随之减少相应大小。映像大小值存储在 IMAGE_OPTIONAL_HEADER-Size of Image 中,需要对其修改。
从图可以看出,当前 SizeofImage 的值为11000。问题在于,要计算减去多少才能让程序正常运行

在 .reloc 的节区头中可以看到,.reloc 节区的 VirtualSize 值为 E40h,

将其根据 SectionAlignment 扩展后变为 1000h(练习文件的SectionAlignment值为1000)。所以应该从 SizeofImage 减去 1000h 才正确,

修改后的 reloc.exe 文件现在能够正常运行了。像这样,只使用PEView与HexEditor就能随心所欲地修改可执行文件。此外还可修改最后节区的大小、添加新节区等。