便携式可执行堆栈大小和操作 (x64)

Portable executable stack size and operation (x64)

在此图像中:https://i.imgur.com/LIImg.jpg

在代码部分下,它列出了第一条指令,即从堆栈指针中减去 0x28。为什么它需要从应该为 0 的堆栈指针中减去,对吧?还是从上到下开始?您在 PE headers 的哪个位置指定堆栈大小?

堆栈指针不必为 0。事实上,由于 Windows 使用平面内存模型,它会有一些非零值,足够大以允许随着堆栈向下增长需要。

栈指针减一个值的动作在C函数的标准序言中很常见。它允许函数为局部变量保留堆栈 space。有时,编译器会添加自己的局部变量以帮助进行某些优化,或者如果您选择在运行时检查堆栈缓冲区溢出,则可以帮助链接到程序的某些堆栈检查函数。

您可以在 PE 可执行文件中使用 DUMPBIN 实用程序和 /HEADERS 选项查看已提交和保留的堆栈 space。您可以使用链接器选项更改保留和提交的堆栈大小(在 Visual Studio 中)