macOS: Intercepción de la ejecución del programa

macOS: Intercepción de la ejecución del programa

Quiero interceptar una ejecución de ejecutable arbitrario. Supongamos que hay un binario /usr/bin/binary. Cada vez que alguien inicia ese binario, quiero iniciar mi propio ejecutable. A partir de ahí quiero decidir si se debe iniciar o no el binario original. En última instancia, quiero insertar mi cuña entre el binario original y el usuario.

Se ha formulado una pregunta similar sobre Windows:Quiero interceptar un programa determinado antes de que se ejecute y ejecutar mi propio programa primero.

Tengo derechos de administrador del sistema. Sin embargo, no puedo reubicar los archivos binarios originales en otros lugares.

UPDcomo lo preguntó @dirkt:

  • Habrá una lista codificada de archivos binarios que me gustaría interceptar.

Respuesta1

DESCARGO DE RESPONSABILIDAD: Soy un total ignorante en el mundo MacOS, pero les daría alguna forma de hacerlo en GNU/Linux... tal vez ayude.

Hmmm... Habría respondido como @dirkt (también conocido como un contenedor llamado binaryque apuntaría a binary.real) pero:

  1. Si el usuario conoce su mecanismo, podría iniciarlo binary.realdirectamente.
  2. Tienes que duplicar este mecanismo para cada programa que quieras "monitorear".

Así que indaguemos un poco en otro lugar...

El módulo del núcleo

En el mundo GNU/Linux, habría escrito un módulo del kernel para conectar la llamada del sistema ejecutivo e implementar la ACL como desee... pero esto es un poco excesivo. Parece que es posible desarrollar módulos del kernel para Mac OS... Pero no sé si Apple permite ese tipo de pirateo.

El truco LD_PRELOAD

Usando el mecanismo bien conocido LD_PRELOAD(que parece serDYLD_INSERT_LIBRARIES en tu mundo), puede reescribir cualquier función C de cualquier biblioteca de su sistema. Entonces simplemente tienes que:

  1. Escriba una biblioteca dinámica que implemente exec*().
  2. Implemente su ACL.
  3. Asegúrese de que cada sesión de usuario (gráfica, terminal) se inicie con su biblioteca precargada gracias a DYLD_INSERT_LIBRARIES)

¡Y voilá!

información relacionada