栈帧的作用
栈帧就是利用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位。
本文作者:乘舟凉
本文链接:https://www.cnblogs.com/czlnb/p/14715942.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步