前言:对于经常接触逆向或者汇编的肯定都对push ebp,mov ebp, esp这两句印象深刻,由于他们经常出现在过程的开头,这也是找段首的一个依据,但是,过程为啥总要以这两句开头,这其中又有什么道理呢?
参考自:https://www.cnblogs.com/mengfanrong/p/5421878.html
以下是按调用约定__stdcall 调用函数test(int p1,int p2)的汇编代码
push p2 ;參数2入栈, ESP -= 4h , ESP = 0xAAAAAA6
0xAAAAAAA - 8h = call test ;压入返回地址 ESP -= 4h, ESP = 0xAAAAA9D,注意:这里是test函数的。即在代码段中的地址(偏移)。
;//进入函数内
push ebp ;保护先前EBP指针, EBP入栈(即0xAAAAAB0入栈。注意与返回地址差别), ESP-=4h, ESP = 0xAAAAA99
0xAAAAA99
;ebp+0ch为 mov ebx, dword ptr [ebp+08h] ;ebp+08h为 sub esp, 8 ;局部变量所占空间ESP-=8, ESP = 0xAAAAA91
add esp, 8 ;释放局部变量, ESP+=8, ESP = 0xAAAAA99
即把栈中地址0xAAAAA9D的内容pop到ebp中
0xAAAAAA2, 后面加操作数8为平衡堆栈,ESP+=8,ESP= }
原来ESP就是一直指向栈顶的指针,而EBP仅仅是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数參数、局部变量等。