函数指针设置为静态地址(Set a function pointer to a static add

2019-06-24 14:28发布

我注入DLL到另一个进程,并想调用的函数是基于它是二进制的地址(0x54315)。

我怎样才能实际声明的函数,然后将其设置到这个地址?

#define FUNC 0x54315

void *myFuncPtr;

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

 myFuncPtr(); // call it?
}

Answer 1:

现有的答案工作,但你甚至不需要为函数指针的变量。 你可以这样做:

#define myfunc ((void (*)(void))0x54315)

然后调用它作为myfunc()就像你一个普通的功能。 请注意,您应该改变类型中投符合实际的参数和返回类型的功能。



Answer 2:

您需要定义myFuncPtr作为函数指针,一个void*是不可调用的。

最好用一个类型定义:

typedef void (*funptr)(void);
funprt myFuncPtr;

(假设你的函数需要什么,并且没有返回。)

然后你会在分配得到一个警告 - 使用类型转换为“沉默”了,因为这确实是你需要做什么。

你几乎对自己与这虽然,如果签名不匹配,调用约定是错误的,或者地址有误,编译器不能确认任何事情,你会得到收拾残局。



Answer 3:

一旦语法修正实际上是一个函数指针你的代码应工作。 我没能正确地读给我这个答案的第一个版本。 抱歉。

正如垫指出,对于一个函数指针的正确语法是:

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

这通常是通过使用简化typedef由于C函数指针语法是有些令人费解。

此外,你必须真正确定你每次注入DLL运行时要调用的功能是相同的确切地址。 我不知道如何可以肯定的是,虽然...

此外,您还需要注意调用约定,在函数的任何参数FUNC可能期待的,因为如果你是错的,你可能会与堆栈损坏而告终。



文章来源: Set a function pointer to a static address