码迷,mamicode.com
首页 > 编程语言 > 详细

《C++反编译与逆向分析技术揭秘》之学习笔记03--函数的调用方式

时间:2014-12-11 23:45:51      阅读:404      评论:0      收藏:0      [点我收藏+]

标签:style   http   使用   sp   on   div   bs   ef   amp   

※函数的调用方式

EBP:扩展基址指针寄存器(extended base pointer) 其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。
ESP:(Extended stack pointer)是指针寄存器的一种,用于指向栈的栈顶。

_cdecl:C/C++默认的调用方式,调用方平衡栈,不定参数的函数可以试用。
bubuko.com,布布扣 
调用方:
1、参数压栈。esp-=4
2、调用函数。
3、实现栈平衡。esp+=4
bubuko.com,布布扣
 此处的printf也是同样道理
0x004010CB、0x004010CC两处压入参数,共8个字节
0x004010D6平衡esp。esp+=8
 
_stdcall:被调方平衡栈,不定参数的函数无法使用。
 bubuko.com,布布扣
调用方:
1、参数压栈。esp-=4
2、调用函数。
bubuko.com,布布扣
 被调方:0x00401099 ret 4,平衡栈,esp+=4
 

 

_fastcall:寄存器方式传参,被调方平衡栈,不定参数的函数无法使用。 只使用2个寄存器ecx,edx,超出部分转成栈传递。
bubuko.com,布布扣
调用方:
1、第一、二个参数用了寄存器
2、超出部分压入栈。
bubuko.com,布布扣 
被调方:0x0040114d ret 8,平衡栈,esp+=8
printf同理:
0x00401123、0x00401127、0x0040112B、0x0040112F、0x00401130一共5次压入栈共20(0x14)个字节。
0x0040113A 平衡栈  esp+=0x14

执行至0x00401130时,传入的4个参数1,2,3,4分别存放于ebp-4、ebp-8、ebp+8、ebp+0xC中,那么ebp和ebp+4存放的是什么呢?
通过0x00401101可以看出此时的ebp是栈的底部,指向了刚才0x00401100保存的前一次ebp的值。
而ebp+4保存的是0x0040137B call 的下一条指令地址,在调用call时会自动把下一条指令地址压入栈。
bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣

函数栈帧的粗略图
bubuko.com,布布扣

《C++反编译与逆向分析技术揭秘》之学习笔记03--函数的调用方式

标签:style   http   使用   sp   on   div   bs   ef   amp   

原文地址:http://www.cnblogs.com/seven1979/p/4158642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!