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 algún código que no conoce 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?Llamar a una función a través de su dirección en la memoria en c/C++
Respuesta
En los sistemas operativos modernos, cada proceso tiene su propio espacio de direcciones y direcciones sólo son válidos dentro de un proceso. Si desea ejecutar código en algún otro proceso, que o bien tienen que 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();
Gracias a @ R.Martinho por el [mejor estilo para los prototipos de función typedef] (http://chat.stackoverflow.com/transcript/message/2400130#2400130). ¡Ni siquiera sabía que esto funciona! – sbi
Muy agradable. Este método es mucho más fácil que usar el ensamblaje en línea si el objetivo también es el proceso C. +1 para ti. –
AFAIK, no hay forma de * escribir * memoria en el espacio de direcciones de otros programas en los nuevos sistemas operativos y eso causa un SEGFAULT. Pero no hay nada que impida que un programa lea cualquier ubicación de la memoria (por lo tanto, el error heartbleed da miedo en OpenSSL, ya que puede leer cualquier cosa en la memoria con eso). Entonces, ¿podría explicar por qué no puedo acceder al espacio de direcciones de otro programa y necesito bibliotecas compartidas o depurador? –
Sí, está describiendo un puntero de función. Aquí hay un ejemplo simple;
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
Probablemente no funcione entre procesos: en la mayoría de los sistemas operativos, los procesos no tienen acceso a la memoria de los demás.
En la mayoría OP, cada proceso tiene su propia memoria, por lo que se puede' t.
Código de ejemplo: 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 conseguir fallo de segmentación.
En c c + + puede acceder a cualquier ubicación de memoria que desee, para bien o para mal – dtech
@ddriver: C++ le permite acceder a cualquier ubicación _virtual_ de memoria. Sin embargo, muchos sistemas operativos le dan a cada proceso su propia memoria virtual, por lo que no pueden afectarse entre sí. Sin embargo, hay llamadas específicas del sistema operativo que puede hacer/usar para afectar otra memoria de procesos. –
@ddriver - no, no puedes. Solo puede acceder a las ubicaciones de memoria a las que el sistema operativo le permite acceder. Todo lo que su programa sabe es el entorno de memoria virtual en el que se está ejecutando, que normalmente no tiene relación con la realidad física. –
Todas las respuestas anteriores son agradable, pero demasiado tiempo ;-):
int i = ((int (*)(void))0xdeadbeef)();
No, fueron geniales. La tuya, por otro lado, es muy pobre. Sin explicaciones en absoluto. –
Es un trazador de líneas agradable – BullyWiiPlaza
cuando se necesita una llamada directa:
((void(*)(void))0x1234)();
- 1. Llamar a una función virtual estáticamente a través de un puntero a la función
- 2. ¿Se puede llamar a una función estática a través de un puntero de función en C?
- 3. ¿Se puede acceder a una variable privada a través de su dirección?
- 4. Llamar a una función const en lugar de a su versión no const
- 5. jQuery - Llamar a una función en línea
- 6. Llamar a la función periódicamente en Java
- 7. Llamar a la función javascript en iframe
- 8. Cómo llamar a la función C# sobrecargada a través de JQuery en Asp.Net MVC 2
- 9. ¿Función para llamar a una función repetidamente?
- 10. php: Llamar a clases estáticas a través de una variable
- 11. Crear y llamar a la función python desde la cadena a través de C API
- 12. Accediendo a la dirección de memoria de objetos en ruby ...?
- 13. llamar a una función javascript específica cuando hay varias funciones del mismo nombre en la memoria
- 14. ¿Cómo llamar a través de un puntero de función miembro?
- 15. Usar una cadena para llamar a la función en Python
- 16. llamando a sizeof en una llamada de función salta realmente llamar a la función!}
- 17. Llamar a una función desde su nombre como una cadena en f #
- 18. Llamar a una función solo una vez
- 19. Llamar a una función de una cadena en C#
- 20. Llamar a la función definida por jQuery a través de la cadena
- 21. ¿Cómo llamar a la función javascript asignada a una variable?
- 22. Llamar a función recursiva en JavaScript
- 23. Llamar a la función php desde JavaScript
- 24. Llamar a una función de miembro en un objeto no
- 25. Obtener una dirección MAC remota a través de IPv6
- 26. ¿Cómo traducir una dirección de memoria virtual a una dirección física?
- 27. Inicializar Puntero A través de la función
- 28. Accediendo a una función de ActionScript a través de Javascript
- 29. Cómo llamar a la función en el temporizador ASP.NET MVC
- 30. Llamar a una función en una ExtJS XTemplate
proceso? o hilo? – Cyan
En C++ no hay procesos. Debes especificar tu plataforma si quieres ayuda con eso. –
¿De otro proceso? Ese es un caso muy especial. ¿En serio necesitas eso? – jalf