我通过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
”调用类方法?
答案 0 :(得分:1)
这取决于调用约定。您需要检查成员函数在截获的DLL中的确切表示方式。在c ++方面,上面的声明和赋值是错误的,成员函数的类型是:void(MyClass :: *)(D3DXVECTOR3&)。如何转换它取决于调用约定,但无论如何必须在调用时传递指向MyClass对象的指针。