hacktricks/mobile-pentesting/android-app-pentesting/frida-tutorial
2023-08-16 05:14:14 +00:00
..
frida-tutorial-1.md Translated ['backdoors/salseo.md', 'forensics/basic-forensic-methodology 2023-08-16 05:14:14 +00:00
frida-tutorial-2.md Translated to French 2023-06-03 13:10:46 +00:00
objection-tutorial.md Translated to French 2023-06-03 13:10:46 +00:00
owaspuncrackable-1.md Translated ['generic-methodologies-and-resources/shells/windows.md', 'ma 2023-07-13 10:25:02 +00:00
README.md Translated to French 2023-06-03 13:10:46 +00:00

Tutoriel Frida

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Astuce de chasse aux bugs : inscrivez-vous à Intigriti, une plateforme de chasse aux bugs premium créée par des pirates, pour des pirates ! Rejoignez-nous sur https://go.intigriti.com/hacktricks dès aujourd'hui et commencez à gagner des primes allant jusqu'à 100 000 $ !

{% embed url="https://go.intigriti.com/hacktricks" %}

Installation

Installez les outils frida :

pip install frida-tools
pip install frida

Téléchargez et installez le serveur frida sur l'Android (Téléchargez la dernière version).
Une ligne de commande pour redémarrer adb en mode root, se connecter à celui-ci, télécharger frida-server, donner les permissions d'exécution et l'exécuter en arrière-plan :

adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &" 

Vérifiez si cela fonctionne :

frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name

Tutoriels

Tutoriel 1

De: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Code source: https://github.com/t0thkr1s/frida-demo

Suivez le lien pour le lire.

Tutoriel 2

De: https://11x256.github.io/Frida-hooking-android-part-2/ (Parties 2, 3 et 4)
APKs et code source: https://github.com/11x256/frida-android-examples

Suivez le lien pour le lire.

Tutoriel 3

De: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk

Suivez le lien pour le lire.
Vous pouvez trouver des scripts Frida impressionnants ici: https://codeshare.frida.re/

Exemples rapides

Ici, vous pouvez trouver les fonctionnalités les plus basiques et intéressantes de Frida pour créer rapidement un script :

Appeler Frida depuis la ligne de commande

frida-ps -U

#Basic frida hooking
frida -l disableRoot.js -f owasp.mstg.uncrackable1

#Hooking before starting the app
frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
#The --no-pause and -f options allow the app to be spawned automatically,
#frozen so that the instrumentation can occur, and the automatically
#continue execution with our modified code.

Script Python de base

import frida, sys

jscode = open(sys.argv[0]).read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()

Accrocher des fonctions sans paramètres

Accrochez la fonction a() de la classe sg.vantagepoint.a.c.

Java.perform(function () {
;  rootcheck1.a.overload().implementation = function() {
  rootcheck1.a.overload().implementation = function() {
    send("sg.vantagepoint.a.c.a()Z   Root check 1 HIT!  su.exists()");
    return false;
  };
});

Hook de la méthode exit() de Java

Dans cet exemple, nous allons voir comment utiliser Frida pour intercepter les appels à la méthode exit() de Java et les remplacer par notre propre implémentation.

Code Java

public class Example {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
        System.exit(0);
    }
}

Script Frida

Java.perform(function () {
    var System = Java.use('java.lang.System');
    var Runtime = Java.use('java.lang.Runtime');

    // Intercepte System.exit()
    System.exit.implementation = function (statusCode) {
        console.log('Intercepté System.exit(' + statusCode + ')');
        // Appel de notre propre implémentation
        Runtime.getRuntime().exit(statusCode);
    };

    // Intercepte Runtime.exit()
    Runtime.exit.implementation = function (statusCode) {
        console.log('Intercepté Runtime.exit(' + statusCode + ')');
        // Appel de la méthode originale
        this.exit(statusCode);
    };
});

Exécution

$ javac Example.java
$ frida -f java -l script.js --no-pause Example

Résultat

Intercepté System.exit(0)
Intercepté Runtime.exit(0)
var sysexit = Java.use("java.lang.System");
  sysexit.exit.overload("int").implementation = function(var_0) {
    send("java.lang.System.exit(I)V  // We avoid exiting the application  :)");
  };

Hook de .onStart() et .onCreate() de MainActivity

Dans ce tutoriel, nous allons voir comment utiliser Frida pour hooker les méthodes .onStart() et .onCreate() de la classe MainActivity d'une application Android.

Étape 1: Installer Frida sur l'appareil Android

Pour installer Frida sur l'appareil Android, vous pouvez suivre les instructions fournies dans le tutoriel d'installation de Frida.

Étape 2: Démarrer l'application Android

Démarrer l'application Android que vous souhaitez hooker.

Étape 3: Écrire le script Frida

Créez un fichier JavaScript nommé hook.js avec le contenu suivant:

Java.perform(function() {
    var MainActivity = Java.use('com.example.app.MainActivity');

    MainActivity.onCreate.implementation = function() {
        console.log('onCreate() hooked');
        this.onCreate();
    };

    MainActivity.onStart.implementation = function() {
        console.log('onStart() hooked');
        this.onStart();
    };
});

Ce script hookera les méthodes .onStart() et .onCreate() de la classe MainActivity.

Étape 4: Exécuter le script Frida

Exécutez le script Frida en utilisant la commande suivante:

frida -U -f com.example.app -l hook.js --no-pause

Assurez-vous de remplacer com.example.app par le nom de votre application.

Étape 5: Vérifier la sortie

Ouvrez la console et vérifiez la sortie. Vous devriez voir les messages onCreate() hooked et onStart() hooked s'afficher lorsque les méthodes correspondantes sont appelées.

C'est tout! Vous avez maintenant hooké les méthodes .onStart() et .onCreate() de la classe MainActivity de votre application Android en utilisant Frida.

var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity");
  mainactivity.onStart.overload().implementation = function() {
    send("MainActivity.onStart() HIT!!!");
    var ret = this.onStart.overload().call(this);
  };
  mainactivity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
    send("MainActivity.onCreate() HIT!!!");
    var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
  };

Accrocher .onCreate() d'Android

Frida est un outil puissant pour l'analyse dynamique des applications. L'un des cas d'utilisation les plus courants consiste à accrocher des méthodes spécifiques de l'application pour intercepter et manipuler les données en temps réel.

Dans ce tutoriel, nous allons voir comment accrocher la méthode .onCreate() d'une application Android à l'aide de Frida.

Étape 1 - Prérequis

Assurez-vous d'avoir installé Frida sur votre machine. Si ce n'est pas le cas, vous pouvez suivre les instructions d'installation à partir du site officiel de Frida.

Étape 2 - Démarrer l'application

Tout d'abord, nous devons démarrer l'application que nous voulons analyser. Vous pouvez utiliser n'importe quelle application Android pour cet exemple.

Étape 3 - Écrire le script Frida

Maintenant, nous allons écrire un script Frida pour accrocher la méthode .onCreate() de l'application. Ouvrez votre éditeur de texte préféré et créez un nouveau fichier avec le nom hook_oncreate.js. Copiez et collez le code suivant dans le fichier :

Java.perform(function () {
    var MainActivity = Java.use('com.example.app.MainActivity');
    MainActivity.onCreate.implementation = function () {
        console.log('[+] onCreate() called');
        this.onCreate();
    };
});

Ce script utilise la fonction Java.use() pour charger la classe MainActivity de l'application. Ensuite, il accroche la méthode .onCreate() en remplaçant son implémentation par une nouvelle fonction qui affiche un message dans la console et appelle la méthode originale.

Étape 4 - Exécuter le script Frida

Maintenant, nous pouvons exécuter le script Frida en utilisant la commande suivante :

frida -U com.example.app -l hook_oncreate.js --no-pause

Assurez-vous de remplacer com.example.app par le nom de l'application que vous voulez analyser.

Étape 5 - Vérifier la sortie

Si tout s'est bien passé, vous devriez voir le message [+] onCreate() called s'afficher dans la console chaque fois que la méthode .onCreate() est appelée dans l'application.

Conclusion

Dans ce tutoriel, nous avons vu comment accrocher la méthode .onCreate() d'une application Android à l'aide de Frida. Cela peut être utile pour intercepter et manipuler les données en temps réel dans une application.

  var activity = Java.use("android.app.Activity");
  activity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
    send("Activity HIT!!!");
    var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
  };

Accrochage de fonctions avec des paramètres et récupération de la valeur

Accrocher une fonction de décryptage. Imprimer l'entrée, appeler la fonction originale pour décrypter l'entrée et enfin, imprimer les données en clair:

  function getString(data){
      var ret = "";
      for (var i=0; i < data.length; i++){
          ret += data[i].toString();
        }
      return ret
    } 
  var aes_decrypt = Java.use("sg.vantagepoint.a.a");
  aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
    send("sg.vantagepoint.a.a.a([B[B)[B   doFinal(enc)  // AES/ECB/PKCS7Padding");
    send("Key       : " + getString(var_0));
    send("Encrypted : " + getString(var_1));
    var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
    send("Decrypted : " + ret);

    var flag = "";
    for (var i=0; i < ret.length; i++){
      flag += String.fromCharCode(ret[i]);
    }
    send("Decrypted flag: " + flag);
    return ret; //[B
  };

Accrochage de fonctions et appel avec notre entrée

Accrochez une fonction qui reçoit une chaîne de caractères et appelez-la avec une autre chaîne de caractères (à partir de ici)

var string_class = Java.use("java.lang.String"); // get a JS wrapper for java's String class

my_class.fun.overload("java.lang.String").implementation = function(x){ //hooking the new function
  var my_string = string_class.$new("My TeSt String#####"); //creating a new String by using `new` operator 
  console.log("Original arg: " +x );
  var ret =  this.fun(my_string); // calling the original function with the new String, and putting its return value in ret variable
  console.log("Return value: "+ret);
  return ret;
};

Obtenir un objet déjà créé d'une classe

Si vous voulez extraire un attribut d'un objet créé, vous pouvez utiliser ceci.

Dans cet exemple, vous allez voir comment obtenir l'objet de la classe my_activity et comment appeler la fonction .secret() qui affichera un attribut privé de l'objet :

Java.choose("com.example.a11x256.frida_test.my_activity" , {
  onMatch : function(instance){ //This function will be called for every instance found by frida
    console.log("Found instance: "+instance);
    console.log("Result of secret func: " + instance.secret());
  },
  onComplete:function(){}
});

Astuce de prime de bug: inscrivez-vous à Intigriti, une plateforme de prime de bug premium créée par des hackers, pour les hackers! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui et commencez à gagner des primes allant jusqu'à 100 000 $!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥