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

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

我怎样才能实际声明一个函数,然后将其设置为该地址?

#define FUNC 0x54315 void *myFuncPtr; int main() { myFuncPtr = FUNC; // pretty sure this isn't how myFuncPtr(); // call it? } 

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

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

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

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

最好使用typedef:

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

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

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

你可以自己使用它,如果签名不匹配,调用约定错误,或者地址错误,编译器无法validation任何东西,你就可以拿起碎片。

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

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

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

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

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

此外,您需要注意调用约定以及FUNC的函数可能期望的任何参数,因为如果您出错,您可能最终会遇到堆栈损坏。