cpp反汇编之const分析
来源:互联网 发布:算法的概念简单例题 编辑:程序博客网 时间:2024/04/30 01:59
先来分析一个简单的例子。(注意容易出错)
代码非常简单
#include<iostream>#include<cstdio>using namespace std;int main(){const int a = 1;int* b = (int*)&a;*b = 2;cout << a << endl << *b << endl;return 0;}
反汇编分析 重点之处有注释
1: #include<iostream>2: #include<cstdio>3: using namespace std;4: int main(){00401560 push ebp00401561 mov ebp,esp00401563 sub esp,48h00401566 push ebx00401567 push esi00401568 push edi00401569 lea edi,[ebp-48h]0040156C mov ecx,12h00401571 mov eax,0CCCCCCCCh00401576 rep stos dword ptr [edi]5: const int a = 1;00401578 mov dword ptr [ebp-4],16: int* b = (int*)&a;0040157F lea eax,[ebp-4]00401582 mov dword ptr [ebp-8],eax7: *b = 2;00401585 mov ecx,dword ptr [ebp-8] ecx即是指针b的值00401588 mov dword ptr [ecx],28: cout<<a<<endl<<*b<<endl;0040158E push offset @ILT+195(std::endl) (004010c8)00401593 mov edx,dword ptr [ebp-8]00401596 mov eax,dword ptr [edx]00401598 push eax//此处使用eax存储00401599 push offset @ILT+195(std::endl) (004010c8)0040159E push 1//此处即是常量a004015A0 mov ecx,offset std::cout (0047be90)004015A5 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)004015AA mov ecx,eax004015AC call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)004015B1 mov ecx,eax004015B3 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)004015B8 mov ecx,eax004015BA call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)9: return 0;004015BF xor eax,eax10: }004015C1 pop edi004015C2 pop esi004015C3 pop ebx004015C4 add esp,48h004015C7 cmp ebp,esp004015C9 call __chkesp (00420550)004015CE mov esp,ebp004015D0 pop ebp004015D1 ret输出:12内存寄存器分析执行00401578 mov dword ptr [ebp-4],1 之前0018FF33 CC CC CC CC CC CC CC 烫烫烫.0018FF3A CC CC CC CC CC CC CC 烫烫烫.0018FF41 CC CC CC CC CC CC CC 烫烫烫.0018FF48 88 FF 18 00 29 1A 42 ....).B0018FF4F 00 01 00 00 00 98 17 .......执行00401578 mov dword ptr [ebp-4],1 之后0018FF33 CC CC CC CC CC CC CC 烫烫烫.0018FF3A CC CC CC CC CC CC CC 烫烫烫.0018FF41 CC CC CC 01 00 00 00 烫..... 此处1即为a0018FF48 88 FF 18 00 29 1A 42 ....).B0040157F lea eax,[ebp-4]00401582 mov dword ptr [ebp-8],eax EAX = 0018FF44 EBX = 7EFDE000 ECX = 00000000 EDX = 003C1810 ESI = 00000000 EDI = 0018FF48 EIP = 00401585 ESP = 0018FEF4 EBP = 0018FF48 EFL = 000002060018FF33 CC CC CC CC CC CC CC 烫烫烫.0018FF3A CC CC CC CC CC CC 44 烫烫烫D0018FF41 FF 18 00 01 00 00 00 .......0018FF48 88 FF 18 00 29 1A 42 ....).B00401585 mov ecx,dword ptr [ebp-8]00401588 mov dword ptr [ecx],2 EAX = 0018FF44 EBX = 7EFDE000 ECX = 0018FF44 EDX = 003C1810 ESI = 00000000 EDI = 0018FF48 EIP = 0040158E ESP = 0018FEF4 EBP = 0018FF48 EFL = 000002060018FF33 CC CC CC CC CC CC CC 烫烫烫.0018FF3A CC CC CC CC CC CC 44 烫烫烫D0018FF41 FF 18 00 02 00 00 00 ....... <strong>此处的地址a处被改为2</strong>0018FF48 88 FF 18 00 29 1A 42 ....).B0040158E push offset @ILT+195(std::endl) (004010c8)00401593 mov edx,dword ptr [ebp-8]00401596 mov eax,dword ptr [edx]00401598 push eax EAX = 00000002 EBX = 7EFDE000 ECX = 0018FF44 EDX = 0018FF44 ESI = 00000000 EDI = 0018FF48 EIP = 00401598 ESP = 0018FEF0 EBP = 0018FF48 EFL = 00000206
稍作修改后
#include<iostream>#include<cstdio>using namespace std;int main(){const int a = 1;int* b = (int*)&a;*b = 2;cout << a << endl << *b << endl;b = new int(8);cout << a << endl << *b << endl;return 0;}
反汇编分析
1: #include<iostream>2: #include<cstdio>3: using namespace std;4: int main(){00401560 push ebp00401561 mov ebp,esp00401563 sub esp,50h00401566 push ebx00401567 push esi00401568 push edi00401569 lea edi,[ebp-50h]0040156C mov ecx,14h00401571 mov eax,0CCCCCCCCh00401576 rep stos dword ptr [edi]5: const int a = 1;00401578 mov dword ptr [ebp-4],16: int* b = (int*)&a;0040157F lea eax,[ebp-4]00401582 mov dword ptr [ebp-8],eax7: *b = 2;00401585 mov ecx,dword ptr [ebp-8]00401588 mov dword ptr [ecx],28: cout << a << endl << *b << endl;0040158E push offset @ILT+195(std::endl) (004010c8)00401593 mov edx,dword ptr [ebp-8]00401596 mov eax,dword ptr [edx]00401598 push eax00401599 push offset @ILT+195(std::endl) (004010c8)0040159E push 1004015A0 mov ecx,offset std::cout (0047be90)004015A5 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)004015AA mov ecx,eax004015AC call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)004015B1 mov ecx,eax004015B3 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)004015B8 mov ecx,eax004015BA call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)9: b = new int(8);004015BF push 4004015C1 call operator new (004205d0)004015C6 add esp,4004015C9 mov dword ptr [ebp-0Ch],eax004015CC cmp dword ptr [ebp-0Ch],0004015D0 je main+83h (004015e3)004015D2 mov ecx,dword ptr [ebp-0Ch]004015D5 mov dword ptr [ecx],8004015DB mov edx,dword ptr [ebp-0Ch]004015DE mov dword ptr [ebp-10h],edx004015E1 jmp main+8Ah (004015ea)004015E3 mov dword ptr [ebp-10h],0004015EA mov eax,dword ptr [ebp-10h]004015ED mov dword ptr [ebp-8],eax10: cout << a << endl << *b << endl;004015F0 push offset @ILT+195(std::endl) (004010c8)004015F5 mov ecx,dword ptr [ebp-8]004015F8 mov edx,dword ptr [ecx]004015FA push edx004015FB push offset @ILT+195(std::endl) (004010c8)00401600 push 100401602 mov ecx,offset std::cout (0047be90)00401607 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)0040160C mov ecx,eax0040160E call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)00401613 mov ecx,eax00401615 call @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)0040161A mov ecx,eax0040161C call @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)11: return 0;00401621 xor eax,eax12: }00401623 pop edi00401624 pop esi00401625 pop ebx00401626 add esp,50h00401629 cmp ebp,esp0040162B call __chkesp (004205f0)00401630 mov esp,ebp00401632 pop ebp00401633 ret输出:1218执行此句后 9: b = new int(8);内存变化0018FF33 CC CC CC CC CC C8 07 烫烫倘.0018FF3A 54 00 C8 07 54 00 C8 T...T..0018FF41 07 54 00 02 00 00 00 .T..... a地址处还是2 <strong>说明编译器把const变量直接用常数代替,其内存还是可以改的</strong>0018FF48 88 FF 18 00 A9 1A 42 ......B0018FF4F 00 01 00 00 00 98 17 .......0018FF56 54 00 10 18 54 00 00 T...T..
0 0
- cpp反汇编之const分析
- cpp反汇编分析之构造函数
- cpp反汇编之protected
- cpp反汇编之数组
- cpp反汇编之指针
- cpp反汇编之控制结构
- cpp反汇编之构造函数2
- cpp反汇编之菱形继承
- 反汇编分析C++中的const
- cpp反汇编之类和结构体分析
- cpp反汇编之继承之基类
- cpp反汇编之共同继承一个父类
- 继《const修改过程》的反汇编分析
- 关于C++中的const的简单反汇编分析
- cpp反汇编之多继承
- 深入理解char [] 和 char * ,const char[]和 const char*--反汇编分析
- IoGetCurrentProcess 反汇编分析
- 反汇编代码分析
- python字符集编码深入理解
- 第22课时,实践,画流程图
- java学习笔记(七)
- 12. PHP String 字符串(2)
- ZOJ 3782 Ternary Calculation
- cpp反汇编之const分析
- Square 开源库Flow和Mortar的介绍
- JS基础知识之:几个有启示的地方
- C语言sendto()函数:经socket传送数据
- python 学习 笔记 format 用法
- 毕设论文英文文献下载
- cft0.o
- 根权限gedit打开文件
- vim 配置说明