我一直在Windows XP Pro 64位下爲C和C++項目使用Visual Studio 2005一段時間。我經常在調試器中使用的一個常用技巧是記住程序以前的調試運行(例如0x00000000FFAB8938
)中的數字指針值,將其添加到具有適當類型轉換(例如((MyObject *) 0x00000000FFAB8938)->data_field
)的觀察窗口中,然後在下一次調試期間觀察該對象佔用的內存。在許多情況下,這是相當方便和有用的事情,因爲只要代碼保持不變,預計分配的內存佈局將保持不變也是合理的。總之,它的工作原理。Windows Vista下的指針穩定性
但是,最近我開始在Windows Vista(家庭高級版)64位筆記本電腦上使用相同版本的Visual Studio。奇怪的是,在這個設置中使用這個技巧要困難得多。實際的內存地址似乎經常從運行中改變而沒有明顯的原因,即使程序的代碼完全沒有改變。看起來,實際的地址並沒有完全隨機地改變,它只是從一個固定的或多或少穩定的一組值中選擇一個值,但無論如何,這使得這種類型的內存觀察變得更加困難。
有沒有人知道在Windows Vista中這種行爲的原因?什麼導致了內存佈局的變化?是否有外部入侵其他[系統]進程的進程地址空間?或者它是Vista下堆API實施的一些怪癖/特徵?有什麼辦法可以防止這種情況發生?
在Linux下,由於堆緩衝區溢出攻擊的時間越來越長。也許它最終也由MS實施? – jdehaan 2009-10-21 18:32:17
嗯,我知道這件事,但是AFAIK只有在你重新啓動copmputer時纔有效。更確切地說,我聽說MS實施了它們的版本,以便在每次啓動時對它們進行隨機化(不知道它在Linux上如何工作)。所以,我在Vista中觀察到的行爲似乎並不相關。 – AnT 2009-10-21 18:36:39
雖然這可能是某種東西。我正在運行VS 2005,它是可以調試64位應用程序的32位應用程序。 AFAIK,它通過MS的遠程調試機制工作。每當我從VS 2005啓動一個64位應用程序(因此導致事件被隨機化),Vista會不會「啓動」一個新的64位環境? – AnT 2009-10-21 18:38:48