下面是一个这样的文件的屏幕快照。但是,此文件根本没有DOS存根,并且DOS标头数据结构都设置为0,但e_lfanew确实指向PE信号。但是,Windows加载程序说,至少在我的Win7 64bit版本上,它不是有效的Win32应用。
由此,它可以完成诸如分配堆栈和堆内存,确定需要哪些符号以及来自哪些DLL文件以及其他一些任务的工作。因此,基于此我的假设是,例如,如果这些头数据结构之一告诉加载程序执行无意义的操作,例如分配负空间,太多空间或在对结构至关重要的结构中包含废话,装载机工作,可能会使其崩溃。但是,这只是我的推测。
#1 楼
根据我的经验,当MajorOperatingSystem/MinorOperatingSystem
和/或MajorSubsystemVersion/MinorSubsystemVersion
与您尝试运行PE文件的系统不兼容时,可能会发生此类错误。您可以在Corkami页面中找到有关PE文件格式的更多信息。此外,您还可以查看Microsoft网站上PE内的对等...文章,其中涉及这些字段:使用此可执行文件所需的操作系统版本。该字段有些模棱两可,因为子系统字段(以后几个字段)似乎起着类似的作用。迄今为止,在所有Win32 EXE中,此字段的默认值为1.0。运行可执行文件所需的最低子系统版本。此字段的典型值为3.10(表示Windows NT 3.1)。此外,如果您对PE文件格式的异常和未记录的内容感兴趣,我建议您写这篇非常好的论文处理PE中的异常会破坏解析器执行不佳的情况。此外,Corkami的站点包含各种有效的PE样本的POC(源代码和二进制文件),可以对格式进行极限测试,并可以用于测试。希望这会有所帮助。
#2 楼
加载程序有很多方法无法加载看似有效的文件。例如,32位和64位体系结构的规则有所不同。其中最明显的是最小文件大小。然后Windows的不同版本之间的规则存在差异。在旧版本中,关键数据(例如导入表)可以放在文件头中。
引入了PE标头的对齐要求。 PE标头可以在文件中出现的位置的规则已更改。规则更改为文件中的最大节数。
规则也更改为节对齐,节顺序和重叠节。
完整更改的内容以及更改的方式的列表将非常详尽,这取决于要考虑的Windows版本数。
如果没有文件,就不清楚为什么文件无法加载。