17.从可执行文件中删除.reloc节区

Pasted image 20250321125139

1. .reloc节区

EXE形式的PE文件中,“基址重定位表”项对运行没什么影响。实际上,将其删除后程序仍然正常运行(基址重定位表对DLL/SYS形式的文件来说几乎是必需的)。
VC++中生成的PE文件的重定位节区名为 .reloc,删除该节区后文件照常运行,且文件大小将缩减(实际上存在这种实用小程序)。.reloc 节区一般位于所有节区的最后,删除这最后一个(不使用的)节区不像想得那么难。只使用PEView与HexEditor(手动删除)就足够了。

2. reloc.exe

想要准确删除文件尾部的 .reloc 节区,需要按以下四部操作即可

  1. 整理.reloc节区头;
  2. 删除.reloc节区;
  3. 修改IMAGE_FILE_HEADER;
  4. 修改IMAGE_OPTIONAL_HEADER

    当然现在可以直接用010editor直接删除

2.1. 删除.reloc节区头

从图可以看到,.reloc 节区头从文件偏移270h处开始,大小为 28h。使用010打开该区域(270~297),
Pasted image 20250320170409
全部用0覆盖填充
Pasted image 20250320170642

2.2. 删除.reloc节区

首先获取 .reloc 的节区偏移 C000h 大小为 1000h
Pasted image 20250320170821
直接删掉
Pasted image 20250320170919
此时,.reloc 节区就被物理删除了。但是由于还没有修改其他PE头的信息,文件是无法正常运行的。 下面我们修改相关PE头的信息,使文件可以正常运行

2.3. 修改 IMAGE_FILE_HEADER

删除1个节区后,首先要修改 IMAGE_FILEHEADER-NumberofSections
Pasted image 20250320171142
当前的值为 5,我们删除了一个节区,所以要修改为 4

2.4. 修改 IMAGE_OPTIONAL_HEADER

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

.reloc 的节区头中可以看到,.reloc 节区的 VirtualSize 值为 E40h
Pasted image 20250320172022
将其根据 SectionAlignment 扩展后变为 1000h(练习文件的SectionAlignment值为1000)。所以应该从 SizeofImage 减去 1000h 才正确,
Pasted image 20250320172218
修改后的 reloc.exe 文件现在能够正常运行了。像这样,只使用PEView与HexEditor就能随心所欲地修改可执行文件。此外还可修改最后节区的大小、添加新节区等。