2015-04-03 71 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

相關問題