如果已知函数的原型和其在内存中的地址,是否可以从另一个进程或一些只知道原型和内存地址的代码中调用该函数?如果可能,如何处理返回类型并将其带回代码中?
如果已知函数的原型和其在内存中的地址,是否可以从另一个进程或一些只知道原型和内存地址的代码中调用该函数?如果可能,如何处理返回类型并将其带回代码中?
在现代操作系统中,每个进程都有自己的地址空间,而且地址只在进程内有效。如果你想在另一个进程中执行代码,你必须要么注入一个共享库,要么将你的程序附加为调试器。
一旦你进入了其他程序的地址空间,这段代码可以调用任意地址上的函数:
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
0xdeadbeef
属于你,我的进程中的属于我。它们位于不同的物理内存地址。 - sbi是的 - 你描述的是一个函数指针。这里有一个简单的例子:
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
它可能在进程之间不起作用-在大多数操作系统中,进程不能访问彼此的内存。
当您需要直接调用时:
((void(*)(void))0x1234)();
之前的回答都不错,但太长了:
int i = ((int (*)(void))0xdeadbeef)();
// ========== --> addr of the function to call
// ============= --> type of the function to call
// ========================= --> ... we get a ptr to that fct
// ============================= --> ... and we call the function
#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;
}
这会导致分段错误。
这是完全可能的,但有一些限制。每个进程都有自己的内存块,其他进程无法干扰。现在,你会注意到,我写道这是通过DLL注入(或代码注入)来实现的,所以它是完全可能的。
我们可以使用typedef关键字来实现这一点。现在,我看到你已经将答案标记为“已回答”,并且似乎你已经顺利进行了,这只是提醒其他可能感兴趣的人。