什么决定了 ListDLLs 输出中 DLL 的“创建时间”?

什么决定了 ListDLLs 输出中 DLL 的“创建时间”?

我曾在一个 EXE 上运行 ListDlls,但我不确定它是否应该在我的计算机上运行。输出中 DLL 的日期到处都是。我很好奇“创建时间”字段是如何设置的。

答案1

为了澄清问题,listdlls -v SomeProcess.exe显示该流程模块的版本信息,如下面的示例所示,特别是包括“创建时间”行。

0x000000006f630000  0xc000    C:\WINDOWS\SYSTEM32\CRYPTBASE.DLL
        Verified:       Microsoft Windows
        Publisher:      Microsoft Corporation
        Description:    Base cryptographic API DLL
        Product:        Microsoft« Windows« Operating System
        Version:        10.0.18362.1
        File version:   6.2.18362.1
        Create time:    Wed Jul 15 19:07:02 2105

0x000000006f4b0000  0x67000   C:\WINDOWS\system32\mswsock.dll
        Verified:       Microsoft Windows
        Publisher:      Microsoft Corporation
        Description:    Microsoft Windows Sockets 2.0 Service Provider
        Product:        Microsoft« Windows« Operating System
        Version:        10.0.18362.1
        File version:   6.2.18362.1
        Create time:    Mon Feb 14 21:29:32 1983

ListDLLs 从TimeDateStamp文件PE 头。如果你有 Visual Studio,你可以使用以下命令查看 PE 头信息dumpbin实用程序。在我的计算机上,输出dumpbin /headers mswsock.dll以以下内容开头:

Dump of file C:\Windows\System32\mswsock.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
            8664 machine (x64)
               9 number of sections
        18AF169C time date stamp
               0 file pointer to symbol table
               0 number of symbols
              F0 size of optional header
            2022 characteristics
                   Executable
                   Application can handle large (>2GB) addresses
                   DLL

那里的“时间日期戳”是基于 Unix 纪元的时间的十六进制表示,即自 1970 年 1 月 1 日午夜(UTC)以来的秒数。粘贴18AF169C这个在线转换器产生的当地时间为 1983 年 2 月 14 日星期一晚上 9:29:32,这正是 ListDLLs 所说的。

至于为什么时间戳非常不正确,我怀疑该字段是故意填充仅取决于源代码而不是构建时间的数据。(可重复的构建可以更容易地检查二进制文件是否被篡改。)“时间戳”可能是某种哈希值,理想情况下均匀分布在可能性空间上。

相关内容