2012-02-12 18 views
1

我有一个驻留在应用程序的类中的函数我的目标是注入一个dll到目标进程并通过其地址调用该成员函数。 下面是函数:如何从他们的地址调用成员函数

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

我试图调用它像这样

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

我用一切:__stdcall__cdecl__thiscall你的名字。

+0

你确定它总是它的地址? – 2012-02-12 11:45:19

+0

是的,我确定:) – 2012-02-12 11:46:30

+0

当你试图打电话时会发生什么?您是否尝试在调试器中完成调用?还要记住,所有的类成员函数都有一个隐含的“this”参数。 – 2012-02-12 11:47:31

回答

1

类的非static成员函数签名与正常函数不同。 例如,

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

在上述情况下X::foo()::foo()彼此不同。请记住,X::foo()引擎盖下是somewaht这样的:

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)(); 
+0

所以它的bassicaly不可能? – 2012-02-12 11:51:35

+0

是的,但你必须认识到,这个功能是在一个应用程序,我没有源代码,所以我不能改变功能静态 – 2012-02-12 11:53:06

+0

@ user1205008,与普通成员函数 - >“你不应该”这样做。对于'static'成员函数或'namespace'作用域中的函数,你可以这样做。但是,我仍然怀疑需要使用地址。你为什么要使用地址?它会使你的代码不可移植。 – iammilind 2012-02-12 11:53:28

1

C++中没有语法用于你正在做的事情。 请注意,该功能甚至可能是虚拟的,所以你会调用错误的功能。

最简单的方法是将其更改为/添加非成员函数或静态成员函数,并附加GameAudio*参数。该函数可以使用指针函数轻松调用。

如果你仍然想直接调用成员函数,最好的办法就是使用汇编程序。问题就在于可移植性:您的解决方案将取决于编译器,SO,架构甚至ABI版本。

+0

好吧,我听到你,所以bassicaly,如果我没有这个特定的应用程序的源和调用驻留在类/结构中的这个函数是不可能的?顺便说一句,我可以告诉如果功能是虚拟的或不是这个特定的功能不是 – 2012-02-12 11:58:03

+0

@ user1205008 - 它是不容易知道它是虚拟的。即使是这样,你的指针可以是一个指向真实函数的指针,也可以是一个指向vtable-entry或vtable-thunk的指针......这取决于你找到那个数字的位置。要知道的最好方法是反编译程序并环视该地址。如果你用汇编语言编写调用,就像编译器所做的那样,这当然不是不可能的。这只是棘手。 – rodrigo 2012-02-12 12:12:33

+0

我已经使用了一个消遣者 – 2012-02-12 18:11:10