如何确定 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 时间戳。
我公司使用的软件在其关于部分的页脚列出了 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 时间戳。