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

1、.reloc节区
EXE形式的PE文件中,“基址重定位表”项对运行没什么影响,将其删除后程序仍能正常运行(基址重定位表对DLL/SYS形式的文件来说几乎是必需的)。VC++中生成的PE文件的重定位节区名为.reloc,删除该节区后文件可正常运行,并且缩减了文件大小。.reloc节区一般位于所有节区的最后,可以使用PEView和Win Hex Editor来手动删除。
基址重定位表:
在PE文件中,基址重定位表一般放在一个单独的 “.reloc” 区,可以通过IMAGE_OPTIONAL_HEADER 中 的DataDirectory[5] 查看基址重定位表 的RVA。
在PEview中查看notepad.exe的基址重定位表地址。
1

2
基址重定位表的地址为RAV 10000。
1、删除.reloc节区头:先用PEView打开查看.reloc节区头信息:
可以看到.reloc节区头从文件偏移270开始,大小为28(270~297)。用Win Hex打开找到该区域,然后全部用0覆盖(Ctrl+L):

2、删除.reloc节区:文件中.reloc节区的起始偏移为C000,因此从C000开始一直使用Win Hex删除到文件末端所有数据即可(Del):

这样,.reloc节区即被物理删除。但由于尚未修改其他PE头信息,文件仍无法正常运行。因此需要修改相关PE头信息,使文件最终能够正常运行。
删除之后如下:
3、修改IMAGE_FILE_HEADER:删除一个节区后,要修改IMAGE_FILE_HEADER的Number of Sections项,如图,当前该项值为5,修改为4:
用Win Hex修改:
4、修改IMAGE_OPTIONAL_HEADER:删除.reloc节区后,整个映像大小缩减了,映像大小的值保存在IMAGE_OPTIONAL_HEADER的Size of Image项中,需要对其进行修改。
可以看到,当前该项值为11000,而由之前的.reloc节区头可知其VirtualSize值为E40


然后将其根据Section Alignment扩展后变为1000,所以应当从Size of Image项减去1000而不是E40:11000 - 1000 = 10000
保存之后,程序能够正常运行
未删除.reloc节区的程序运行后结果为
未删除.reloc节区
删除.reloc节区后运行结果为
删除.reloc节区后
而且,通过查看两个可执行文件的大小可以看到删除节区后的可执行文件较小
文件大小

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值