分享

常量、指针和变量的实现机制

 quasiceo 2013-12-05
分类: 逆向学习 2010-08-06 21:39 189人阅读 评论(0) 收藏 举报

无论是硬件设计还是软件设计,计算机领域都有一条设计法则-----那就是把不变化的和变化的东西分离出来,这样做的好处是稳定性提高了,而且方便维护。

按照一般的PE文件结构来说,常量存储在数据区块,变量存储在堆栈,一般程序的编译器也很乐意按照这种方式编译和生成PE文件。

在内存中,一般数据是从低地址往高地址存放,而在堆栈中数据是从内存高的地址往内存低的地址存放。

  1. int a=3,*pa=&a;  
  2. int main()  
  3. {  
  4.     int b=4;  
  5.     int *pb=&b;  
  6.     *pb=*pa;  
  7.     return 0;  
  8. }  

反汇编形式如下:

[c-sharp] view plaincopy
  1. int a=3,*pa=&a;  
  2. int main()  
  3. {  
  4. 00E013A0  push        ebp                            ;保护EBX寄存器的值  
  5. 00E013A1  mov         ebp,esp                        ;ebp指向当前堆栈指针   
  6. 00E013A3  sub         esp,0D8h                       ;为局部变量预留D8h字节空间  
  7. 00E013A9  push        ebx                            ;保护ebx寄存器的值  
  8. 00E013AA  push        esi                            ;保护esi寄存器的值  
  9. 00E013AB  push        edi                            ;保护edi寄存器的值  
  10. 00E013AC  lea         edi,[ebp-0D8h]                 ;edi指向局部变量缓冲区  
  11. 00E013B2  mov         ecx,36h                        ;ecx作为计数器下面循环复制36h*4字节数据  
  12. 00E013B7  mov         eax,0CCCCCCCCh                 ;要复制的源数据放入eax中  
  13. 00E013BC  rep stos    dword ptr es:[edi]             ;循环复制数据到局部变量缓冲区中  
  14.     int b=4;  
  15. 00E013BE  mov         dword ptr [b],4                ;[b]=变量b  
  16.     int *pb=&b;  
  17. 00E013C5  lea         eax,[b]                        ;eax寄存器保存变量b的指针  
  18. 00E013C8  mov         dword ptr [pb],eax             ;[pb]=指针pb  
  19.     *pb=*pa;  
  20. 00E013CB  mov         eax,dword ptr [pb]             ;eax=指针pb  
  21. 00E013CE  mov         ecx,dword ptr [pa (0E07008h)]  ;ecx寄存器保存指针pa  
  22. 00E013D4  mov         edx,dword ptr [ecx]            ;edx寄存器的值=a  
  23. 00E013D6  mov         dword ptr [eax],edx            ;pb指向的值被赋值为a,也就是b=a  
  24.     return 0;  
  25. 00E013D8  xor         eax,eax                        ;eax清零  
  26. }  
  27. 00E013DA  push        edx                            ;下call面干啥的不知道, _CheckStackVars?  
  28. 00E013DB  mov         ecx,ebp   
  29. 00E013DD  push        eax    
  30. 00E013DE  lea         edx,[ (0E013F4h)]   
  31. 00E013E4  call        @ILT+130(@_RTC_CheckStackVars@8) (0E01087h)   
  32. 00E013E9  pop         eax    
  33. 00E013EA  pop         edx    
  34. 00E013EB  pop         edi                            ;恢复edi寄存器的值  
  35. 00E013EC  pop         esi    
  36. 00E013ED  pop         ebx    
  37. 00E013EE  mov         esp,ebp                        ;恢复调用前的堆栈指针  
  38. 00E013F0  pop         ebp                            ;恢复ebp寄存器的值  
  39. 00E013F1  ret                                        ;函数返回  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多