找到类绕行函数的对象

时间:2013-06-22 06:22:19

标签: c++ reverse-engineering

我通过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对象仍然存在同样,因为调用本身没有意义,因为你没有从一个对象调用它。

E.g

MyClass myobj;
myobj.SetData( data ); //ok any members that 'SetData' changes will be changed.

SetDataRevForClass( data ); //not ok, nothing on 'myobj' changed

如何从“我的dll上的myobj”调用类方法?

1 个答案:

答案 0 :(得分:1)

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