如何确定 VB 应用 compile/created 日期

How to determine VB app compile/created date

我公司使用的软件在其关于部分的页脚列出了 2001-2002 年。这是否足以相信该程序收到的最后一次大修或更新是在 2001-02 年?

如果不是,有没有办法通过反编译软件,它是用VB6写的?

来自 WinNT.h 注意第二个 DWord,TIMEDATESTAMP

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

如果你看这里,你会发现上面的解释和一个程序也可以为你做这件事。

https://msdn.microsoft.com/en-au/library/ms809762.aspx?f=255&MSPPError=-2147217396

我忘记了链接器将时间戳粘贴到 PE 中 Header。这是一个简短的 VB.NET 小程序,用于读取 PE Header 并转换时间戳:

Private Function GetPEDate(filename As String) As DateTime

    Dim dtUINT As UInt32
    Using fs As Stream = New FileStream(filename, 
                        FileMode.Open, FileAccess.Read),
        rdr As New BinaryReader(fs)

        ' move to PE location (60; 70 for 64 bit but
        ' there is no such thing as a 64bit VB6 app)
        fs.Position = &H3C
        Dim peHDR As UInt32 = rdr.ReadUInt32()       ' offset of start location
        fs.Position = peHDR

        Dim tmpUINT = rdr.ReadUInt32()            ' PE sig
        Dim tmpShrt = rdr.ReadUInt16              ' machine
        tmpShrt = rdr.ReadUInt16                  ' sections

        dtUINT = rdr.ReadUInt32()                 ' linker timestamp

    End Using
    ' SEE NOTE
    Dim dtCompiled As New DateTime(1970, 1, 1, 0, 0, 0)

    dtCompiled = dtCompiled.AddSeconds(dtUINT)
    dtCompiled = dtCompiled.AddHours( _ 
            TimeZone.CurrentTimeZone.GetUtcOffset(dtCompiled).Hours)

    Return dtCompiled
End Function

使用方法:

Dim dt = GetPEDate(FullFilePath)
Console.WriteLine("App was compiled approx: {0}", dt.ToString)

输出:

App was compiled approx: 4/6/2004 11:54:07 AM

我用一些实际的旧 VB6 应用程序以及一些 x86 VB.NET 应用程序对此进行了测试,返回的 DateTime 与 CreatedDate and/or 报告的修改日期相比是正确的探索者。

最初时间差了 3 小时。 MSDN docs 明确指出:

This field holds the number of seconds since December 31st, 1969, at 4:00 P.M.

但它正好关闭了 3 小时,我的 TZ 距离美国东海岸、西雅图或格林威治标准时间不到 3 小时。快速 Google 产生了 this article by Jeff Atwood(其中包括另一个 PE reader)。将基准日期更改为 1/1/1970 00:00:00 并添加 UTC 调整 returns 次匹配 Explorer。

显然 MSDN 关于基准日期是错误的或已过时。 1/1/1970 似乎也更有可能,因为对应于 POSIX/Unix 时间戳。