如何从成员的地址调用成员函数

How to call member functions from their address

本文关键字:成员 调用 函数 地址      更新时间:2023-10-16

我有一个函数驻留在应用程序的类中,我的目标是将dll注入目标进程,并通过其地址调用该成员函数。以下是功能:

void GameAudio::StopAllSounds(void) // this is at address 0x004A0656

我试过这样称呼它

typedef void(__stdcall * caller)(void);
caller call = (caller)0x004A0656;

我已经使用了所有东西:__stdcall__cdecl__thiscall

class的非static成员函数签名不同于普通函数。例如,

class X {
public:
  void foo ();
};
void foo ();

在上述情况下,CCD_ 5和CCD_ 6彼此不同。请记住,引擎盖下的X::foo()有点像:

void X::foo (X* const this);
             ^^^^^ implicitly added

因此,您尝试执行的操作将导致未定义的行为

如果您坚持使用成员函数的地址来调用它,那么最好将其设置为static成员函数。

class X {
public:
  static void foo ();
};
void foo ();

X::foo()::foo()的签名相同。

编辑:从您的评论来看,您似乎无法控制源代码。我建议对函数签名使用适当的调用约定,而不是硬编码地址。伪码

typedef void (GameAudio::*caller_type)();
caller_type caller = &GameAudio::StopAllSounds;
GameAudio object;
(object.*caller)();

C++中没有语法来描述您正在做的事情。请注意,该函数甚至可能是虚拟的,因此您可能调用了错误的函数。

最简单的方法是将其更改为/添加一个非成员函数或静态成员函数,并添加一个额外的GameAudio*参数。使用指向函数的指针可以很容易地调用该函数。

如果您仍然想直接调用成员函数,那么最好的选择可能是使用汇编程序。那么问题是可移植性:您的解决方案将取决于编译器、SO、体系结构,甚至可能取决于ABI版本。