通过c / c ++中的内存地址调用函数

问题描述 投票:26回答:6

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

c++ c function-call memory-address
6个回答
48
投票

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

一旦进入其他程序的地址空间,此代码将调用任意地址的函数:

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();

14
投票

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

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

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


6
投票

当您需要直接电话时:

((void(*)(void))0x1234)();

2
投票

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

int i = ((int (*)(void))0xdeadbeef)();

1
投票

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

示例代码:a.c:

#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;
}

这会得到分段错误。


0
投票

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

我们可以使用typedef关键字来实现这一点。现在,我看到你已经将答案标记为“已回答”并且看起来你已经很好了,这只是对其他可能感兴趣的人的通知。

© www.soinside.com 2019 - 2024. All rights reserved.