Llamar a una función a través de su dirección en memoria en c / c++
Dado el conocimiento del prototipo de una función y su dirección en memoria, ¿es posible llamar a esta función desde otro proceso o algún fragmento de código que no sabe nada más que el prototipo y la dirección de memoria? Si es posible, ¿cómo se puede manejar un tipo devuelto en el código?
5 answers
En los sistemas operativos modernos, cada uno el 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, o bien inyectar una biblioteca compartida o adjunte 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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 19:16:44
Sí - estás describiendo un puntero de función. He aquí 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 19:09:09
Cuando necesite una llamada directa:
((void(*)(void))0x1234)();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 17:34:20
En la mayoría de los OP, cada proceso tiene su propia memoria, por lo que no se puede.
Código de muestra: 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;
}
Este error de segmentación get.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 19:11:46
Todas las respuestas anteriores son agradables pero demasiado largas; -):
int i = ((int (*)(void))0xdeadbeef)();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-19 17:01:29