我在Windows上进行恶意软件分析。我每天运行数百个Windows PE,实际上,文件不运行(或者有时不能仅在Windows的一个特定版本上运行)是相对常见的,并且我收到一条错误消息,例如“这不是有效的Win32应用程序。 ”但是,当我在十六进制编辑器中打开文件时,它确实具有MZ,PE签名,甚至各节都完整无缺。而且,诸如PE Explorer的程序可以很好地打开文件并声称它是有效的PE文件,而不必甚至以“安全模式”打开它。请注意,我并不是在谈论有关32位Windows版本上的64位错误消息,因为这是不言自明的。

下面是一个这样的文件的屏幕快照。但是,此文件根本没有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版本数。

如果没有文件,就不清楚为什么文件无法加载。