哪些 PE 异常会导致 Windows 加载程序崩溃或导致文件无法加载?

逆向工程 视窗 恶意软件 聚乙烯
2021-06-11 23:18:28

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

下面是一个这样的文件的屏幕截图。然而,这个文件根本没有 DOS 存根,并且除了 e_lfanew 指向 PE sig 之外,DOS 头数据结构都设置为 0。但是,Windows 加载程序说它不是有效的 Win32 应用程序,至少在我的 64 位 Win7 版本上是这样。

在此处输入图片说明

我确实知道加载器本质上是读取数据结构,然后它会执行诸如分配堆栈和堆内存、确定需要哪些符号和从哪些 DLL 文件以及其他一些任务等操作。因此,我基于此的假设是,例如,如果这些头数据结构之一告诉加载程序做一些没有意义的事情,例如分配负空间、太多空间或在对以下内容至关重要的结构中包含废话装载机工作,它可能会崩溃。然而,这只是我的猜测。

2个回答

根据我的经验,当MajorOperatingSystem/MinorOperatingSystem和/或MajorSubsystemVersion/MinorSubsystemVersion与您尝试运行 PE 文件的系统不兼容可能会发生这些类型的错误您可以在 Corkami页面中找到有关 PE 文件格式的更多信息此外,您可以查看Microsoft 网站上的Peering inside the PE...论文,其中说明了这些字段:

WORD MajorOperatingSystemVersion WORD MinorOperatingSystemVersion 使用此可执行文件所需的操作系统的最低版本。这个字段有点含糊不清,因为子系统字段(后面几个字段)似乎服务于类似的目的。迄今为止,此字段在所有 Win32 EXE 中默认为 1.0。

WORD MajorSubsystemVersion WORD MinorSubsystemVersion 包含运行可执行文件所需的最低子系统版本。此字段的典型值为 3.10(表示 Windows NT 3.1)。

另外,如果您对 PE 文件格式的异常和未记录的内容感兴趣,我建议您阅读这篇非常好的论文论文涉及 PE 中的异常,这些异常可能会破坏实现不佳的解析器。此外,Corkami 的这个站点包含各种工作 PE 样本(源代码和二进制文件)的 POC,它们测试格式的极限并可以用于测试。

希望这会有所帮助。

加载器无法加载看似有效的文件的方法有很多。例如,32 位和 64 位体系结构的规则存在差异。其中最明显的是最小文件大小。

然后在不同版本的 Windows 之间存在规则差异。在旧版本中,诸如导入表之类的关键数据可以放在文件头中。这已不再是这种情况。

引入了 PE 标头的对齐要求。PE 标头可以出现在文件中的位置的规则已更改。更改了文件中最大节数的规则。

节对齐、节顺序和重叠节等的规则也发生了变化。

更改内容和更改方式的完整列表将非常长且详细,具体取决于所考虑的 Windows 版本的数量。

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