C语言 设置指向静态地址的函数指针



>我正在将一个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;

(假设你的函数不带任何东西,也不返回任何东西。

然后你会在作业上收到一个警告 - 使用类型强制转换来"静音"它,因为这确实是你需要做的。

不过,如果签名不匹配,调用约定错误或地址错误,编译器无法验证任何内容,您就可以拾起碎片。

一旦语法被更正为实际的函数指针,你的代码应该可以工作。我未能正确阅读此答案的第一个版本。不好意思。

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

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

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

此外,您必须真正确定每次运行注入的 DLL 时要调用的函数都位于相同的确切地址。不过,我不确定您如何确定这一点...

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

最新更新