我正在将一个 DLL 注入另一个进程,并希望根据它的地址 (0x54315) 调用该二进制文件中的一个函数。
我怎样才能真正声明一个函数,然后将它设置为这个地址?
#define FUNC 0x54315
void *myFuncPtr;
int main()
{
myFuncPtr = FUNC; // pretty sure this isn't how
myFuncPtr(); // call it?
}
我正在将一个 DLL 注入另一个进程,并希望根据它的地址 (0x54315) 调用该二进制文件中的一个函数。
我怎样才能真正声明一个函数,然后将它设置为这个地址?
#define FUNC 0x54315
void *myFuncPtr;
int main()
{
myFuncPtr = FUNC; // pretty sure this isn't how
myFuncPtr(); // call it?
}
您需要定义myFuncPtr
为函数指针, avoid*
不可调用。
最好为此使用 typedef:
typedef void (*funptr)(void);
funprt myFuncPtr;
(假设你的函数什么都不带,什么也不返回。)
然后你会得到一个关于赋值的警告——使用类型转换来“沉默”它,因为这确实是你需要做的。
但是,如果签名不匹配,调用约定错误或地址错误,编译器将无法验证任何内容,那么您几乎可以自己解决问题,而您可以自行处理。
现有的答案有效,但您甚至不需要函数指针的变量。你可以这样做:
#define myfunc ((void (*)(void))0x54315)
然后myfunc()
像调用普通函数一样调用它。请注意,您应该更改强制转换中的类型以匹配函数的实际参数和返回类型。
一旦语法被更正为实际上是函数指针,您的代码应该可以工作。我没有正确阅读此答案的第一个版本。对不起。
正如 Mat 所述,函数指针的正确语法是:
void (*myFuncPtr)(void) = (void (*)(void)) FUNC;
这通常通过使用 a 来简化,typedef
因为 C 函数指针语法有些复杂。
此外,每次注入的 DLL 运行时,您必须确定要调用的函数位于相同的确切地址。我不知道你怎么能确定这一点,虽然......
此外,您需要注意调用约定和函数FUNC
可能期望的任何参数,因为如果您弄错了,您可能最终会导致堆栈损坏。