PE节区头的学习-删除.rsrc节区

引言

EXE形式的PE文件中,“基地址重定位表”项对运行没什么影响。实际上,将其删除后程序仍然正常运行(基地址重定位表对DLL/SYS形式的文件来说几乎是必须的)。

VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件照常运行,且文件大小将缩减(实际上存在这种实用小程序)。.reloc节区位于所有节区的最后,删除这最后一个(不使用的)节区不像想得这么难。

《逆向工程核心原理》

开始

使用的程序

程序:仍然是上一篇中的那个HelloWorld.exe

值得一提的是,这个小程序并没有.reloc节区,所以我决定删掉它的.rsrc节区。因为实际上这个小程序好像也没什么资源嘛

另外,虽然可以使用 CFF Explorer 直接修改,但我这里为了熟悉熟悉就使用editor修改了

1、整理.rsrc节区头

可以看到,.rsrc节区头从文件偏移260处开始,大小为28。因此我们把这块区域用0填充

整理前
整理后

2、删除.rsrc节区

从上面节区头的图中可以看到,.rsrc的Raw Address值为FE00,Raw Size为200。所以在文件中.rsrc节区为从FE00开始的长达200的块,后面我们可以看到这直接就到文件结尾了

这样,.rsrc节区即被物理删除。但是这时程序还不能运行,因为还有其它的PE头信息与.rsrc节区相关

3、修改 IMAGE_FILE_HEADER

这里的 NumberOfSections 表示的是文件所含的节区数量,所以删掉.rsrc后应该减一

修改后

4、修改 IMAGE_OPTIONAL_HEADER

删除.rsrc节区后,(进程虚拟内存中)整个映像就随之减少相应大小。需要修改 IMAGE_OPTIONAL_HEADER-SizeOfImage

当前的值为15000,。.rsrc的VirtualSize值为1E0,将其根据Section Alignment扩展后变为1000.所以应该从SizeOfImage减去1000才正确

修改后

删掉这个还不够哦,别忘了还有两个:Resource Directory RVA & Resource Directory Size

5、修改 Resource Directory RVA & Resource Directory Size

这部分书上没有,但我觉得size肯定为0,至于RVA嘛,我想是不是null?就是0?想想不如试试,其实我就是试出来的2333

全改成0

保存!

完成!

其实删掉了资源节区后,整个程序并没有啥可见的变化,因为它本来就没有什么资源,就一个窗口+文字,东西都存在data段,哪来的资源。。。。

后记

这个过程还是非常有意思的,看着书本,修改一个不一样的程序的不同的节区,一开始没有改最后两个项还以为又是环境的问题呢,然后看看 CFF Explorer 标红显示出错的地方,看看它跟节区之间的关系,就可以看出来了。

推荐大家都去玩玩XD,对节区头乃至PE头的理解还是有帮助的。而且通过这种方式更让我体会到了PE头的虚无缥缈,乱七八糟的性质(上面都是我乱说的,大家别信)

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒