C++反汇编->类,结构体,命名空间分析

来源:互联网 发布:哈尔滨 知乎 编辑:程序博客网 时间:2024/05/12 12:14

首先来看类(class)的反汇编代码:

class name{public:int i;int j;    int add(int in1,int in2){return in1+in2;}protected:private:};

void main(){name n;n.i=10;n.j=12;std::cout<<n.add(n.i,n.j)<<std::endl;system("pause");}


主函数对应反汇编代码:

00401560 > > \55            PUSH EBP00401561   .  8BEC          MOV EBP,ESP00401563   .  83EC 48       SUB ESP,4800401566   .  53            PUSH EBX00401567   .  56            PUSH ESI00401568   .  57            PUSH EDI00401569   .  8D7D B8       LEA EDI,DWORD PTR SS:[EBP-48]0040156C   .  B9 12000000   MOV ECX,1200401571   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC00401576   .  F3:AB         REP STOS DWORD PTR ES:[EDI]00401578   .  C745 F8 0A000>MOV DWORD PTR SS:[EBP-8],0A0040157F   .  C745 FC 0C000>MOV DWORD PTR SS:[EBP-4],0C00401586   .  68 C8104000   PUSH testcals.004010C80040158B   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]0040158E   .  50            PUSH EAX0040158F   .  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]00401592   .  51            PUSH ECX00401593   .  8D4D F8       LEA ECX,DWORD PTR SS:[EBP-8]00401596   .  E8 59FCFFFF   CALL testcals.004011F4 //执行add函数语句0040159B   .  50            PUSH EAX0040159C   .  B9 A0DE4700   MOV ECX,OFFSET testcals.std::cout004015A1   .  E8 59FBFFFF   CALL testcals.004010FF004015A6   .  8BC8          MOV ECX,EAX004015A8   .  E8 33FCFFFF   CALL testcals.004011E0004015AD   .  68 1C004700   PUSH OFFSET testcals.??_C@_05PBCN@pause?>; /pause004015B2   .  E8 D9EF0100   CALL testcals.system                     ; \system004015B7   .  83C4 04       ADD ESP,4004015BA   .  5F            POP EDI004015BB   .  5E            POP ESI004015BC   .  5B            POP EBX004015BD   .  83C4 48       ADD ESP,48004015C0   .  3BEC          CMP EBP,ESP004015C2   .  E8 D9F00100   CALL testcals.__chkesp004015C7   .  8BE5          MOV ESP,EBP004015C9   .  5D            POP EBP004015CA   .  C3            RETN
找到对应的语句如下:
004015F0 >/> \55            PUSH EBP                                 ;  add function004015F1  |.  8BEC          MOV EBP,ESP004015F3  |.  83EC 44       SUB ESP,44004015F6  |.  53            PUSH EBX004015F7  |.  56            PUSH ESI004015F8  |.  57            PUSH EDI004015F9  |.  51            PUSH ECX004015FA  |.  8D7D BC       LEA EDI,DWORD PTR SS:[EBP-44]004015FD  |.  B9 11000000   MOV ECX,1100401602  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC00401607  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]00401609  |.  59            POP ECX0040160A  |.  894D FC       MOV DWORD PTR SS:[EBP-4],ECX0040160D  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]00401610  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]00401613  |.  5F            POP EDI00401614  |.  5E            POP ESI00401615  |.  5B            POP EBX00401616  |.  8BE5          MOV ESP,EBP00401618  |.  5D            POP EBP00401619  \.  C2 0800       RETN 8

2.namespace 命名:

namespace name{int i;int j;int add(int in1,int in2){return in1+in2;}}void main(){std::cout<<"tip1"<<std::endl;name::i=10;name::j=12;std::cout<<name::add(name::i,name::j)<<std::endl;    system("pause");}
对应的反汇编源码:

00401580 >/> \55            PUSH EBP00401581  |.  8BEC          MOV EBP,ESP00401583  |.  83EC 40       SUB ESP,4000401586  |.  53            PUSH EBX00401587  |.  56            PUSH ESI00401588  |.  57            PUSH EDI00401589  |.  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]0040158C  |.  B9 10000000   MOV ECX,1000401591  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC00401596  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]00401598  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]             ;  实现add函数0040159B  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]0040159E  |.  5F            POP EDI0040159F  |.  5E            POP ESI004015A0  |.  5B            POP EBX004015A1  |.  8BE5          MOV ESP,EBP004015A3  |.  5D            POP EBP004015A4  \.  C3            RETN004015A5      CC            INT3004015A6      CC            INT3004015A7      CC            INT3004015A8      CC            INT3004015A9      CC            INT3004015AA      CC            INT3004015AB      CC            INT3004015AC      CC            INT3004015AD      CC            INT3004015AE      CC            INT3004015AF      CC            INT3004015B0 > >  55            PUSH EBP004015B1   .  8BEC          MOV EBP,ESP004015B3   .  83EC 40       SUB ESP,40004015B6   .  53            PUSH EBX004015B7   .  56            PUSH ESI004015B8   .  57            PUSH EDI004015B9   .  8D7D C0       LEA EDI,DWORD PTR SS:[EBP-40]004015BC   .  B9 10000000   MOV ECX,10004015C1   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC004015C6   .  F3:AB         REP STOS DWORD PTR ES:[EDI]004015C8   .  68 C8104000   PUSH testname.004010C8004015CD   .  68 24004700   PUSH OFFSET testname.??_C@_04HPCL@tip1?$>;  tip1004015D2   .  68 A8DE4700   PUSH OFFSET testname.std::cout004015D7   .  E8 AEFCFFFF   CALL testname.0040128A004015DC   .  83C4 08       ADD ESP,8004015DF   .  8BC8          MOV ECX,EAX004015E1   .  E8 FFFBFFFF   CALL testname.004011E5004015E6   .  C705 F8DD4700>MOV DWORD PTR DS:[name::i],0A            ;  name::i赋值004015F0   .  C705 FCDD4700>MOV DWORD PTR DS:[name::j],0C            ;  name::j赋值004015FA   .  68 C8104000   PUSH testname.004010C8004015FF   .  A1 FCDD4700   MOV EAX,DWORD PTR DS:[name::j]           ;  寄存器存入 OA00401604   .  50            PUSH EAX00401605   .  8B0D F8DD4700 MOV ECX,DWORD PTR DS:[name::i]           ;  寄存器存入 0C0040160B   .  51            PUSH ECX0040160C   .  E8 84FBFFFF   CALL testname.00401195                   ;  执行 name::add函数00401611   .  83C4 08       ADD ESP,8                                ;  栈平衡00401614   .  50            PUSH EAX                                 ;  输出EAX寄存器00401615   .  B9 A8DE4700   MOV ECX,OFFSET testname.std::cout0040161A   .  E8 E0FAFFFF   CALL testname.004010FF0040161F   .  8BC8          MOV ECX,EAX00401621   .  E8 BFFBFFFF   CALL testname.004011E500401626   .  68 1C004700   PUSH OFFSET testname.??_C@_05PBCN@pause?>; /pause0040162B   .  E8 90F30100   CALL testname.system                     ; \system00401630   .  83C4 04       ADD ESP,400401633   .  5F            POP EDI00401634   .  5E            POP ESI00401635   .  5B            POP EBX00401636   .  83C4 40       ADD ESP,4000401639   .  3BEC          CMP EBP,ESP0040163B   .  E8 90F40100   CALL testname.__chkesp00401640   .  8BE5          MOV ESP,EBP00401642   .  5D            POP EBP00401643   .  C3            RETN

3.struct代码:

struct name {int i;int j;int add(int in1,int in2){return in1+in2;}};void main(){std::cout<<"tips";name n;n.i=10;n.j=12;std::cout<<n.add(n.i,n.j)<<std::endl;system("pause");}
对应反汇编如下:

00401580 > > \55            PUSH EBP00401581   .  8BEC          MOV EBP,ESP00401583   .  83EC 48       SUB ESP,4800401586   .  53            PUSH EBX00401587   .  56            PUSH ESI00401588   .  57            PUSH EDI00401589   .  8D7D B8       LEA EDI,DWORD PTR SS:[EBP-48]0040158C   .  B9 12000000   MOV ECX,1200401591   .  B8 CCCCCCCC   MOV EAX,CCCCCCCC00401596   .  F3:AB         REP STOS DWORD PTR ES:[EDI]00401598   .  68 24004700   PUSH OFFSET teststru.??_C@_04IPMF@tips?$>;  tips0040159D   .  68 A0DE4700   PUSH OFFSET teststru.std::cout004015A2   .  E8 E3FCFFFF   CALL teststru.0040128A004015A7   .  83C4 08       ADD ESP,8004015AA   .  C745 F8 0A000>MOV DWORD PTR SS:[EBP-8],0A004015B1   .  C745 FC 0C000>MOV DWORD PTR SS:[EBP-4],0C004015B8   .  68 C8104000   PUSH teststru.004010C8004015BD   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]004015C0   .  50            PUSH EAX004015C1   .  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]004015C4   .  51            PUSH ECX004015C5   .  8D4D F8       LEA ECX,DWORD PTR SS:[EBP-8]004015C8   .  E8 27FCFFFF   CALL teststru.004011F4004015CD   .  50            PUSH EAX004015CE   .  B9 A0DE4700   MOV ECX,OFFSET teststru.std::cout004015D3   .  E8 27FBFFFF   CALL teststru.004010FF004015D8   .  8BC8          MOV ECX,EAX004015DA   .  E8 01FCFFFF   CALL teststru.004011E0004015DF   .  68 1C004700   PUSH OFFSET teststru.??_C@_05PBCN@pause?>; /pause004015E4   .  E8 C7F30100   CALL teststru.system                     ; \system004015E9   .  83C4 04       ADD ESP,4004015EC   .  5F            POP EDI004015ED   .  5E            POP ESI004015EE   .  5B            POP EBX004015EF   .  83C4 48       ADD ESP,48004015F2   .  3BEC          CMP EBP,ESP004015F4   .  E8 C7F40100   CALL teststru.__chkesp004015F9   .  8BE5          MOV ESP,EBP004015FB   .  5D            POP EBP004015FC   .  C3            RETN004015FD      CC            INT3004015FE      CC            INT3004015FF      CC            INT300401600      CC            INT300401601      CC            INT300401602      CC            INT300401603      CC            INT300401604      CC            INT300401605      CC            INT300401606      CC            INT300401607      CC            INT300401608      CC            INT300401609      CC            INT30040160A      CC            INT30040160B      CC            INT30040160C      CC            INT30040160D      CC            INT30040160E      CC            INT30040160F      CC            INT300401610      CC            INT300401611      CC            INT300401612      CC            INT300401613      CC            INT300401614      CC            INT300401615      CC            INT300401616      CC            INT300401617      CC            INT300401618      CC            INT300401619      CC            INT30040161A      CC            INT30040161B      CC            INT30040161C      CC            INT30040161D      CC            INT30040161E      CC            INT30040161F      CC            INT300401620 >/>  55            PUSH EBP                                 ;  struct实现函数位置00401621  |.  8BEC          MOV EBP,ESP00401623  |.  83EC 44       SUB ESP,4400401626  |.  53            PUSH EBX00401627  |.  56            PUSH ESI00401628  |.  57            PUSH EDI00401629  |.  51            PUSH ECX0040162A  |.  8D7D BC       LEA EDI,DWORD PTR SS:[EBP-44]0040162D  |.  B9 11000000   MOV ECX,1100401632  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC00401637  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]00401639  |.  59            POP ECX0040163A  |.  894D FC       MOV DWORD PTR SS:[EBP-4],ECX0040163D  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]00401640  |.  0345 0C       ADD EAX,DWORD PTR SS:[EBP+C]00401643  |.  5F            POP EDI00401644  |.  5E            POP ESI00401645  |.  5B            POP EBX00401646  |.  8BE5          MOV ESP,EBP00401648  |.  5D            POP EBP00401649  \.  C2 0800       RETN 8

小结:

1.命名空间定义的函数,在编译主函数之前,而类和结构体在主函数之后。

2.类和结构体内部公有函数反汇编源码一致,也印证了结构体内的函数与类里面的公有函数等效。


0 0