我正在向另一个进程注入一个DLL,并希望根据它的地址(0x54315)调用该二进制文件中的函数。
如何实际声明一个函数,然后将其设置为该地址?
#define FUNC 0x54315
void *myFuncPtr;
int main()
{
myFuncPtr = FUNC; // pretty sure this isn't how
myFuncPtr(); // call it?
}
答案 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
函数可能期望的任何参数,因为如果你弄错了,你可能最终会出现堆栈损坏。