🪝Outil Frida
Dernière mise à jour
Dernière mise à jour
Frida est une boîte à outils d’instrumentation de code dynamique. Il vous permet d'injecter des extraits de JavaScript ou de votre propre bibliothèque dans des applications natives sur Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD et QNX. Frida vous fournit également des outils simples construits sur l'API Frida. Ceux-ci peuvent être utilisés tels quels, adaptés à vos besoins ou servir d'exemples d'utilisation de l'API.
$ pip install frida-tools
ressource: https://github.com/frida/frida
Télécharger le binaire frida-server
approprié à l'appareil utilisé via la page de releases suivante:
Importer le binaire sur l'appareil via la commande $ adb push frida-server /data/local/tmp/
Donner les permissions au binaire via la commande $ adb shell "chmod 755 /data/local/tmp/frida-server"
Puis lancer le binaire en arrière-plan via la commande $ adb shell "/data/local/tmp/frida-server &"
Note: Pour fonctionner, frida-server a besoin de permissions élevées sur l'appareil. Il est donc nécessaire de rooter celui-ci pour l'utiliser.
Dans un premier temps lorsqu'on utilise l'API Javascript Frida, on doit se connecter à JVM (Java Virtual Machine).
Pour cela on utilise Java.perform
:
Ensuite, il nous faut importer la classe que l'on souhaite tester avec Java.use
:
Enfin, il reste à hook la méthode à tester comme ceci:
Où [Classe]
est la variable définie prédèdemment, [Method]
est la fonction du code hookée et [args]
représente le ou les arguments utilisés par la fonction.
Le hooking permet ainsi d'intéragir avec des fonction android dynamiquement.
Exemple:
Permet d'intercepter la méthode getDeviceId
et log l'ID de l'appareil via la commande console.log()
Pour les méthodes non statiques, il est d'abord nécessaire de créer une instance de la classe avec la méthode "$new()".
Dans le cas où l'instance existe déjà, on utilise les API suivantes:
Java.performNow : Execute le code dans le contexte du runtime Java.
Java.choose : Pour choisir l'instance que l'on souhaite utiliser.
Java.choose utilise les deux callbacks suivants:
onMatch : Cette fonction est exécutée pour chaque instance de la classe spécifiée trouvée lors de l'opération Java.choose. Il reçoit l'instance actuelle comme paramètre. On peut y définir des actions personnalisées à effectuer sur chaque instance. Le paramètre d'instance représente chaque instance correspondante de la classe cible.
onComplete : Est utiliser pour définir des actions à effectuer à la fin de la fonction onMatch (exemple: actions de nettoyage).
Sous Android, certaines opérations, notamment celles qui interagissent avec l’interface utilisateur, doivent être effectuées sur le thread principal (également appelé thread UI). En effet, le framework Android applique la sécurité des threads pour les composants de l'interface utilisateur et n'autorise pas les mises à jour des éléments de l'interface utilisateur à partir des threads d'arrière-plan.
Il est donc nécessaire d'utiliser la fonction Java.scheduleOnMainThread pour utiliser le thread principal pendant l'operation.
Pour les constructors, on utilise la méthode "$init()".
Frida permet également de hook des fonctions natives avec Interceptor.attach()
.
Exemple avec malloc:
Exemple avec une librairies interne à l'application:
Ce script permet de s'attacher à la fonction native malloc afin de log la taille de chaque allocation mémoire.
Frida-trace est un utilitaire de Frida permettant de tracer les appels en temps réel.
Exemple d'utilisation:
$ frida-trace -U -f com.target.xyz -i "open*"
ressource: https://frida.re/docs/frida-trace/