2012-07-26 43 views
0

我偶然發現了一個問題,希望你能幫助我理解。PE部分爲什麼在運行之間改變?

在我的應用程序中,我有一個快照函數,它將所有代碼+只讀數據段複製(ReadProcessMemory或memcpy,相同結果)並將它們寫入文件。然後我有一個驗證函數來讀取文件,並對文件中的內容和內存上的內容執行memcmp。

如果我運行快照功能,然後在同一個會話中運行驗證功能,它會一直說它們是相同的,無論我運行驗證多少次。

當我在一個會話中拍攝快照,然後重新啓動應用程序並運行驗證時,如果內存是相同的,它看起來完全是隨機的,有時適用於重新啓動應用程序的3-4次,但遲早會失效, t認爲文件中的數據與pe節代碼相同。

這裏的運行之間的PE代碼段的比較的鏈接:

http://i45.tinypic.com/4kad7b.jpg

它總是同樣的事情,它是改變一個角色到另一個(?在這種情況下升高1),但從什麼角色總是不同的。

任何人都可以解釋爲什麼發生這種情況?應該是這樣嗎?如果是這樣,爲什麼?或者我做錯了什麼?

注意:我已經在調試和發佈時都測試了這個版本,不管有沒有附加調試器。

回答

3

出於安全原因,現代操作系統會隨機化進程內存中的佈局。該機制被稱爲Address Space Layout Randomization (ALSR)

如果可執行文件中存在漏洞,這使得通過攻擊將外部代碼注入應用程序變得更加複雜。

+0

是的,我發現之前看到的鏈接,除非我錯過了什麼,這不是什麼導致我的問題。我將文件中的相對地址保存到內存中,並且在讀取文件時將其映射到絕對地址,並考慮新模塊地址(PE數據所在的位置)。正如我們在比較中看到的那樣,數據幾乎完全相同,只是在某些地方1個字節被替換爲另一個字節。 – user1553880 2012-07-26 08:38:25

+0

現在我明白了,模塊更改了我所考慮的地址,但問題是PE代碼段在內存中加載時包含絕對地址,這些地址在PE文件中.reloc段的幫助下修改exe運行。 所以我需要做的就是使用.reloc節來修改保存的文件中的地址,然後再進行比較。 – user1553880 2012-07-26 09:35:48

相關問題