64 bit 可移植可执行文件堆栈大小和操作(x64)

64 bit 可移植可执行文件堆栈大小和操作(x64),64-bit,portable-executable,64 Bit,Portable Executable,在此图像中: 在代码部分下,它将第一条指令列为从堆栈指针中减去0x28。为什么它需要从应该是0的堆栈指针中减去,对吗?还是从顶部开始,然后向下工作?在PE头中的何处指定堆栈大小?堆栈指针不必为0。事实上,由于Windows使用平面内存模型,它将具有一些非零值,足够大,可以在需要堆栈时向下增长 在C函数的标准序言中,通常可以找到将值减去堆栈指针的操作。它允许函数为局部变量保留堆栈空间。有时,如果您选择在运行时检查堆栈缓冲区溢出,编译器会添加自己的局部变量以帮助进行某些优化,或者帮助链接到程序的某些

在此图像中:


在代码部分下,它将第一条指令列为从堆栈指针中减去0x28。为什么它需要从应该是0的堆栈指针中减去,对吗?还是从顶部开始,然后向下工作?在PE头中的何处指定堆栈大小?

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

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

通过在PE可执行文件上使用带有/HEADERS选项的DUMPBIN实用程序,可以在该可执行文件中查看提交的和保留的堆栈空间。您可以使用链接器选项(在Visual Studio中)更改保留堆栈和提交堆栈的大小