《C++反汇编与逆向分析技术揭秘》读书总结——this指针

this指针中保存了所属对象的首地址。

看一个书中示例:

上述代码中,利用寄存器ecx保存了对象的首地址,并以寄存器传参的方式传递到成员函数中,这便是this指针的由来。所有的成员函数(非静态成员函数)都有一个隐藏参数 ,即自身类型的指针——this指针,将这样的默认调用约定称为thiscall,类的成员函数默认是 thiscall调用方式。thiscall与__stdcall的堆栈平衡方式相同,都是由被调函数负责。在分析过程中,如果看到某函数使用ecx传参(也就是说在函数内部使用了ecx的值,而不是把ecx作为一个中间倒手的“变量”,也就是在函数外部就已经有了有用的值了,比如

lea ecx,[ebp-8]

call XXXXXXXh

),且ecx中保留了对象的this指针,以及在函数实现代码内,存在this指针参与的寄存器相对寻址,如[reg+8],即可怀疑此函数为成员函数。

 

当使用其他调用方式(如__stdcall)时,this指针将不再使用ecx传递,而是改用栈传递。比如将某成员函数显示声明为__stdcall调用方式:

void __stdcall SetNumber(int)
{
    m_nInt = nNumber;
}

相应汇编代码如下所示:

上述调用过程没有通过ecx传递this指针而是使用了栈方式传递,__cdecl类似。使用__cdecl和__stdcall声明的成员函数,this指针不像thiscall那样容易识别。使用栈方式传递参数,并且第一个参数为对象首地址的函数很多,很难区分(是否是成员函数)。虽然难以区分,但如果能确定函数的第一个参数为this指针,并且在函数体内将this指针存入某寄存器,然后出现寄存器相对寻址,那么将其还原为成员函数也是等价的。

 

 

使用thiscall调用方式的成员函数的要点分析:

符合以上特点,基本可以判断是调用类的成员函数。通过分析函数代码中访问ecx的方式,并结合内存窗口,以ecx中的值为地址去观察其数据,可以进一步分析并还原出对象中的各数据成员。

 

__stdcall与__cdecl调用方式的成员函数分析:

对于这种形式的代码,应重点分析压入的第一个参数是否为对象的首地址。如果是,则可通过分析得知,该函数等价为此对象中的成员函数。根据第一个参数的使用,以及它所指向的地址,可还原出该结构中的各数据成员。

 

本总结为原著的提炼,非我原创。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值