第17章 从可执行文件中删除.reloc节区
本文最后更新于:2022年5月19日 晚上
第17章从可执行文件中删除.reloc节区
本章将通过练习使大家了解从PE文件中手动删除.reloc节区的方法,这将大大加深各位对PE文件格式的理解,同时进一步熟悉Hex Editor等工具的使用。
17.1 .reloc 节区
EXE形式的PE文件中,“基址重定位表”项对运行没什么影响。实际上,将其删除后程序仍然正常运行(基址重定位表对DLL/SYS形式的文件来说几乎是必需的)。
在高版本的启动了ASLR后的Windows中,reloc节区对于EXE文件就是必须的了。
VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件照常运行,且文件大小将缩减(实际上存在这种实用小程序)。.reloc节区一般位于所有节区的最后,删除这最后一个(不使用的)节区不像想得那么难。只使用PEView与Hex Editor (手动删除)就足够了。
17.2 reloc.exe
若想准确删除位于文件末尾的.reloc节区,需要按照以下4个步骤操作。
步骤1 - 整理.reloc节区头;
步骤2 - 删除.reloc节区;
步骤3 - 修改IMAGE_FILE_HEADER;
步骤4 - 修改IMAGE_OPTIONAL_HEADER。
17.2.1 删除.reloc节区头
从图17-1可以看到,.reloc节区头从文件偏移270处开始,大小为28。使用Hex Editor打开该区域(270〜297 ),全部用0覆盖填充(使用HxD的“Fill selection…”功能会比较方便),如图17-2所示。
17.2.2 删除.reloc节区
从图17-1可以看到,文件中.reloc节区的起始偏移为C000(由此开始到文件末尾为.reloc节区)。 从C000偏移开始一直使用Hex Editor删除到文件末端所有数据(使用HxD的“Delete”功能更方便),如图17-3所示。
这样,.reloc节区即被物理删除。但是由于尚未修改其他PE头信息,文件仍无法正常运行。
下面开始修改相关PE头信息,使文件最终能够正常运行。
17.2.3 修改 IMAGE_FILE_HEADER
删除1个节区后,首先要修改IMAGE_FILE_HEADER-Number ofSections项,如图17-4所示。
当前Number of Sections项的值为5,删除1个节区后要把其值改为4,如图17-5所示。
17.2.4 修改 IMAGE_OPTIONAL_HEADER
删除.reloc节区后,(进程虚拟内存中)整个映像就随之减少相应大小。映像大小值存储在IMAGE_OPTIONAL_HEADER - size ofImage中,需要对其修改。
从图17-6可以看岀,当前Size ofImage的值为11000。问题在于,要计算减去多少才能让程序正常运行。由图17-1可知,.reloc节区的VirtualSize值为E40,将其根据Section Alignment扩展后变为1000 (练习文件的Section Alignment值为1000 )。所以应该从Size ofImage减去1000才正确,如图17-7所示。
修改后的reloc.exe文件现在能够正常运行了。像这样,只使用PEView与Hex Editor就能随心所欲地修改可执行文件。此外还可修改最后节区的大小、添加新节区等。
17.3 小结
若想再多做一些与上述内容有关的练习,可以尝试向示例文件(reloc.exe)新增1个空节区,使总节区数达到6个。参考前面讲解的内容即可顺利完成。通过这样的练习可以进一步加深对PE文件的认积累更多经验,以后操作PE文件就会更加得心应手
参考
《逆向工程核心原理》 第17章