3

我正在将一个 DLL 注入另一个进程,并希望根据它的地址 (0x54315) 调用该二进制文件中的一个函数。

我怎样才能真正声明一个函数,然后将它设置为这个地址?

#define FUNC 0x54315

void *myFuncPtr;

int main()
{
 myFuncPtr = FUNC;  // pretty sure this isn't how

 myFuncPtr(); // call it?
}
4

3 回答 3

5

您需要定义myFuncPtr为函数指针, avoid*不可调用。

最好为此使用 typedef:

typedef void (*funptr)(void);
funprt myFuncPtr;

(假设你的函数什么都不带,什么也不返回。)

然后你会得到一个关于赋值的警告——使用类型转换来“沉默”它,因为这确实是你需要做的。

但是,如果签名不匹配,调用约定错误或地址错误,编译器将无法验证任何内容,那么您几乎可以自己解决问题,而您可以自行处理。

于 2012-05-20T13:39:10.077 回答
5

现有的答案有效,但您甚至不需要函数指针的变量。你可以这样做:

#define myfunc ((void (*)(void))0x54315)

然后myfunc()像调用普通函数一样调用它。请注意,您应该更改强制转换中的类型以匹配函数的实际参数和返回类型。

于 2012-05-20T15:50:13.673 回答
3

一旦语法被更正为实际上是函数指针,您的代码应该可以工作。我没有正确阅读此答案的第一个版本。对不起。

正如 Mat 所述,函数指针的正确语法是:

void (*myFuncPtr)(void) = (void (*)(void)) FUNC;

这通常通过使用 a 来简化,typedef因为 C 函数指针语法有些复杂。

此外,每次注入的 DLL 运行时,您必须确定要调用的函数位于相同的确切地址。我不知道你怎么能确定这一点,虽然......

此外,您需要注意调用约定和函数FUNC可能期望的任何参数,因为如果您弄错了,您可能最终会导致堆栈损坏。

于 2012-05-20T13:35:01.470 回答