将函数指针设置为静态地址

时间:2012-05-20 13:31:51

标签: c function-pointers

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

如何实际声明一个函数,然后将其设置为该地址?

#define FUNC 0x54315

void *myFuncPtr;

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

 myFuncPtr(); // call it?
}

3 个答案:

答案 0 :(得分:5)

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

最好使用typedef:

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

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

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

尽管如此,如果签名不匹配,调用约定错误,或者地址错误,编译器无法验证任何内容,您就可以获取它们。 / p>

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

一旦语法被修正为实际上是函数指针,您的代码应该可以工作。我的第一个版本的答案没能正确阅读。遗憾。

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

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

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

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

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