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

  1. .reloc节区
  • EXE形式的PE文件中,“基址重定位表”项对运行没有什么影响,实际上,将其删除后程序仍能正常运行。
  • VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件照常运行,且文件大小将缩减,.reloc节区一般位于所有节区的最后。
  1. 若要删除位于文件末尾的.reloc节区,需要按照以下4个步骤操作:
  • 整理.reloc节区头
  • 删除.reloc节区
  • 修改IMAGE_FILE_HEADER
  • 修改IMAGE_OPTIONAL_HEADER
  1. 删除.reloc节区头
    在这里插入图片描述
  • 可以看到.reloc节区头从文件偏移270处开始,大小为28,使用Hex Editor打开该区域,全部用0覆盖填充。
    在这里插入图片描述
  1. 删除.reloc节区
  • 文件中.reloc节区的起始偏移为C000,从C000偏移开始一直使用Hex Editor删除到文件末尾所有数据。
    在这里插入图片描述
  1. 修改IMAGE_FILE_HEADER
  • 修改IMAGE_FILE_HEADER的Number of Sections项,将5改成4
    在这里插入图片描述
    在这里插入图片描述
  1. 修改IMAGE_OPTIONAL_HEADER
  • 删除.reloc节区后,整个映射就随之减少相应大小,映射大小值存储在IMAGE_OPTIONAL_HEADER-size of Image中,需要对其修改。
    在这里插入图片描述
  • .reloc节区的VirtualSize值为E40,将其根据Section Alignment拓展后编程1000,所以应该从Size of Image减去1000才正确。
    在这里插入图片描述
  • 修改后reloc.exe文件就能够正常运行了。