当一个PE文件被加载进内存中后,就变成了进程。进程将内存分为代码区、数据区、堆区和栈区。
一、栈
栈是指系统栈,可以动态地存储函数之间的调用关系,栈通过两个寄存器和栈的平衡操作来维护。
1.ESP:栈指针寄存器,相当于栈顶。
2.EBP:基址指针寄存器,是栈帧的栈底。
栈帧是为每个函数单独服务的一段栈空间。
二、函数调用
1.参数入栈:V C++参数由右向左依次进栈
2.返回地址入栈:返回地址是指代码区调用函数的下一条指令的地址
3.代码区跳转:处理器从当前代码区跳转到被调用函数的入口处
4.栈帧的变化:保存当前栈帧情况,以备后面恢复(EBP入栈);切换到新栈帧(EBP变为ESP的值);给新栈帧分配空间(ESP减去空间大小,抬高栈顶)
push 参数
call 函数地址//保存返回地址;跳转到调用函数的入口地址
push ebp
mov ebp, esp
sub esp, xxx
三、函数返回
1.保存返回值:通常返回值保存在EAX里
2.弹出当前栈帧,恢复上一个栈帧
add esp, xxx
pop ebp
ret//弹出栈顶元素也即返回地址;让处理器跳转到弹出的返回地址,将返回地址弹给EIP寄存器
注意:ESP EBP EIP EAX的作用;call ret的意义;
一般将前栈帧的EBP值作为两个栈帧的分界线
即调用函数的栈帧包括:其他空间+被调用函数的参数+返回地址+此函数的EBP值。