了解函数原型及其在内存中的地址,是否可以从另一个进程或一些只知道原型和内存地址的代码中调用此函数?如果可能的话,如何在代码中处理返回的类型?
答案 0 :(得分:47)
在现代操作系统上,每个 进程都有自己的地址空间 ,地址仅在进程内有效。如果您想在其他进程中执行代码,则必须 注入共享库 或 将程序作为调试程序附加 即可。
进入其他程序的地址空间后,此代码 将调用任意地址的函数 :
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
答案 1 :(得分:14)
是的 - 你正在描述一个函数指针。这是一个简单的例子;
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
它可能无法在进程之间工作 - 在大多数操作系统中,进程无法访问彼此的内存。
答案 2 :(得分:4)
当您需要直接电话时:
((void(*)(void))0x1234)();
答案 3 :(得分:2)
所有以前的答案都很好,但太长了;-):
int i = ((int (*)(void))0xdeadbeef)();
答案 4 :(得分:1)
在大多数OP中,每个进程都有自己的内存,所以你不能。
示例代码: 交流转换器:
#include <stdio.h>
int r() {return 2;}
int main() {
printf("%p\n",r);
while(1);
}
b.c:
#include <stdio.h>
int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%d\n",a);
return 0;
}
这会导致分段错误。
答案 5 :(得分:0)
当然可以,但是有限制。每个进程将拥有自己的内存块,其他进程不会对此进行干扰。现在,您会注意到,我写的绝对有可能,这是通过DLL注入(或代码注入)实现的。
我们可以使用typedef关键字实现这一目标。现在,我看到您已经将答案标记为“已回答”,并且看来您已经没事了,这只是对任何其他有兴趣的人的通知。