能力值:
( LV2,RANK:10 )
|
-
-
2 楼
;请教this指针是如何传给ECX的?怎么看出this指针是对象的地址呢?谢谢!
//源代码如下:
/*******************************************************
* this指针 *
* (c) 看雪软件安全网站 www.pediy.com 2000-2008 *
********************************************************/
#include <stdio.h>
class CSum
{
public:
int Add(int a, int b) //实际Add原型具有如下形式:Add(this,int a,int b)
{
return (a + b);
}
};
void main()
{
CSum sum;
sum.Add(1, 2);
}
;部分反汇编代码如下:
; sum.Add(1,2)
00401000 /$ 55 push ebp
00401001 |. 8BEC mov ebp, esp
00401003 |. 51 push ecx
00401004 |. 6A 02 push 2
00401006 |. 6A 01 push 1
00401008 |. 8D4D FC lea ecx, dword ptr [ebp-4]
0040100B |. E8 10000000 call 00401020
00401010 |. 8BE5 mov esp, ebp
00401012 |. 5D pop ebp
00401013 \. C3 retn
; int Add(int a, int b){}
00401020 /$ 55 push ebp
00401021 |. 8BEC mov ebp, esp
00401023 |. 51 push ecx
00401024 |. 894D FC mov dword ptr [ebp-4], ecx
00401027 |. 8B45 08 mov eax, dword ptr [ebp+8]
0040102A |. 0345 0C add eax, dword ptr [ebp+C]
0040102D |. 8BE5 mov esp, ebp
0040102F |. 5D pop ebp
00401030 \. C2 0800 retn 8
|
能力值:
( LV8,RANK:130 )
|
-
-
3 楼
在调用前放到ECX中去。至于怎么看的,好象有很多种方法,第一种排除法,总共也就那几种调用约定一个个的排。如果是VC等编写的。看到有在调用前对ECX操作,则很有可能就是thiscall 如果调用API的话,则一般是STDCALL有的是FASTCALL,不可能是THISCALL。如果是VC的类函数调用。可以通过反汇编给出的线索判断。则一般是THIS CALL 等等 。 方法很多种。关键要多分析。时间长了就有感觉了
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
对象内容
00370FE0: 00410104 00001234 00005678
vptr内容
00410104: 004016a0 00401640 00401f70
有以上内容可以看出,对象内容包括虚表指针,调用方法把指针地址传过去,目的是如果方法中用到类的值的话,可以通过this指针地址获取,尤其是对于多态方式的调用。指针是动态的。
|
|
|