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?

Author: dtech, 2012-01-18

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();
 43
Author: sbi,
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.

 14
Author: Carl Norum,
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)();
 2
Author: Ulfhetnar,
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.

 1
Author: asaelr,
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)();
 1
Author: Fuujuhi,
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