函数调用过程(反汇编分析)
2015-06-05 16:53
239 查看
1:
将函数的实参压栈(值传递是将值压榨,引用传递是将其偏移量,即有效地址压栈---对应于内存的分段管理模式)
2.call 函数名
这一步具体的操作就是将当前执行指令的地址压栈,为了函数结束后能够还原现场,(如果是near call,就将函数调用时的指令偏移量压栈,然后再将被调用函数的入口
地址的偏移量送入指令指针寄存器ip,即实现了程序的转移;如果是远调用,压栈时多压入该指令下的段寄存器cs的值,再将入口程序的偏移地址和段地址送入ip和cs)
3.进入函数
进入函数后先保护ebp将其压栈(在多层次递归调用中,ebp可能表示上一层次执行时的堆栈栈顶),然后mov ebp,esp 此时ebp指向栈顶,后面访问栈中的数据
都是通过ebp(寄存器相对寻址方式)来访问的,此时[ebp+n]是访问实参,[ebp-n]是访问函数内的局部变量。
然后就是通过esp-n的操作来预留一定的内存空间交给局部变量使用,然后就是将ebx,esi,edi保护起来,因为函数中可能会使用这三个寄存器,然后再将刚刚分配的
空间初始化(0CCCCCCCCH,一个字节cc对应汉字“烫”)
4.执行函数内部操作(如果传入的实参是地址值,则需要经过两次操作才能存取其值,一次通过ebp相对寻址获得去传递的值---地址值,再通过直接寻址方式存取其值)
5.函数调用结束(如果有返回值,通过eax寄存器传递)
函数调用结束时,先将最顶层的ebx,esi,edi还原--出栈,再将ebp的值给esp--恢复调用前堆栈的第一步即释放了局部变量,ret指令,通过将此时在栈顶的地址出栈还原出现场-----改变指令指针寄存器ip和cs段寄存器的值。
6.最后一步调节平衡--这是调节堆栈平衡的第二步
add esp,N
消除调用函数时时产生的参数数据。
将函数的实参压栈(值传递是将值压榨,引用传递是将其偏移量,即有效地址压栈---对应于内存的分段管理模式)
2.call 函数名
这一步具体的操作就是将当前执行指令的地址压栈,为了函数结束后能够还原现场,(如果是near call,就将函数调用时的指令偏移量压栈,然后再将被调用函数的入口
地址的偏移量送入指令指针寄存器ip,即实现了程序的转移;如果是远调用,压栈时多压入该指令下的段寄存器cs的值,再将入口程序的偏移地址和段地址送入ip和cs)
3.进入函数
进入函数后先保护ebp将其压栈(在多层次递归调用中,ebp可能表示上一层次执行时的堆栈栈顶),然后mov ebp,esp 此时ebp指向栈顶,后面访问栈中的数据
都是通过ebp(寄存器相对寻址方式)来访问的,此时[ebp+n]是访问实参,[ebp-n]是访问函数内的局部变量。
然后就是通过esp-n的操作来预留一定的内存空间交给局部变量使用,然后就是将ebx,esi,edi保护起来,因为函数中可能会使用这三个寄存器,然后再将刚刚分配的
空间初始化(0CCCCCCCCH,一个字节cc对应汉字“烫”)
4.执行函数内部操作(如果传入的实参是地址值,则需要经过两次操作才能存取其值,一次通过ebp相对寻址获得去传递的值---地址值,再通过直接寻址方式存取其值)
5.函数调用结束(如果有返回值,通过eax寄存器传递)
函数调用结束时,先将最顶层的ebx,esi,edi还原--出栈,再将ebp的值给esp--恢复调用前堆栈的第一步即释放了局部变量,ret指令,通过将此时在栈顶的地址出栈还原出现场-----改变指令指针寄存器ip和cs段寄存器的值。
6.最后一步调节平衡--这是调节堆栈平衡的第二步
add esp,N
消除调用函数时时产生的参数数据。
相关文章推荐
- 46.输入一个整数取出偶数位,并按照原来的顺序输出
- 用栈实现拓扑排序
- 站立会议01(二期)
- laravel/laravel和laravel/framework有何区别?
- ORACLE恢复删除的数据
- 重建数据库表所有统计信息
- 在Linux系统中使用tar命令压缩和解压文件的教程
- iOS开发多线程篇—自定义NSOperation
- select函数详解及实例分析
- Win7下硬盘安装Ubuntu 12.04.4 LTS双系统
- <转>如何进行code review
- Python正则表达式指南
- 除了iOS 9还有很多 苹果WWDC 2015前瞻
- 笔记112--Android打开各种文件(setDataAndType)
- java琐碎
- 软件工程---软件需求分析
- Android软件开发之发送短信与系统短信库解析
- JS DateTime 格式化
- 64位系统装oracle(ora-12154 )
- IOS代码注释小结