2015-04-03 70 views
1

我的公司使用的软件在其页脚部分列出了2001-2002年。这是否有足够的理由相信该计划最后一次重大改革或更新将在2001 - 02年度完成?如何确定VB应用程序的编译/创建日期

如果没有,是否有反编译软件的方法,它是用VB6编写的?

+0

关于约会的日期只是意味着这是开发人员最后一次更新该文本的时间,尽管它可能很接近。反编译不会产生答案 - 你为什么在意? – Plutonix 2015-04-03 18:17:35

+0

由于我的公司与我们正在使用的软件的公司签订合同......他们说他们定期更新,但用户界面似乎严重过时,关于菜单通常是上次更新时间的良好指示。总结我们正在寻找一种脱离合同的方式,并相信这是关键。必须通过挖掘代码或其他方式来找出某种方法。 – Rojito 2015-04-03 18:28:18

+0

查找运行该软件的组织中最早的机器。在资源管理器中找到磁盘文件,然后右键单击,选择属性 - 检查“创建”日期。这将是在该磁盘上创建文件的日期 - 可能是安装日期,恢复日期或上次更新安装日期。自那时起,他们无法更新或至少向该计算机分发新版本。我怀疑它会说200X,除非电脑运行XP并且本身是14岁 – Plutonix 2015-04-03 18:36:56

回答

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返回的是与由Explorer报告的CreatedDate和/或修改日期相比的现货。

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

该字段包含自1969年12月31日下午4点以来的秒数。

但它已经关闭了3个小时,而我的TZ距离美国东海岸,西雅图或格林威治标准时间还不到3英里。快速谷歌取得了this article by Jeff Atwood(其中包括另一个PE阅读器)。将基准日期更改为1/1/1970 00:00:00并添加UTC调整将返回匹配资源管理器的时间。

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

相关问题