Este artículo de mariozechner.at explora la inyección de código en macOS, una técnica que permite modificar el comportamiento de un proceso en ejecución. La motivación surge de la imposibilidad de usar Live++, una herramienta de 'hot-reload' para C/C++ que funciona en Windows y consolas, en macOS. El artículo presenta una guía práctica para lograr una inyección de código básica, aunque no tan potente como Live++.
¿Cómo funciona? El proceso implica adjuntarse a un proceso en ejecución (similar a un depurador) y modificar su memoria. Esto se logra utilizando las APIs de Mach de macOS, específicamente task_for_pid(), que permite obtener un 'task port' para interactuar con el proceso objetivo. El artículo comienza con un programa de prueba en C que imprime un valor y luego se modifica para escribir su PID, la dirección de la función foo() y la dirección de la variable data() en un archivo llamado data.txt. El programa de inyección lee este archivo para obtener la información necesaria. Posteriormente, se utiliza task_for_pid() para obtener el 'task port' del proceso objetivo.
Contexto Técnico: Para que el programa de inyección funcione, necesita 'entitlements', permisos especiales que le permiten interactuar con otros procesos. Estos entitlements se configuran a través de codesign, una herramienta de Xcode, y se especifican en un archivo entitlements.plist. El entitlement com.apple.security.cs.debugger otorga al programa de inyección capacidades similares a las de un depurador. Un aspecto importante es la necesidad de compensar la 'Address Space Layout Randomization' (ASLR), una técnica de seguridad que aleatoriza las direcciones de memoria en tiempo de ejecución. Aunque el artículo sugiere parsear la salida de nm para obtener las direcciones, la forma más sencilla es escribir las direcciones reales en un archivo durante la ejecución del programa de prueba.
Casos de Uso: Aunque el artículo presenta una implementación básica, la inyección de código tiene aplicaciones en áreas como depuración avanzada, instrumentación de aplicaciones, y desarrollo de herramientas de seguridad. Permite modificar el comportamiento de un proceso en tiempo real, lo cual es útil para análisis y depuración.
Consideraciones: La inyección de código es una técnica compleja y potencialmente peligrosa. Requiere un conocimiento profundo de las APIs de macOS y puede ser fácilmente bloqueada por medidas de seguridad. Además, el código inyectado debe ser compatible con la arquitectura del proceso objetivo. La implementación presentada es una demostración simplificada y no está destinada a producción. Alternativas incluyen el uso de depuradores tradicionales o herramientas de instrumentación más sofisticadas.
