当前位置: 代码迷 >> 汇编语言 >> 反汇编程序遇到的有关问题
  详细解决方案

反汇编程序遇到的有关问题

热度:3946   发布时间:2013-02-26 00:00:00.0
反汇编程序遇到的问题
00401053       sub                   esp,44h
00401056       push                 ebx
00401057       push                 esi
00401058       push                 edi
00401059       lea                   edi,[ebp-44h]
0040105C       mov                   ecx,11h
00401061       mov                   eax,0CCCCCCCCh
00401066       rep   stos         dword   ptr   [edi]
8:             int   a;
9:
10:           a   =   Print(3,   4);
00401068       push                 4
0040106A       push                 3
0040106C       call                 @ILT+0(Print)   (00401005)
00401071       add                   esp,8
00401074       mov                   dword   ptr   [ebp-4],eax
11:
12:           return   0;
00401077       xor                   eax,eax
13:       }
00401079       pop                   edi
0040107A       pop                   esi
0040107B       pop                   ebx
0040107C       add                   esp,44h
0040107F       cmp                   ebp,esp
00401081       call                 __chkesp   (004010a0)
00401086       mov                   esp,ebp
00401088       pop                   ebp
00401089       ret  
请问刚开始的时候   esp   ebp指向的是同一个地址?
                                  ss   es   选择符是不是同一个

------解决方案--------------------------------------------------------
用 ollydbg 载入,然后动态查看。一般初始时(in win32)esp <> ebp,es==ss
------解决方案--------------------------------------------------------
在一般的汇编程序中:
esp只用来保栈顶
而使用ebp来临时保存子函数的基地址,它们在函数开始处一般不同

------解决方案--------------------------------------------------------
ESP是你的堆栈地址,而EBP是一个寄存器,通常用来临时保存堆栈地址,保持一个相对固定的基地址,然后用[EBP+0x00]来定位访问某个变量。
------解决方案--------------------------------------------------------
ebp和esp都是以堆栈段为默认数据段的,所以都可以用来做指针,但是在子函数中,由于esp可能随时要用到(子函数也可能要push pop 啊),所以不能用esp来做指针,要用ebp,初始化完成之后esp是等于ebp的,但是你要是在子函数中有push,pop等等 esp就变了。在子函数中,是不能对ebp进行修改,否则程序就挂了。
函数结束以后,一般会用 mov esp,ebp,然后pop ebp这样堆栈就正确了(其实反汇编时一般碰到的不是这两个指令,而是用一个leave来代替)
  相关解决方案