为什么 Windows 可执行文件显示不正确的编译器时间戳?

Mon*_*onk 11 windows compile sysinternals

我观察到 Windows 可执行文件在 PE Studio 中查看时显示不正确的时间戳。 例如,此 Notepad.exe 文件显示的编译器时间戳为0x86FCD69 (Mon Oct 07 03:45:05 2041 )

为了在今天(2021 年 5 月 3 日)验证这一点,我将 Python 程序文件转换为 EXE 并在 PE Studio 中进行了检查。它还显示了错误的编译器时间戳0x5FFEC122 (Wed Jan 13 15:15:06 2021 ) Python 可执行文件

为什么编译器时间戳不正确?据我了解,如果今天将 Python 程序转换为 exe,它应该在编译器时间戳下显示今天的日期。

use*_*686 22

它们被故意设置为固定值:

  • 旧的新事物:为什么 Windows 10 中的模块时间戳如此荒谬?

    在 Windows 10 中开始的对 Windows 工程系统的更改之一是转向可重现的构建。这意味着如果您从完全相同的源代码开始,那么您应该以完全相同的二进制代码结束。

    […]

    时间戳是非确定性的另一个来源。即使所有输入都相同,由于时间戳的原因,输出仍然会有所不同。[...] 将时间戳设置为生成的二进制文件的哈希值可以保持可重复性。

  • 旧的新事物:可执行时间戳的真正含义是什么?

    名称时间戳具有误导性。它的真正目的是充当签名,以便操作系统可以确定预先计算的一组值所针对的 DLL 是否与系统上的 DLL 物理匹配。更好的名称应该是“UniqueId”。

注意:这里的“签名”一词有两种含义。Raymond 将该字段称为“签名”,只是因为它是某种独特的东西,可以将此二进制文件与其他二进制文件区分开来(就像“MZ”字节是所有 .exe 文件的签名一样)。然而,它不是加密数字签名,并且无法确保文件的完整性或真实性。

  • @supercat - 微软不久前做出了这个改变,不像他们最近做出的改变,已经超过 4 年了。 (4认同)
  • 它们不是签名。您是正确的,签名用于确保完整性和防止篡改,Microsoft 确实对其所有可执行文件进行了数字签名——**但时间戳与签名不同。** 时间戳是一个 32 位数字;即使它_曾_用于防止篡改,也需要花费几分钟来简单地遍历每个可能的 32 位数字,直到找到一个“通过”的数字。实际签名是数百位(或数千位,因为 Microsoft 使用 RSA)。 (2认同)