从PE文件中移除DOS stub

15

是否有可能从PE文件中删除DOS stub和DOS header?

4个回答

18

PE文件必须以IMAGE_DOS_HEADER开头,紧随其后的是定义现代PE字段的IMAGE_NT_HEADERS结构。

IMAGE_DOS_HEADER有两个必填字段 - e_magic必须包含值IMAGE_DOS_SIGNATURE(在ASCII中看起来像'MZ'),e_lfanew必须是从文件开头到IMAGE_NT_HEADERS开始处的偏移量。

除了这两个字段之外,对于16位Windows之后的Windows版本,IMAGE_DOS_HEADER的剩余部分是可选的,并且可以为零。DOS stub也是可选的,可以省略。

最小符合规范的PE文件以e_magic设置为IMAGE_DOS_SIGNATURE并将e_lfanew设置为sizeof(IMAGE_DOS_HEADER)的IMAGE_DOS_HEADER开头,紧接着是IMAGE_NT_HEADERS。


7

删除Dos Stub与Dos头文件无关。是的,可以删除Dos Stub(因为它不再使用)。甚至可以将Dos头文件大小缩小到最小值(MZ + 跳转到PE头文件)。但是你不能完全删除Dos头文件。否则,如果缺少MZ和跳转到PE头文件,则Windows加载器将拒绝启动您的映像。


您可以使用PeStudio(http://www.winitor.com)检索任何可执行映像的DOS Stub的实际大小。 - mox
能否给我点踩的人,请公正地评论一下为什么要点踩!谢谢。 - mox

4

如果不破坏文件格式,没有简单的方法可以删除它。

但是,我找到了这个


我可以破解文件格式,但我需要知道如何在不损坏可执行文件的情况下进行操作。 - user1232138
2
如果你破坏了文件格式,那么它就不再是一个PE文件了。你可以提供一个自定义的存根。 - Raymond Chen

2

你不能将Dos头的大小缩小到其“最小值”。不幸的是,长度字段是IMAGE_DOS_HEADER中的最后一个字段。因此,它的固定大小为64字节。


确实。一个只是退出的DOS .exe文件的最小大小为24 + 5 = 29字节。PE存根的最小大小为64字节,其中PE头偏移存储在字节位置60和64之间。 - pts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接