Me preguntaba si había una versión equivalente, ya sea en una biblioteca o como una llamada al sistema, de las API de Windows que permiten que un proceso interactúe con el espacio de otro proceso, lo que significaría modificar el flujo de ese segundo proceso. Esto es para inyectar un .so en un proceso en ejecución sin eliminarlo.
¡Gracias!
tal vez eche un vistazo aquí: CreateRemoteThread en Linux
No conozco una forma más sencilla que la descrita allí. En Windows, tiene esta elegante API como VirtualProtectEx. En Linux, estaría escribiendo un .so que, por ejemplo, ejecuta pthread_create en una __attribute__((constructor)) . Entonces cargarías eso .so a través del mecanismo LD_PRELOAD.
Lo mejor después de CreateRemoteThread sería manipular el subproceso principal del proceso con la API de ptrace. Pero esto implicaría
Creo que manipular los derechos de acceso a la memoria también implicaría llamar a mprotect desde un contexto de proceso. Como ya se mencionó anteriormente, la forma más sencilla de hacerlo no sería usar ptrace sino usar un objeto compartido precompilado.
En Linux, existe un mecanismo estándar para inyectar su código en un programa. Básicamente, define una variable de entorno LD_PRELOAD que especifica una biblioteca .so que se carga antes que todos los demás archivos .so. Las funciones en ese .so reemplazarán las versiones estándar de las funciones. No hay necesidad de modificar el código ensamblador de las funciones manualmente para insertar ganchos en su propio código como en Windows.
Aquí hay un buen tutorial: https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/