0

我已经通过 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 上“从”调用类方法?

4

1 回答 1

1

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

于 2013-06-22T13:12:50.853 回答