最近在分析一个进程崩溃的严重问题,其中有些过程分析需要对ebp, esp 有清晰的理解,对于ebp 和esp 相信大家都很熟悉了,但是为了使本文自成体系,我还是解释一下。 ebp--栈底指针 esp--栈顶指针
如图所示,简化后的代码调用过程如下: void Layer02() { int b = 2; }
void Layer01() { int a = 1; Layer02(); }
那么函数执行过程中ebp和esp是如何变化的呢?如下是反汇编后的代码: void Layer02() { 00413700 push ebp 00413701 mov ebp,esp 00413703 sub esp,0CCh 00413709 push ebx 0041370A push esi 0041370B push edi 0041370C lea edi,[ebp-0CCh] 00413712 mov ecx,33h 00413717 mov eax,0CCCCCCCCh 0041371C rep stos dword ptr es:[edi] int b = 2; 0041371E mov dword ptr ,2 } 00413725 pop edi 00413726 pop esi 00413727 pop ebx 00413728 mov esp,ebp 0041372A pop ebp 0041372B ret 我们看到函数调用开始执行如下的两行代码: 00413700 push ebp 00413701 mov ebp,esp
返回前执行如下代码: 00413728 mov esp,ebp 0041372A pop ebp 0041372B ret 那么这几行代码到底是什么意思呢?首先,如图上所示: 开始两行代码的意思是先将ebp1压栈,然后将现在的栈顶esp1作为函数调用时的栈底,所以会执行如下语句: 00413701 mov ebp,esp
那么,返回前的几条语句又是什么意思呢? 我想大家已经猜到了,当函数调用执行结束,我们要执行相反的过程: 00413728 mov esp,ebp
还原栈顶指针
0041372A pop ebp
还原栈底指针
0041372B ret 返回到函数调用前的指令继续执行。待续…
|