IDA会尽其所能跟踪函数内每一条指令上的栈指针的变化。IDA跟踪这种变化的准确程度,在很大程度上影响着函数的栈帧布局的准确程度。如果IDA无法确定一条指令是否更改了栈指针,你就需要手动调整栈指针 
如果一个函数调用了另一个使用stdcall调用约定的函数,就会出现上述情况,这是最简单的一种情况。如果被调用的函数位于IDA无法识别的共享库中(IDA拥有与许多常用库函数的签名和调用约定有关的信息),那么,IDA并不知道该函数使用了stdcall调用约定,也就无法认识到:被调用的函数会将栈指针修改后返回。因此,IDA会为函数的剩余部分提供一个错误的栈指针值。

要进行栈调整,首先应选中进行调整的地址,并选择Edit▶Func-tions▶Change Stack Pointer(热键为ALT+K),然后指定栈指针更改的字节数(或右键菜单选中Change Stack Pointer)

 
注意更改的是选中的指令对栈的更改量,另栈是向低地址增长的,所以看图中指令,当前地址相对原始 esp小了0x8,指令是call callflow(int),而callflow函数是__stdcall,所以DIFFERENCE 为4(内部平衡堆栈,向上增长4)

如果IDA不能准确计算出callflow为__stdcall,那么就会出错(如前面提到的callflow为IDA不能识别的共享库的导入函数),那么我们需要在每个callflow的调用处进行栈调整,这很繁琐,而且容易出错 
对于任意函数(包括库函数,导入函数),都可以选中此函数,再使用EDIT▶Functions▶Edit Functions… 
 
如果是导入函数,双击到.rdata目录,然后再使用EDIT▶Functions▶Edit Functions… 

栈调整对应Purged bytes,即

函数特性

函数名称(Name of function): 
- 提供另外一种更改函数名称的方法 
起始地址(Start address): 
- 函数中第一条指令的地址。通常,IDA会在分析过程中,或根据创建函数时所使用的地址,自动识别这个地址。 
结束地址(End address): 
- 函数中最后一条指令之后的地址。通常,它是函数的返回语句之后的指令的地址。记住,这个地址并不是函数的一部分,而是函数的最后一条指令之后的地址。 
局部变量区(Local variables area): 
- 函数的局部变量专用的栈字节数。多数情况下,IDA会通过分析函数的栈指针的行为,自动计算出这个值。 
保存的寄存器(Saved registers): 
- 为调用方保存寄存器(见图6-4)所使用的字节数。IDA认为保存的寄存器区域放在保存的返回地址顶部、与函数有关的所有局部变量的下方。一些编译器选择将寄存器保存在函数局部变量的顶部。IDA认为保存这些寄存器所使用的空间属于局部变量区域,而非保存的寄存器区域。 
已删除字节(Purged bytes): 
- 已删除字节表示当函数返回调用方时,IDA从栈中删除的参数的字节数。对cdecl函数而言,这个值始终为0。对stdcall函数来说,这个值表示传递到栈上的所有参数占用的空间。在x86程序中,如果IDA观察到程序使用了返回指令的RET N变体,它将自动确定这个值。 
帧指针增量(Frame pointer delta): 
- 有时候,编译器可能会对函数的帧指针进行调整,使其指向局部变量区域的中间,而不是指向保存在局部变量区域底部的帧指针。调整后的帧指针到保存的帧指针之间的这段距离叫做帧指针增量。

属性: 
不返回(Does not return): 
- 函数不返回到它的调用方。如果调用这样的函数,在相关的调用指令之后,IDA认为函数不会继续执行 
库函数(Library func): 
- 这个属性将一个函数标记为库代码 
基于BP的帧(BP based frame): 
- 这个特性表示函数利用了一个帧指针。多数情况下,你可以通过分析函数的“序言”来自动确定这一点。但是,如果通过分析无法确定给定的函数是否使用了帧指针,就可以手动选择这个特性。如果你手动选择了这个特性,一定要相应地调整保存的寄存器的大小(通常指根据保存的帧指针的大小增大)和局部变量的大小(通常指根据保存的帧指针的大小减少)。对基于帧指针的帧而言,使用帧指针的内存引用被格式化,以利用符号栈变量名称,而非数字偏移量。如果没有设置这个特性,则认为栈帧引用与栈指针寄存器有关。 
BP等于SP(BP equals to SP): 
- 一些函数将帧指针配置为在进入一个函数时指向栈帧(以及栈指针)的顶端。在这种情况下,就应设置该属性。基本上,它的作用等同于将帧指针增量的大小设置为等于局部变量区域

19.IDA-栈指针调节、设置函数特性相关推荐

  1. 9.IDA-重新设置函数类型、创建数组结构

    1.重新设置函数类型 写一个简单的代码做测试: [cpp] view plaincopy int fun(int a, double b) { return 0; } int _tmain(int a ...

  2. Go 函数特性和网络爬虫示例

    爬取页面 这篇通过网络爬虫的示例,来了解 Go 语言的递归.多返回值.延迟函数调用.匿名函数等方面的函数特性. 首先是爬虫的基础示例,下面两个例子展示通过 net/http 包来爬取页面的内容. 获取 ...

  3. 【ES6 教程】第一章 新的ES6语法04—如何设置函数参数的默认值

    英文 | https://www.javascripttutorial.net 翻译 | 杨小爱 在本节教程中,我们将学习如何在 ES6 中处理 JavaScript 默认参数. TL;DR func ...

  4. OpenGL的glViewPort窗口设置函数实现分屏

    OpenGL的glViewPort窗口设置函数实现分屏 之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPo ...

  5. 19号笔刷是哪个_19号笔刷怎么设置?超详细的19号笔刷设置!

    原标题:19号笔刷怎么设置?超详细的19号笔刷设置! 今天主要讲的是如何设置ps绘画用的19号笔刷,其实你们常说的神奇19号笔刷就只是19号大小的笔,然后有压感.形状大小.传递这些而已. 对小白来说看 ...

  6. R语言当前目录获取及设置函数(getwd setwd)实战

    R语言当前目录获取及设置函数(getwd & setwd)实战 目录 R语言当前目录获取及设置函数(getwd & setwd)实战 #基本语法

  7. python3 设置函数执行超时 eventlet模块

    实际项目中会涉及到需要对有些函数的响应时间做一些限制,如果超时就退出函数的执行,停止等待. 可以利用python中的装饰器实现对函数执行时间的控制. python装饰器简单来说可以在不改变某个函数内部 ...

  8. 改变服务器控件的显示属性,2.6.1 设置Style特性和其他属性

    2.6   使用代码处理HTML服务器控件 在实际开发中,有时候并不能够预先知道页面需要多少个文本输入框.选择框.表的行列数或者其他控件,因为这些可能是由临时查询的数据多少或者其他原因而决定.这就要求 ...

  9. python函数设置默认参数_Python教程如何设置函数的默认参数

    今天马哥教育要跟大家分享的文章是Python教程如何设置函数的默认参数?上一讲我们结束了用文件保存游戏的Python内容,这一讲我们来补充一个小技巧,关于设置函数默认参数的哦!Python入门新手和正 ...

最新文章

  1. It is not safe to rely on the system's timezone settings
  2. R语言按组聚合求和实战(sum a variable by group):使用aggregate函数按组聚合求和、使用tapply函数按组聚合求和、按组聚合求和(使用dplyr包)
  3. lcd和服务器同时显示温度,为什么LCD1602不能同时显示温度和时间?
  4. C语言训练题-铺草坪简易版
  5. windows编程点滴(四)之线程的同步
  6. c++如何获取文件时间_3分钟短文 | PHP 如何优雅地获取文件扩展名?别再explode了
  7. LINUX系统下跑分测试脚本:unixbench.sh
  8. 编写一个程序,新建一个文件:d:\abc.txt,从键盘输入abc.txt内容(不超过100个字符)。然后新建另外一个文件:d:\def.txt,将abc.txt的前10个字符复制到def.txt上
  9. 自考《数据库系统原理》(3)之关系模式设计理论
  10. 如何使用在线MP3工具简单剪切音乐
  11. 调用百度地图进行路线规划
  12. What Is 'FTW'? What Does It Mean?
  13. WEB网站压力测试教程详解
  14. npoi使用Excel模板下载数据
  15. unity 官方案例之刚体控制人物移动
  16. 动手做一个小机器人——语音控制篇
  17. NCMMSC 2021丨希尔贝壳参加第十六届全国人机语音通讯学术会议
  18. python中哈希表和set的使用
  19. Scrapy爬虫,养眼图片实战
  20. vscode插件turbo console log快捷键无法使用

热门文章

  1. JWT令牌组成和安全校验讲解
  2. 上传图片-服务端-Api接口定义
  3. hadoop的安装-配置文件修改
  4. ES6新特性之Promise
  5. 电脑装服务器系统好处,服务器选用Linux系统的几个好处
  6. Spring cloud集成Rabbitmq
  7. flyway版本号_数据库版本管理工具-flyway
  8. 远程管理,无需在机房来回穿梭
  9. 大数据视域下网络涉军舆情管控研究
  10. 使用redis的发布订阅模式实现消息队列