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)
您需要定义myFuncPtr为函数指针,a void*不可调用.
最好使用typedef:
typedef void (*funptr)(void);
funprt myFuncPtr;
Run Code Online (Sandbox Code Playgroud)
(假设你的函数什么也没用,什么都不返回.)
然后你会得到关于作业的警告 - 使用类型转换来"沉默"它,因为这确实是你需要做的.
尽管如此,如果签名不匹配,调用约定错误,或者地址错误,编译器无法验证任何内容,您就可以获取它们.
现有的答案有效,但是您甚至不需要为函数指针使用变量。您可以这样做:
#define myfunc ((void (*)(void))0x54315)
Run Code Online (Sandbox Code Playgroud)
然后myfunc()像调用普通函数一样调用它。请注意,您应该在类型转换中更改类型,以匹配函数的实际参数和返回类型。