作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经通过 dll 注入(inject)使用 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
如何从我的 dll 上的 myobj
调用类方法?
最佳答案
这取决于调用约定。您需要检查成员函数在截取的 DLL 中的具体表示方式。在c++端,上面的声明和赋值是错误的,成员函数的类型是:void (MyClass::*)(D3DXVECTOR3&)。如何转换取决于调用约定,但在任何情况下都必须在调用时传递指向 MyClass 对象的指针。
关于c++ - 查找类迂回函数的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17247946/
我是一名优秀的程序员,十分优秀!