Appeler une fonction via son adresse en mémoire en c / C++

Étant donné la connaissance du prototype d'une fonction et de son adresse en mémoire, est-il possible d'appeler cette fonction à partir d'un autre processus ou d'un morceau de code qui ne connaît que le prototype et l'adresse mémoire? Si possible, comment un type retourné peut-il être traité dans le code?

23
demandé sur dtech 2012-01-18 23:04:40

5 réponses

Sur les systèmes d'exploitation modernes, chaque le processus a son propre espace d'adressage et les adresses ne sont valables que dans un processus. Si vous souhaitez exécuter du code dans un autre processus, vous devez injecter une bibliothèque partagée ou fixez votre programme comme un débogueur.

Une Fois que vous êtes dans l'autre programme de l'espace d'adressage, ce code appelle une fonction à une adresse arbitraire:

typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
43
répondu sbi 2012-01-18 19:16:44

Oui-vous décrivez un pointeur de fonction. Voici un exemple simple;

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

Cela ne fonctionnera probablement pas entre les processus - dans la plupart des systèmes d'exploitation, les processus n'ont pas accès à la mémoire de l'autre.

14
répondu Carl Norum 2012-01-18 19:09:09

Lorsque vous avez besoin d'un appel direct:

((void(*)(void))0x1234)();
2
répondu Ulfhetnar 2017-11-03 17:34:20

Dans la plupart des OP, chaque processus a sa propre mémoire, donc vous ne pouvez pas.

Exemple de code: A. c:

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

Cette erreur de segmentation.

1
répondu asaelr 2012-01-18 19:11:46

Toutes les réponses précédentes sont agréables mais beaucoup trop longues ; -):

int i = ((int (*)(void))0xdeadbeef)();
1
répondu Fuujuhi 2017-06-19 17:01:29