栈帧的作用

栈帧就是利用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位。

 

posted @ 2021-04-28 21:51  乘舟凉  阅读(133)  评论(0编辑  收藏  举报