* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Crea una **dylib** con una sección **`__interpose`** (o una sección marcada con **`S_INTERPOSING`**) que contenga tuplas de **punteros a funciones** que se refieran a las funciones **originales** y a las funciones **de reemplazo**.
Luego, **inyecta** la dylib con **`DYLD_INSERT_LIBRARIES`** (la interposición debe ocurrir antes de que la aplicación principal se cargue). Obviamente, las [**restricciones** aplicadas al uso de **`DYLD_INSERT_LIBRARIES`** también se aplican aquí](../macos-proces-abuse/macos-library-injection/#check-restrictions). 
Este es un ejemplo de código en C que muestra cómo realizar el hooking de funciones en macOS. El código utiliza la función `dlsym` de la biblioteca `dlfcn.h` para obtener un puntero a la función original que se va a interponer. Luego, se imprime un mensaje indicando que se está abriendo un archivo y se llama a la función original utilizando el puntero obtenido.
En el caso de la función `open`, se define un tipo de puntero a función `orig_open_type` que toma los mismos argumentos y devuelve el mismo tipo de valor que la función original. Se declara una variable `orig_open` de este tipo y se le asigna el valor obtenido mediante `dlsym`. Luego, se imprime el nombre del archivo que se está abriendo y se llama a la función original utilizando el puntero `orig_open`.
En el caso de la función `fopen`, se sigue el mismo proceso que en el caso de `open`, pero utilizando un tipo de puntero a función `orig_fopen_type` y una variable `orig_fopen`.
Este código puede ser compilado como una biblioteca compartida y cargado en un proceso en ejecución utilizando la variable de entorno `DYLD_INSERT_LIBRARIES`. Una vez cargado, el código interpondrá las funciones `open` y `fopen`, imprimiendo un mensaje cada vez que se llamen. Esto puede ser útil para realizar análisis de comportamiento de aplicaciones o para realizar modificaciones en tiempo de ejecución.
Se necesita el **objeto**, el **método** y los **parámetros**. Y cuando se llama a un método, se envía un **mensaje** utilizando la función **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
El objeto es **`someObject`**, el método es **`@selector(method1p1:p2:)`** y los argumentos son **value1**, **value2**.
Siguiendo las estructuras de objetos, es posible llegar a una **matriz de métodos** donde se encuentran los **nombres** y **punteros** al código del método.
Ten en cuenta que debido a que los métodos y las clases se acceden en función de sus nombres, esta información se almacena en el binario, por lo que es posible recuperarla con `otool -ov </ruta/bin>` o [`class-dump </ruta/bin>`](https://github.com/nygard/class-dump)
En este caso, si el **código de implementación del método legítimo** verifica el **nombre del método**, podría **detectar** este intercambio de métodos y evitar que se ejecute.
El formato anterior es extraño porque estás cambiando la implementación de 2 métodos uno por el otro. Usando la función **`method_setImplementation`**, puedes **cambiar** la **implementación** de un **método por otro**.
Solo recuerda **almacenar la dirección de la implementación del original** si vas a llamarlo desde la nueva implementación antes de sobrescribirlo, ya que luego será mucho más complicado localizar esa dirección.
En esta página se discuten diferentes formas de enganchar funciones. Sin embargo, todas ellas implican **ejecutar código dentro del proceso para atacar**.
La técnica más sencilla para lograr esto es inyectar un [Dyld a través de variables de entorno o secuestro](../macos-dyld-hijacking-and-dyld\_insert\_libraries.md). Sin embargo, supongo que también se podría hacer mediante [inyección de proceso Dylib](macos-ipc-inter-process-communication/#dylib-process-injection-via-task-port).
Sin embargo, un ataque de enganche de funciones es muy específico, un atacante lo haría para **robar información sensible desde dentro de un proceso** (si no, simplemente se haría un ataque de inyección de proceso). Y esta información sensible podría estar ubicada en aplicaciones descargadas por el usuario, como MacPass.
Por lo tanto, el vector de ataque sería encontrar una vulnerabilidad o eliminar la firma de la aplicación, e inyectar la variable de entorno **`DYLD_INSERT_LIBRARIES`** a través del archivo Info.plist de la aplicación, agregando algo como:
Ten en cuenta que en las versiones más recientes de macOS, si **eliminas la firma** del binario de la aplicación y esta se ejecutó previamente, macOS **ya no ejecutará la aplicación**.
{% endhint %}
#### Ejemplo de biblioteca
```objectivec
// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib
// If you added env vars in the Info.plist don't forget to call lsregister as explained before
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).