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,这意味着堆栈比进程的文本部分低(!?)。为什么是这样?据我所知(我在 Linux 中也用 gdb 做过同样的事情),堆栈应该在高内存和低文本 - 就像许多书中所说的那样。

有什么我不知道的吗?

4

2 回答 2

4

线程堆栈可以位于用户模式虚拟地址空间内的任何地址范围。VMMap显示进程已提交的虚拟内存类型的细分。 在此处输入图像描述

于 2013-03-23T07:54:04.327 回答
2

堆栈应该在高内存和低文本

这是一种误解。完全由操作系统来选择如何在进程的虚拟内存中布局。

特别值得注意的是:

  • 没有一个单独的代码段:可执行文件和 DLL 可以在不相邻的地址范围加载。
  • 没有一个单一的进程堆栈:每个线程都有自己独立的堆栈。同样,没有理由期望它们在内存中彼此相邻。

此外,随机化内存中事物的位置被认为是良好的安全实践。请参阅地址空间布局随机化

于 2013-03-23T07:51:48.207 回答