2011-04-26 70 views
2

所以我想弄清楚如何讓我的exe在重新編譯時擁有相同的哈希碼/校驗和。我正在使用FastSum來生成校驗和。目前,不做任何代碼更改,我只是在VS中重建項目,校驗和出現了不同。代碼是用C++編寫的。每個重新編譯後的exe校驗和不同

我不熟悉以這種方式使用哈希碼和/或校驗和,但我做了一些研究並閱讀了一些關於需要一致GUID的內容。但我不知道如何配合校驗和生成程序...

嗯,我會離開它,在此先感謝。

回答

0

從我記得,EXE格式包含一個構建時間戳記,因此包含該時間戳記的exe的散列值在每次重新編譯時都會發生變化。

+0

Hrm,好的,我會考慮修復時間戳。謝謝! – 2011-04-26 18:48:59

3

你是否檢查過前面的差異?我懷疑編譯器/鏈接器將日期或時間插入到二進制文件中,因此每個二進制文件將與另一個不同。或者它可能更糟糕,有時編譯器/鏈接器在他們自己的系統內存中構建靜態表,然後將其複製到二進制文件中,例如,您有9個字節的東西,並且出於對齊原因編譯器選擇在二進制文件中使用12個字節,我已經看到編譯器/鏈接器將該計算機的系統內存中的任何3個字節作爲參數並將其複製到文件中。理想情況下,您希望這些工具將它們正在使用的內存清零,以便獲得可重複的結果。

基本上做一個文件之間的二進制差異,你應該找出他們不匹配的原因。

+0

另外,即使編譯器/鏈接器沒有插入日期/時間信息,代碼中對'__DATE__'的任何引用都會產生相同的效果。 – Clifford 2011-04-26 18:53:18

+0

男人,我希望它不會與編譯器/鏈接器決定有關!我知道在我們編寫的代碼中沒有提及[code] __ DATE __ [/ code],但這並不意味着我沒有使用它。我會做一個二進制差異,看看會發生什麼,謝謝你們。 – 2011-04-26 19:05:16

+0

我做了一個二進制差異,有兩個不同的部分。一開始是正確的,我認爲它是標題的一部分,但我不知道如何確切地確定它是什麼。有一行「這個程序不能在DOS模式下運行」。換行符,然後是「$ 00000000000000」,下一個塊是第一個區別。第二部分大部分是文本,大概是數據的一半,並且必須與編譯器移動東西有關,只是因爲它感覺像... – 2011-04-26 19:56:43

0

這是一個託管二進制文件嗎?託管的二進制文件有一個GUID部分,從構建到構建都有變化,您可以做的很多事情來阻止它。

通過運行「link/dump/all [filename]」或「link/dump/disasm [filename]」,可以更好地瞭解二進制文件中的更改。/all選項會顯示所有十六進制值以及它們的ascii等價值,而/ disasm選項將反彙編代碼並在彙編中顯示給您,它可以更容易閱讀,但可能會忽略可能存在的一些微小差異導致哈希值改變。