zoukankan      html  css  js  c++  java
  • 对寄存器ESP和EBP的一些理解

     
      前言:对于经常接触逆向或者汇编的肯定都对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仅仅是存取某时刻的栈顶指针,以方便对栈的操作,如获取函数參数、局部变量等。
  • 相关阅读:
    Jquery 跨域请求JSON数据问题
    js定时器实现图片轮播
    Redis数据一致性
    Redis缓存击穿、缓存穿透、缓存雪崩
    数据库连接池druid连接mysql数据库‘链路断开’问题
    Mysql启动错误: Can’t create test file xxx lower-test
    DB2-表空间
    DB2-Schema
    DB2-数据库
    DB2-实例
  • 原文地址:https://www.cnblogs.com/2f28/p/9751178.html
Copyright © 2011-2022 走看看