我的公司使用一种软件,在它的页脚中列出了2001 - 2002年的部分列表。这是否足以让人相信该计划在2001 - 02年度进行的最后一次重大改革或更新?
如果没有,有没有办法反编译软件,用VB6编写?
答案 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