资源下载 > 网络资源
客服QQ:1206116161

0day漏洞培训视频教程

_Kiro 于 2016年05月18日 分享资源
(1398)
(0)
举报
本站所有资源均来自于互联网, 如发现有病毒或不能下载, 欢迎举报!

【1】函数调用约定描述了函数传递参数方式和栈帧同工作的技术细节。不同的操作系统、不同的语言、不

 

     同的编译器在实现函数调用时的原理虽然基本相同,但具体的调用约定还是有差别的。这包括参数传

 

     递方式,参数入栈顺序是从右向左还是从左向右,函数返回时恢复堆栈平衡的操作在子函数中进行还

 

     是在母函数中进行。 【见图1<调用方式之间的差异>】

 

     具体的,对于Visual C++来说,可支持以下3种函数调用约定:【见图2<函数调用约定>】

 

【2】如果要明确使用某一种调用约定,只需要在函数前加上调用约定的声明即可,否则默认情况下,VC会

 

     使用_stdcall的调用方式。 除了参数入栈方向和恢复栈平衡操作位置的不同之外,参数传递有时也

 

     会有所不同。例如,每一个C++类成员函数都有一个this指针,在Windows平台中,这个指针一般是用

 

     ECX寄存器来传递的,但如果用GCC编译器来编译,这个指针会作为最后一个参数压入栈中。

 

注意:同一段代码用不同的编译选项、不同的编译器编译链接后,得到的可执行文件会有很多不同。

 

【3】函数调用大概包括以下几个步骤:

 

 (1)参数入栈:将参数从右向左依次压入系统栈中。

 

 (2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。

 (3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。

 (4)栈帧调整:具体包括:

    <1>保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)。

    <2>将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)。

    <3>给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈顶)。

    <4>对于_stdcall调用约定,函数调用时用到的指令序列大致如下:

  push 参数3      ;假设该函数有3个参数,将从右向做依次入栈

  push 参数2

  push 参数1

  call 函数地址   ;call指令将同时完成两项工作:a)向栈中压入当前指令在内存中的位置,即保存返回

                   地址。 b)跳转到所调用函数的入口处。

  push ebp        ;保存旧栈帧的底部

  mov ebp,esp     ;设置新栈帧的底部 (栈帧切换)

  sub esp,xxx     ;设置新栈帧的顶部 (抬高栈顶,为新栈帧开辟空间)

【4】函数返回的步骤如下:

 <1>保存返回值,通常将函数的返回值保存在寄存器EAX中。

 <2>弹出当前帧,恢复上一个栈帧。具体包括:

    (1)在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间。

    (2)将当前栈帧底部保存的前栈帧EBP值弹入EBP寄存器,恢复出上一个栈帧。

    (3)将函数返回地址弹给EIP寄存器。

 <3>跳转:按照函数返回地址跳回母函数中继续执行。

 还是以C语言和Win32平台为例,函数返回时的相关的指令序列如下。

 add esp,xxx     ;降低栈顶,回收当前的栈帧

 pop ebp         ;将上一个栈帧底部位置恢复到ebp

 retn            ;a)弹出当前栈顶元素,即弹出栈帧中的返回地址,至此,栈帧恢复工作完成。

                  b)让处理器跳转到弹出的返回地址,恢复调用前代码区



有问题可以点击右侧的私信按钮给我发送私信!
1、默认解压密码:WWW.TE5L.COM 就是本站主域名。
2、如果这个资源总是不能下载,请通过标题右侧的举报按钮将错误提交给我们!
3、下载资源时如果提示下载频繁,十分钟十再试即可!
4、如果点击下载按钮无反应,请查看浏览器是否拦截新窗口打开!
5、本资源仅供学习交流使用,下载后请24小时内删除,如果喜欢请购买正版资源!
6、原作者如果认为本站侵犯了您的版权,请QQ告知,我们会立即删除!
扫码关注TE官方微博 扫码关注TE官方微博
举报X