c++ - 查找类迂回函数的对象

标签 c++ reverse-engineering

我已经通过 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/

相关文章:

python - 带有 boost/dll 的 pybind - 双重使用 DLL?

c++ - 我如何确定例程正在利用 (N)RVO?

matlab - 如何定位内置函数的定义位置?

c++ - DLL 注入(inject)的最佳实践?

assembly - sub eax,0-它有作用吗?

c++ - 使用预编译 header 减少 clang 编译时间

c++ - 我不明白异步操作如何使 HTTP 服务器并发

c++ - 继承的析构函数是否包含在虚拟表中?

javascript - 定位混淆函数

plugins - 如何为 ollydbg 2.x.x 设置插件?