如何确定VB app编译/创建日期

时间:2015-04-03 18:11:26

标签: vb.net vb6 updates decompiling

我的公司使用一种软件,在它的页脚中列出了2001 - 2002年的部分列表。这是否足以让人相信该计划在2001 - 02年度进行的最后一次重大改革或更新?

如果没有,有没有办法反编译软件,用VB6编写?

2 个答案:

答案 0 :(得分:5)

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

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)

输出:

  

应用程序编译时间约为:4/6/2004 11:54:07 AM

我使用一些实际的旧VB6应用程序以及一些x86 VB.NET应用程序对此进行了测试,并且返回的DateTime与CreatedDate和/或Explorer报告的修改日期相比较。

最初时间已经过了3个小时。 MSDN docs明确指出:

  

此字段包含自1969年12月31日下午4点起的秒数。

但它已经过了3小时,我的TZ距离美国东海岸,西雅图或GMT不到3。一个快速的谷歌产生this article by Jeff Atwood(其中包括另一个PE读者)。将基准日期更改为1/1/1970 00:00:00并添加UTC调整将返回与Explorer匹配的时间。

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

答案 1 :(得分:1)

从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