2011-08-13 43 views
1

我已經用C++編寫了一個包含單個EXE文件的小應用程序。md5sum包含總和本身的文件?

我想在其「about」對話框中輸入可執行文件的md5sum。它應該靜態地嵌入到可執行文件中(以便可以從十六進制編輯器中看到),而不是實時計算。

+1

假設文件內容本身不能更改 - 不可能(由於在答案中陳述的原因)。如果文件內容可以改變(例如,這只是爲了表明它可以完成,如果文件本身不需要相同),那麼我認爲可以創建這樣的文件,即使*非常困難*。請參閱「Wang e.t. all」的研究。 – 2011-08-13 22:48:21

+0

計算哈希時,您需要一些機制來跳過包含的哈希。你應該考慮使用更好的散列函數,即md5。 – CodesInChaos

+0

@pst:你指的是哪篇論文? –

回答

0

由於@Shi & @matthewdaniel已經說過,這不能直接完成。
然而幾個解決方法是可能的:

  • 計算應用程序的MD5和包裝容器的應用程序,將簡單地提取出來,並檢查它裏面的可執行文件的MD5
  • 編譯代碼和散列只有代碼分段或其他分段(數據除外),並添加MD5校驗碼。這將起作用,因爲MD5字符串將存儲在數據段中,並保持任何其他存儲段的預先計算的散列的有效性。
+0

好的建議,我知道這是不可能的:/ –

0

這是不可能的。

如果你輸入md5哈希值到二進制文件中,二進制文件將會改變,所以md5哈希值也會改變。如果您創建一個新的,並嘗試將其添加到二進制文件,二進制文件將再次更改。

所以最好的做法是將哈希放入一個文件中,然後讀取該文件並顯示其內容。

另一種方法是創建二進制文件的md5哈希,然後將其附加到可執行文件。爲了獲取該值,您需要讀取二進制文件的最後32個字節,並將其顯示爲md5。當然,如果你創建了一個完整的可執行文件的散列,它將不會匹配散列 - 你必須創建除最後32個字節之外的可執行文件的散列。

如果您以原始格式(基數256而不是基數16)存儲128位md5散列,則只需要16個字節。

-1

只要將md5添加到文件中,該文件將具有不同的md5。文件本身無法獲得md5。