通过c / c ++中的内存地址调用函数
鉴于函数原型及其在内存中的地址的知识,是否可以从另一个进程或一些只知道原型和内存地址的代码调用此函数? 如果可能,如何在代码中处理返回的类型?
在现代操作系统上,每个进程都有自己的地址空间 ,地址只在进程中有效。 如果要在其他进程中执行代码,则必须注入共享库或将程序作为调试器附加 。
进入其他程序的地址空间后,此代码将调用任意地址的函数 :
typedef int func(void); func* f = (func*)0xdeadbeef; int i = f();
是的 – 你正在描述一个函数指针。 这是一个简单的例子;
int (*func)(void) = (int (*)(void))0x12345678; int x = func();
它可能无法在进程之间工作 – 在大多数操作系统中,进程无法访问彼此的内存。
当您需要直接电话时:
((void(*)(void))0x1234)();
所有以前的答案都很好,但太长了;-):
int i = ((int (*)(void))0xdeadbeef)();
在大多数OP中,每个进程都有自己的内存,所以你不能。
示例代码:ac:
#include int r() {return 2;} int main() { printf("%p\n",r); while(1); }
公元前:
#include int main() { int a,(*b)(); scanf("%p",&b); a=b(); printf("%d\n",a); return 0; }
这会导致分段错误。