栈帧的作用
栈帧就是利用EBP(栈帧指针,请注意不是ESP)寄存器访问栈内局部变量、参数、函数返回地址等的手段。
下面通过一个案例呈现:
先编写一个很简单的程序,但是这个程序一定要用到局部变量或参数,详细代码见下图
Test.cpp
#include <stdio.h> #include <Windows.h> int main(int arg,char **args) { MessageBoxA(0, args[0],"",0);//很简单的一个程序,就是用提示框显示第一个参数而已 }
程序效果如下图所示:
这个我生成了两个版本,一个是正常编译,一个经过编译器优化后去除栈帧的(开启编译器优化选项,白度一下),用ollydebug打开。
正常编译版本,如下图所示。
上图我们可以看到有两处非常明显的利用EBP访问参数和局部变量。
编译器优化版本
从上图可以很明显的看到不仅保存栈底的指令不见了,代码中也不再依赖与EBP访问参数和局部变量,但因为编译器优化直接使用了ESP访问参数了。
编译运行环境:vs2019 windows 10 x64 生产程序32位。