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

Gee*_*esu 3 c function-pointers

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

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

#define FUNC 0x54315

void *myFuncPtr;

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

 myFuncPtr(); // call it?
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 5

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

最好使用typedef:

typedef void (*funptr)(void);
funprt myFuncPtr;
Run Code Online (Sandbox Code Playgroud)

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

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

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


R..*_*R.. 5

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

#define myfunc ((void (*)(void))0x54315)
Run Code Online (Sandbox Code Playgroud)

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