查找类绕行函数的对象

Find object of class detoured function

本文关键字:对象 函数 查找      更新时间:2023-10-16

我通过dll注入绕过了使用CDetours的类方法(是的,我正在研究逆向工程)void MyClass::SetData( D3DXVECTOR3& data ),并且在实际应用程序中一切都工作正常,函数被绕过并且我看到了调试消息(控制台输出)。

现在真正的问题是,我试图使这个函数调用,如果它是一个全局函数,而不是我做:

typedef void (*SetDataFunc)(D3DXVECTOR3&); //for global functions __cdecl is ok
SetDataFunc SetDataRev = (SetDataFunc)0x00428FD0; //just an example address
then call it:
D3DXVECTOR3 data(0,0,0);
SetDataRev(data);

和一切都会正常工作,我的问题是,即使知道MyClass::SetData的地址并使用上面的方法来调用它(它确实被调用),但是创建的MyClass对象将保持不变,因为调用本身没有意义,因为你没有从对象调用它。

MyClass myobj;
myobj.SetData( data ); //ok any members that 'SetData' changes will be changed.
SetDataRevForClass( data ); //not ok, nothing on 'myobj' changed

我怎么能调用类方法"从"myobj上我的dll?

这取决于调用约定。您需要检查在截获的DLL中如何精确地表示成员函数。在c++端,上面的声明和赋值是错误的,成员函数的类型是:void (MyClass::*)(D3DXVECTOR3&)。如何转换取决于调用约定,但无论如何,必须在调用时传递指向MyClass对象的指针。