我的一片天

我的一片天
posts - 27, comments - 12, trackbacks - 0, articles - 16
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

反汇编下找C++的类及成员函数

Posted on 2007-12-08 22:11 xyz 阅读(992) 评论(0)  编辑 收藏 引用 所属分类: WIN32汇编

C++中类的使用

C010 obj;
PRINT_OBJ_ADR(obj)
obj.foo();

执行结果:obj's address is : 0012F843

首先我们看看对象的普通成员函数调用,obj.foo();,对应的汇编代码为:

 

00422E09 lea ecx,[ebp+FFFFF967h] 
00422E0F call 0041E289 

第1行把对象的地址存入ecx寄存器,执行完这行指令后,我们要以看到ecx中的值为0x0012F843,就是前面打印出的值。如果函数需要传递参数,我们还会在前面看到一些push指令。在第2行我们可以看到call的是一个直接的地址,这也就是静态绑定。即函数的调用地址在编译时已经被编译器决议。

跟踪进去我们要以看到是一条跳转指令,继续执行可以看到真正的函数代码部分,如下:

01 00425FE0 push ebp 
02 00425FE1 mov ebp,esp 
03 00425FE3 sub esp,0CCh 
04 00425FE9 push ebx 
05 00425FEA push esi 
06 00425FEB push edi 
07 00425FEC push ecx 
08 00425FED lea edi,[ebp+FFFFFF34h] 
09 00425FF3 mov ecx,33h 
10 00425FF8 mov eax,0CCCCCCCCh 
11 00425FFD rep stos dword ptr [edi] 
12 00425FFF pop ecx 
13 00426000 mov dword ptr [ebp-8],ecx 
14 00426003 mov eax,dword ptr [ebp-8] 
15 00426006 mov byte ptr [eax],2 
16 00426009 pop edi 
17 0042600A pop esi 
18 0042600B pop ebx 
19 0042600C mov esp,ebp 
20 0042600E pop ebp 
21 0042600F ret

 
我们看看第7行,把ecx寄存器入栈,后面4行初始化了函数的堆栈中的保存局部变量的部分。第12行弹出ecx值,到这里时ecx的值保持为在函数调用前存入的对象内存地址,第13行就是保存this指针的值,作为一个局部变量。这样我们就知道了VC7.1不是象传递普通函数那样通过压栈来传递this 指针,而是通过ecx寄存器来传递。第14、15行利用这个this指针给对象的成员变量进行了赋值。


只有注册用户登录后才能发表评论。