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?
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();
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.
Lorsque vous avez besoin d'un appel direct:
((void(*)(void))0x1234)();
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.
Toutes les réponses précédentes sont agréables mais beaucoup trop longues ; -):
int i = ((int (*)(void))0xdeadbeef)();