punteros - Llamando una función a través de su dirección en memoria en c/c++
punteros en c (5)
Dado el conocimiento del prototipo de una función y su dirección en la memoria, ¿es posible llamar a esta función desde otro proceso o alguna pieza de código que no sepa nada más que el prototipo y la dirección de la memoria? Si es posible, ¿cómo se puede volver a manejar un tipo devuelto en el código?
Cuando necesites una llamada directa:
((void(*)(void))0x1234)();
En la mayoría de los OP, cada proceso tiene su propia memoria, por lo que no puede.
Código de muestra: ac:
#include <stdio.h>
int r() {return 2;}
int main() {
printf("%p/n",r);
while(1);
}
antes de Cristo:
#include <stdio.h>
int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%d/n",a);
return 0;
}
esto consigue la falla de segmentación.
En los sistemas operativos modernos, cada proceso tiene su propio espacio de direcciones y las direcciones solo son válidas dentro de un proceso. Si desea ejecutar código en algún otro proceso, debe inyectar una biblioteca compartida o adjuntar su programa como un depurador .
Una vez que esté en el espacio de direcciones del otro programa, este código invoca una función en una dirección arbitraria :
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
Sí, estás describiendo un puntero de función. Aquí hay un ejemplo simple;
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
Probablemente no funcionará entre procesos: en la mayoría de los sistemas operativos, los procesos no tienen acceso a la memoria de los demás.
Todas las respuestas anteriores son agradables pero demasiado largas ;-):
int i = ((int (*)(void))0xdeadbeef)();