一、.reloc节区
EXE形式的PE文件中,“基址重定位表”项对运行没有什么影响。实际上,将其删除后程序仍然正常运行(基址重定位表对DLL/SYS形式的文件来说几乎是必须的)。
VC++中生成的PE文件的重定位节区名称为.reloc,删除该节区后文件照常运行,且文件大小将缩减。.reloc节区一般位于所有节区的最后,删除这最后一个节区不像想得那么难。
二、从可执行文件中删除.reloc节区
若想要删除位于文件末尾的.reloc节区,只需要按照以下4个步骤操作
步骤1 - 整理.reloc节区头
步骤2 - 删除.reloc节区
步骤3 - 修改 IMAGE_FILE_HEADER
步骤4 - 修改 IMAGE_OPTIONAL_HEADER
可以使用cff工具,直接删除节区头以及节区数据,保存后,程序会自动修改nt头数据
1、删除.reloc节区头
从图中可以看到,.reloc节区头从文件偏移298处开始,大小为28。也就是区域(298~2BF),全部用0覆盖填充
2、删除.reloc节区
文件中.reloc节区的起始偏移为2200,从2200偏移开始一直删除到文件末端所有数据
这样.reloc节区即被物理删除。但是由于尚未修改其他PE头信息,文件仍无法正常运行。下面我们开始修改相关PE头信息,使文件最终能够正常运行。
3、修改 IMAGE_FILE_HEADER
删除1个节区后,首先要修改IMAGE_FILE_HEADER-Number of Sections项
将其值改为04即可
4、修改 IMAGE_OPTIONAL_HEADER
删除.reloc节区后,(进程虚拟内存中)整个映像就随之减少相应大小。映像大小值存储在IMAGE_OPTIONAL_HEADER-size of Image中,需要对其修改。
当前Size of Image的值为6000。问题在于,要计算减去多少才能让程序正常运行。.reloc节区的VirtualSize值为188,将其根据Section Alignment扩展后变为1000。所以应该从Size of Image减去1000才正确
修改后的程序可以正常运行。但是注意,程序的ASLR失效,默认的ImageBase为00400000