您的位置:首页 > 其它

函数调用过程(反汇编分析)

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

消除调用函数时时产生的参数数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: