🪝Outil Frida

Description

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.

Installation

$ pip install frida-tools

ressource: https://github.com/frida/frida

Installation sur Android

  • 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.

Hooking (bases)

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:

Java.perform(() => {
    console.log("Hello World!");
});

Ensuite, il nous faut importer la classe que l'on souhaite tester avec Java.use:

var class1 = Java.use("com.example.xyz.Activity");

Enfin, il reste à hook la méthode à tester comme ceci:

[Classe].[Method].implementation = function([args]){
//Code
};

[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.

Fonctions Android

Le hooking permet ainsi d'intéragir avec des fonction android dynamiquement.

Exemple:

Java.perform(function() {
    var TelephonyManager = Java.use('android.telephony.TelephonyManager');
    
    TelephonyManager.getDeviceId.implementation = function() {
        var deviceId = this.getDeviceId();
        console.log('[+] Device Id:", deviceId);
        return deviceId;
    };
});

Permet d'intercepter la méthode getDeviceId et log l'ID de l'appareil via la commande console.log()

API / Fonctions natives

Frida permet également de hook des fonctions natives avec Interceptor.attach().

Exemple avec malloc:

Interceptor.attach(Module.findByName(null, 'malloc'), {
    onEnter: function(args) {
        var size = args[0].toInt32();
        console.log('[+] Memory Allocation:', size, 'bytes');
    };
});

Ce script permet de s'attacher à la fonction native malloc afin de log la taille de chaque allocation mémoire.

Dernière mise à jour