关于PE格式中DOS Stub的问题

skyeraser 2014-11-13 04:13:26
各位高手:

本人是个新手,最近在阅读关于PE文件格式的文章,有几个问题不解,还请各位帮助在下理解一下。如果类似的问题在论坛上讨论过,也请看到的人给个链接,不胜感谢!



1)MZ格式文件头的定义中第二个WORD是“最后一块(512字节)中所使用的字节数",第三个WORD是”页的数量“。但是,由图中的数字算出的字节数远比Stub的实体部分要大得多。这是什么原因?

2)在Stub中的代码和数据之后(即图中0x70行的0x24之后)直至PE文件头之前(截图的结尾之后即是PE文件头)会有一块数据。在不同的文件中,此块数据有长又短,而且这块数据有时是完全用”0“填充的,有时则是一些非零的数据,这块数据的作用是什么?



...全文
550 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
mxzwt 2017-08-02
  • 打赏
  • 举报
回复
既然pe加载器不在乎,这些数据应该是应用程序可能引用的呗
skyeraser 2014-11-14
  • 打赏
  • 举报
回复 1
引用 2 楼 binaryhead 的回复:
1、就PE格式来说,我认为操作系统的加载器对DOS Stub只关心两件事情:1)确认PE文件开始的确是一个DOS stub(4D 5A起始标志);2)读取0x3C处的值,直接找到PE真正开始位置进行解析。所以,你前面提到的两个字段对PE加载器而言并不关心。而且我查了一些MZ(DOS EXE可执行格式)格式说明,你说到的两个字段语焉不详,比如你理解这两个字段是指文件(EXE映像本身)的长度,我却有另外的怀疑:莫非这两个字段是指EXE加载到内存后需要占用的空间大小,即告诉DOS操作系统,在执行文件长度之外再额外保留一些空间。 2、DOS Stub对生成PE文件的Linker而言,大都是可定制的。你甚至可以设置链接器选项,用自己的DOS Stub替换链接器缺省DOS Stub来生成PE文件,只要起始标志和0x3C处的值要遵照PE标准就是了。1楼的试验也说明了Windows下的PE加载器确实并不关心你说到两个字段。恰恰因为PE加载器忽略DOS Stub其它内容的做法,DOS Stub是否还可以用来存储一些其它目的的内容,这或许是研究DOS Stub的真正价值所在吧。
您说的很有道理,感谢!我也只是觉得奇怪,其实Stub没有多少作用,何必为其留出如此多的空间,会不会成为一种安全问题呢?呵呵,可能想多了。再次感谢回复。
skyeraser 2014-11-14
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
1. 看了几个程序,好像都是这样的 90 00 03 00 ?将个程序的这个内容修改为必要的如你上面所示的 80 00 01 00,程序在 windows 或 dos 下也都正常。 2. 这部分应该没什么用吧,windows 下的不会用到,因为是从 'PE' 标记开始的嘛;dos stub 的也没用它,只是显示了个提示字符串。可能有些程序作怪时会有染指。
您的回答很有帮助,感谢您的参与! 虽然stub对整个PE文件来说并没有过多的作用,但是出于兴趣,我还想再多说一点儿。只是交流,没有别的意思,如有不妥,还请包涵。 关于第一点,我发现有些程序也有不同,比如有 50 00 02 00的,而且出现这样的时候,其stub部分要明显长于90 00 03 00的程序。我想可能是与不同的linker的内部规范有关。 关于第二点,其实我也知道这一段好像没有什么实际作用,只是奇怪,如果是填充,用一个单一的“0”不更简单,我看来很多程序这一段的填充,还是有很多不同的,好像是有心设计的,所以才有了上述的疑问
二进制脑袋 2014-11-14
  • 打赏
  • 举报
回复
1、就PE格式来说,我认为操作系统的加载器对DOS Stub只关心两件事情:1)确认PE文件开始的确是一个DOS stub(4D 5A起始标志);2)读取0x3C处的值,直接找到PE真正开始位置进行解析。所以,你前面提到的两个字段对PE加载器而言并不关心。而且我查了一些MZ(DOS EXE可执行格式)格式说明,你说到的两个字段语焉不详,比如你理解这两个字段是指文件(EXE映像本身)的长度,我却有另外的怀疑:莫非这两个字段是指EXE加载到内存后需要占用的空间大小,即告诉DOS操作系统,在执行文件长度之外再额外保留一些空间。 2、DOS Stub对生成PE文件的Linker而言,大都是可定制的。你甚至可以设置链接器选项,用自己的DOS Stub替换链接器缺省DOS Stub来生成PE文件,只要起始标志和0x3C处的值要遵照PE标准就是了。1楼的试验也说明了Windows下的PE加载器确实并不关心你说到两个字段。恰恰因为PE加载器忽略DOS Stub其它内容的做法,DOS Stub是否还可以用来存储一些其它目的的内容,这或许是研究DOS Stub的真正价值所在吧。
zara 2014-11-14
  • 打赏
  • 举报
回复
1. 看了几个程序,好像都是这样的 90 00 03 00 ?将个程序的这个内容修改为必要的如你上面所示的 80 00 01 00,程序在 windows 或 dos 下也都正常。
2. 这部分应该没什么用吧,windows 下的不会用到,因为是从 'PE' 标记开始的嘛;dos stub 的也没用它,只是显示了个提示字符串。可能有些程序作怪时会有染指。

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧