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就能随心所欲地修改可执行文件。此外还可修改最后节区的大小、添加新节区等。