我在 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 文件以及其他一些任务等操作。因此,我基于此的假设是,例如,如果这些头数据结构之一告诉加载程序做一些没有意义的事情,例如分配负空间、太多空间或在对以下内容至关重要的结构中包含废话装载机工作,它可能会崩溃。然而,这只是我的猜测。