栈帧(stack frame)是在程序的运行时栈中分配的内存块,用于特定的函数调用

如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存

1.传给函数的参数的值需要存储到函数能够找到它们的位置

2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们

在将控制权转交给函数之前,编译器会插入代码,将函数参数放入栈帧内,并分配足够的内存,以保存函数的局部变量

函数的返回地址也存储在新的栈帧内

使用栈帧使得递归成为可能,因为每个递归函数调用都有它自己的栈帧,这恰好将当前调用与前一次调用分隔开来。

调用一个函数时的步骤:

(1) 调用方将被调用函数所需的参数放到该函数的调用约定指定的位置,如果参数被放到运行时栈上,该操作可能导致程序的栈指针发生改变

(2) 调用方将控制权转交给被调用的函数,这个过程通常由 x86 CALL 或 MIPS JAL 等指令执行,然后,返回地址被保存到程序栈或 CPU 寄存器中

(3) 如有必要,被调用的函数会配置一个栈指针,并保存调用方希望保持不变的任何寄存器值

帧指针是一个指向栈帧位置的寄存器,栈帧内的变量根据它们与帧指针所指向的位置的相对距离来引用

(4) 被调用的函数为它可能需要的任何局部变量分配空间,一般通过调整程序栈指针在运行时栈上保留空间来完成

(5) 被调用的函数执行其操作,可能返回一个结果,该结果通常被放置到一个特定的寄存器中,或者放置到函数返回后调用方可立即访问的寄存器中

(6) 函数完成其操作后,任何为局部变量保留的栈空间将被释放,通常逆向执行第(4)步中的操作就可以完成这个任务

(7) 如果某个寄存器的值还为调用方保存(第(3)步)着,就会把它恢复到原始值,包括恢复调用方的帧指针寄存器

(8) 被调用的函数将控制权返还给调用方,实现这一操作的主要指令是 x86 RET 和 MIPS JR,该操作可能还会从程序栈中清除一个或多个参数

(9) 调用方重新获得控制权后,可能需要删除程序栈中的参数,这时可能需要对栈进行调整,来将程序栈指针恢复到第(1)步以前的值

第(3)步和第(4)步通常在进入函数时执行,它们共同称为该函数的序言

第(5)步则代表函数的主体,是调用一个函数时执行的全部操作

第(6)步到第(8)步一般在函数结束时执行,它们共同构成该函数的尾声

IDA Pro 权威指南学习笔记(十) - 栈帧的更多相关文章

  1. IDA Pro 权威指南学习笔记(十四) - 操纵函数

    IDA 无法定位一个函数调用,由于没有直接的方法到达函数,IDA 将无法识别它们 IDA 可能无法正确确定函数的结束部分,需要手动干预,以更正反汇编代码中的错误 如果编译器已经将函数分割到几个地址范围 ...

  2. IDA Pro 权威指南学习笔记(十二) - IDA 中的注释

    注释有助于以一种更高级的方式描述汇编语言指令序列 IDA 提供了几种不同类型的注释,每种注释适用于不同的目的 使用 Edit -> Comments 命令的选项,可以为反汇编代码清单中的任何一行 ...

  3. IDA Pro权威指南学习笔记(一)

    一直不懂逆向,最近刚好不忙,于是学习逆向,用来做笔记,顺便和大家分享交流. 参考书籍<IAD PRO权威指南> 工具: PETools: ETools 是另一款很好的PE文件编辑工具,以前 ...

  4. IDA Pro 权威指南学习笔记(五) - IDA 主要的数据显示窗口

    在默认配置下,IDA(从 6.1 版开始)会在对新二进制文件的初始加载和分析阶段创建 7 个显示窗口 3 个立即可见的窗口分别为 IDA-View 窗口.函数窗口和消息输出窗口 可以通过 View - ...

  5. IDA Pro 权威指南学习笔记(十一) - 名称与命名

    多数情况下,要修改一个名称,只需单击想要修改的名称(使其突出显示),并使用快捷键 N 打开更名对话框 右击需要修改的名称,并在出现的上下文菜单中选择 Rename 选项,也可以更改名称 参数和局部变量 ...

  6. IDA Pro 权威指南学习笔记(十三) - 基本代码转换

    IDA提供的代码转换包括: 1.将数据转换为代码 2.将代码转换为数据 3.指定一个指令序列为函数 4.更改现有函数的起始或结束地址 5.更改指令操作数的显示格式 代码显示选项 通过 Options ...

  7. IDA Pro 权威指南学习笔记(九) - 数据搜索

    Search -> Next Code 命令将光标移动到下一个包含指令的位置 Jump -> Jump to Function 命令可以打开所有函数,可以迅速选择一个函数并导航到该函数所在 ...

  8. IDA Pro 权威指南学习笔记(八) - 基本 IDA 导航

    导航目标 在分析阶段,IDA 会通过检查二进制文件的符号表生成符号名称,或根据二进制文件引用位置的方式自动生成一个名称 反汇编窗口中显示的任何名称都是导航目标 双击任何一个符号,IDA 将跳转到相应的 ...

  9. IDA Pro 权威指南学习笔记(七) - 其他 IDA 显示窗口

    默认情况下 IDA 不会打开这些窗口,可通过 View -> Open Subviews 命令打开 Strings 窗口(Strings) Strings 窗口中显示的是从二进制文件中提取出的一 ...

随机推荐

  1. Vim技能修炼教程(15) - 时间和日期相关函数

    Vimscript武器库 前面我们走马观花地将Vimscript的大致语法过了一遍.下面我们开始深入看一下Vimscript都给我们准备了哪些武器.如果只用这些武器就够了,那么就太好了,只用Vimsc ...

  2. HTTP 1.1 协议规范

    1. 内容协商 请求一个特殊编码的过程在 HTTP 1.1 规范中称为内容协商:

  3. ios6:新特征介绍

    下面我们分别来看看这些特征的一些介绍: 1.地图     iOS6抛弃了一直用的google map,而使用了自家的地图服务.相应地,MapKit框架也自然变成和Apple自家的地图服务绑定了.随之而 ...

  4. SQL Server, Cannot resolve the collation conflict

    今天遇到一个较为头痛的问题: Cannot resolve the collation conflict between "Chinese_PRC_90_CI_AS" and &q ...

  5. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  6. P2P UPD打洞原理

    转自:http://blog.pfan.cn/fengfei/18828.html 首先先介绍一些基本概念:            NAT(Network Address             Tr ...

  7. Mysql-Proxy 读写分离的各种坑,特别是复制延迟时

    延迟问题读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSyncReplicationDesign补丁. 端口问题MySQL-Proxy缺省使用的是4040端口,如果你想透明的把 ...

  8. SpringBoot 接收 单个String入参之解决方案

    场景: 在做接口时,有的时候,接口入参只需要一个参数,如果将一个参数封装成一个对象很麻烦,故有了以下方式: 思路: spring自带的参数解析器貌似是不具备这个能力的,所有自定义 方式方法: 1.定义 ...

  9. strlen和sizeof的长度区别

    strlen返回字符长度 而sizeof返回整个数组占多长,字符串的\0也会计入一个长度

  10. Loadrunner录制脚本之浏览器

    Loadrunner录制脚本之浏览器 用Loadrunner录制脚本,尤其现在的IE浏览器版本升级较快,脚本的录制有时候还是需要集RP.Luck的,当然,Loadrunner对于IE的支持算最好的了, ...