33

已知函数的原型及其在内存中的地址,是否可以从另一个进程或仅知道原型和内存地址的某些代码中调用此函数?如果可能,如何在代码中处理返回的类型?

4

6 回答 6

57

在现代操作系统上,每个进程都有自己的地址空间,并且地址只在一个进程内有效。如果要在其他进程中执行代码,则必须注入共享库将程序附加为调试器

一旦您进入另一个程序的地址空间,此代码就会在任意地址调用一个函数

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
于 2012-01-18T19:10:28.310 回答
14

是的-您正在描述一个函数指针。这是一个简单的例子;

int (*func)(void) = (int (*)(void))0x12345678;
int x = func();

它可能无法在进程之间工作——在大多数操作系统中,进程无法访问彼此的内存。

于 2012-01-18T19:09:09.453 回答
8

当您需要直接呼叫时:

((void(*)(void))0x1234)();
于 2017-11-03T17:34:20.563 回答
7

以前的所有答案都很好,但太长了:

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
于 2017-06-19T17:01:29.450 回答
1

在大多数 OP 中,每个进程都有自己的内存,所以你不能。

示例代码:ac:

#include <stdio.h>

int r() {return 2;}
int main() {
    printf("%p\n",r);
    while(1);
}

公元前:

#include <stdio.h>

int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%d\n",a);
return 0;
}

这会导致分段错误。

于 2012-01-18T19:11:46.770 回答
0

这绝对是可能的,但有一些限制。每个进程都有自己的内存块,其他进程无法干扰。现在,你会注意到,我写的肯定是有可能的,这是通过 DLL 注入(或代码注入)。

我们可以使用 typedef 关键字来实现这一点。现在,我看到您已将答案标记为“已回答”,并且您似乎一切顺利,这只是给任何可能感兴趣的人的通知。

于 2019-03-21T16:58:38.490 回答