可以在某些版本的 Windows 中执行损坏的 PE 文件,而不能在其他版本中执行吗?

逆向工程 视窗 聚乙烯
2021-07-11 16:41:51

我正在对损坏的 PE 文件进行一些研究,我想听听您对它们的想法和经验。我一直在处理大量样本,这些样本本质上是损坏的 Windows 可移植可执行文件。它们不会在 XP 或 Windows 7 上运行,也不会在 32 位或 64 位上运行。如果我在十六进制编辑器中打开它们,很明显它们丢失了整个头数据结构,MZ 和周围的数据丢失或更改等......当我尝试执行这些 .exe 文件时,我会遇到错误“这不是有效的 Windows 可执行文件”和/或“此可执行文件无法在此系统上运行,它可能是为 64 位设计的,而您是 32 位的,反之亦然”。不是逐字逐句的,但这是总体思路。基本上,我根本无法让这些运行或操作。所以问题是,它们为什么存在?它们是否可能与其他文件打包在一起,在运行时修复这些文件,然后将它们作为一种“混淆库文件”加载到内存中?我觉得这是一个不太可能发生的情况。

另一种可能性是,也许这些文件是为旧版本的 Windows 制作的?不过,我对 PE 文件格式进行了一些深入研究,但不知道以前有任何带有更改的标头等的 PE 格式。

示例: 首先查看运行良好的常规 PE 文件: 功能性PE文件

现在看上面与样本文件的比较: PE好,PE差

最后,我能够在一堆二进制数据中找到比正常更远的“PE”:

在此处输入图片说明

这只是一个例子,但这就是我正在谈论的事情。

2个回答

PE 格式实际上向后兼容旧的 DOS EXE 格式(也称为 MZ-exe)。这就是为什么它必须从 MZ 签名开始。完全有可能在兼容性部分(也称为“存根”)中有一个完整的 DOS 可执行文件,在 PE 部分有一个 Win32 可执行文件(例如,Windows 95 reg.exe 就是这样一个——它可以在 Windows 和 DOS 中运行) )。按照标准,PE 标头的偏移量是文件中偏移量 0x3C 处的双字值。在您的屏幕截图中,该值似乎是 0x9C0000。如果在 0x9C0000 处没有 PE 签名(或者它在文件之外),则意味着该文件不是 PE,而是某种其他类型的 MZ 扩展格式(例如,用于 Win16 或 OS/2 的 NE)或只是一个普通的 DOS文件。您可以尝试在 DOSBox 或其他 DOS 环境中运行它,

这些可能是在通过网络或存储进行复制期间损坏的文件(这种情况很少发生)。它们可能是为某些版本的 Windows 构建的文件,因此无法与较新的版本一起使用。

Window 的 PE 加载器在主要 Windows 版本之间发生变化,并且此类记录和未记录的限制可能适用于执行 PE 文件,尤其是当 PE 具有某些格式边缘情况时,如果有意这样做,可能会出现这种情况。

例如,根据来源,可能会出现不同的假设:例如,恶意软件行业有多个提要提供者,其中一些倾向于将损坏的 PE 文件标记为恶意软件,或者从不同的地方提取 PE 资源(漏洞利用包、投放器) 与那些腐败。可能是 PE 在内存中损坏了,并且 dropper 即将修复并丢弃,但是某种自动解包环境在 dropper 有机会修复之前从内存中转储了损坏的 PE。

这是一个广泛的问题,如果没有任何细节,很难说出您正在分析的那些 PE 文件为何已损坏、它们为何存在以及它们是否可以修复(或者您是否希望它们被修复)