2013-03-23 26 views
2

我正在使用Windbg來研究進程內存,並且忍不住注意到人們接受的東西。當你打印出寄存器:爲什麼堆棧低於內存中的文本?

eax=00000000 ebx=008b6f00 ecx=01010101 edx=ffffffff esi=00000000 edi=00465000 
eip=77f9d022 esp=05cffc48 ebp=05cffc54 iopl=0   nv up ei ng nz na po nc 
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000    efl=00000286 

注意,ESP和EBP具有價值比EIP低,這意味着堆棧nthan過程(!?)的文本部分地方更低。爲什麼是這樣?據我所知(我也用gdb在Linux中做過同樣的事情),堆棧應該是高內存和低文本 - 就像很多書中說的那樣。

有沒有我不知道的東西?

+0

存儲器的佈局方式取決於操作系統和CPU。 CPU決定堆棧增長的方式,並決定放置段的操作系統。它確實可能在任何地方,但堆棧增長的方向是一個沉重的影響。他們把它放在任何有意義的地方(並且在某些情況下,更安全)。 – 2013-03-23 06:13:11

+0

這個堆棧還在向下擴展,我不認爲把堆棧放在低於文本的位置上是合理的,這就是爲什麼我要問。你能否更具體地說明爲什麼把棧放低會比使用理論上的存儲器佈局更好? – 2013-03-23 06:32:58

+0

它是關於Windows內存管理的問題嗎? – sergmat 2013-03-23 06:50:25

回答

2

堆被認爲是在高存儲器和文本在低

這是一種誤解。選擇如何在流程的虛擬內存中放置東西完全取決於操作系統。

具體地,值得注意的是:

  • 沒有一個單獨的代碼段:可執行文件和DLL中可以在不相鄰的地址範圍被加載。
  • 沒有一個進程堆棧:每個線程都有自己獨立的堆棧。再次,沒有理由期望這些在記憶中彼此相鄰。

此外,在內存中隨機化事物的位置被認爲是一種很好的安全實踐。見Address space layout randomization

+0

有道理。但我仍然不明白爲什麼他們必須把它放在這樣的地方。猜測它與單獨的堆棧線程在同一虛擬內存空間中有關。所以這裏的判斷是你不能期望在Window進程內存中有清晰的佈局,我是否正確? – 2013-03-23 08:22:00

+0

@PhamTrungNghia:其中一個原因是http://en.wikipedia.org/wiki/Address_space_layout_randomization – NPE 2013-03-23 08:22:52

4

Thread堆棧可位於用戶模式virtual address space內的任何地址範圍。 VMMap顯示了進程提交的虛擬內存類型的細分。 enter image description here

+0

@NPE回答對我來說有點清晰,但是感謝分享一個有用的工具。 – 2013-03-23 08:22:57