所有非静态C++成员函数都使用this指针。任何时候调用这样一个函数,this都被初始化,指向用于调用该函数的对象.
最好是把this看成是传递到所有非静态成员函数的第一个隐藏参数.
this存放的地方
1.Visual C++利用thiscall调用约定,并将this传递到ECX寄存器中
2.GNU g++编译器则把this看做是函数的第一个(最左边)参数,并在调用该函数之前将用于调用函数的对象的地址作为最后一项压入栈中
从逆向工程的角度看,在调用函数之前,将一个地址转移到ECX寄存器中可能意味着两件事情
1.该文件使用Visual C++编译
2.该函数是一个成员函数
如果同一个地址被传递给两个或更多函数,我们可以得到结论,这些函数全都属于同一个类层次结构。
如果发现一个函数向其他函数传递this指针,则这些函数可能和传递this的函数属于同一个类
如下示例:
class A
{
public:int fun(){return 1;}
int Lk(){return fun();}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;a.Lk();return 0;
}
对应IDA反汇编如下:
附:
构造函数并未指定返回类型,但由Visual C++生成的构造函数实际上把this指针存在EAX寄存器中并返回