2010-09-07 81 views
4

我看了一個ASLRed dll圖像的基於32位進程的地址。
這不是一個完全的隨機化。它只是隨機化了1/2概率。微軟的ASLR很奇怪

例如,一旦我加載dll,圖像加載在0x12345678
我再次載入圖像,圖像上加載0x23456789(基址被改變!)
但我再次加載圖像
0×12345678
0x23456789
0×12345678
0x23456789

。 ..

他們爲什麼這麼做?
它是否爲崩潰報告的頻率?(獲得重新部署的dll的相同崩潰地址)

回答

11

這是設計。通常情況下,Windows首次加載DLL時會爲ASLR DLL選擇首選基地址,然後它會一直使用該地址,直到系統重新啓動。這樣,DLL就會映射到加載它的每個進程的相同地址,從而允許共享代碼頁。

但是,如果從每個進程卸載了一個DLL,系統有時會在下次加載該DLL時選擇不同的基址。它這樣做是爲了減少虛擬地址空間碎片,而不是出於安全原因。這是你的情況似乎正在發生的事情。

1

它記錄在one of 1 of 256 possible starting addresses

但我不認爲它甚至適用於一個進程,但共享DLL的。

ASLR:is not on by default for process images。這是一個選擇的事情,對於兼容性。(3

地址空間佈局隨機化 (ASLR)

ASLR移動可執行映像到 隨機位置,當系統啓動時, 使其更難對於利用代碼 可預測地操作。對於支持ASLR的組件 ,其加載的所有組件 還必須支持ASLR。例如,對於 示例,如果A.exe使用B.dll和 C.dll,則三者都必須支持ASLR。默認情況下,Windows Vista和更高版本將 隨機化系統DLL和EXE,但由ISV創建的 DLL和EXE必須選擇 以支持使用 /DYNAMICBASE鏈接器選項的ASLR。

ASLR還隨機化堆和棧 內存:

  • 當應用程序創建的 Windows Vista的堆和以後,堆 管理器將創建一個堆在 隨機位置,以幫助減少 嘗試利用基於堆緩衝區溢出的 成功的機會。 對於在Windows Vista和更高版本上運行 的所有應用程序,默認啓用堆隨機數 。

  • 當 線程開始與 /DYNAMICBASE,Windows Vista中聯繫在一起的,後來 移動線程的堆棧到一個隨機 位置,以幫助減少的機會 一個基於堆棧的緩衝區溢出 攻擊會成功。

+1

請給我一個文件的URL。 – Benjamin 2010-09-07 02:01:11

+0

謝謝lan。對於EXE PE,我認爲這可能是對的。但對於一個Dll,它仍然有1/2概率。有點奇怪。邁克爾霍華德錯了嗎? - 我當然不相信他錯了。可能有些事我誤解了。 – Benjamin 2010-09-07 03:59:01

0

昨天安裝了新的Win8 RC x64。

小心!

Kernel32.dll(64位版本)在不同進程(當然在單個會話中)中具有不同的基址。只有ntdll.dll的基地址保持不變。我不得不改變代碼,你不能再依靠永久地址Loadlibrary。