hacktricks/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md

346 lines
16 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# Tutoriel Frida
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
</details>
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
**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**](https://go.intigriti.com/hacktricks) dès aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $** !
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
{% embed url="https://go.intigriti.com/hacktricks" %}
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
## Installation
2023-06-03 13:10:46 +00:00
Installez les **outils frida** :
2020-09-09 15:07:39 +00:00
```bash
pip install frida-tools
pip install frida
```
2023-06-03 13:10:46 +00:00
**Téléchargez et installez** le **serveur frida** sur l'Android ([Téléchargez la dernière version](https://github.com/frida/frida/releases)).\
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 :
2020-09-09 15:07:39 +00:00
```bash
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 &"
```
2023-06-03 13:10:46 +00:00
**Vérifiez** si cela **fonctionne** :
2020-09-09 15:07:39 +00:00
```bash
frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
```
2023-06-03 13:10:46 +00:00
## Tutoriels
2023-06-03 13:10:46 +00:00
### [Tutoriel 1](frida-tutorial-1.md)
2023-06-03 13:10:46 +00:00
**De**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
2023-06-03 13:10:46 +00:00
**Code source**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
2023-06-03 13:10:46 +00:00
Suivez le [lien pour le lire](frida-tutorial-1.md).
2023-06-03 13:10:46 +00:00
### [Tutoriel 2](frida-tutorial-2.md)
2023-06-03 13:10:46 +00:00
**De**: [https://11x256.github.io/Frida-hooking-android-part-2/](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](https://github.com/11x256/frida-android-examples)
2023-06-03 13:10:46 +00:00
Suivez le [lien pour le lire](frida-tutorial-2.md).
2023-06-03 13:10:46 +00:00
### [Tutoriel 3](owaspuncrackable-1.md)
2023-06-03 13:10:46 +00:00
**De**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk)
2023-06-03 13:10:46 +00:00
Suivez le [lien pour le lire](owaspuncrackable-1.md).\
**Vous pouvez trouver des scripts Frida impressionnants ici:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
2023-06-03 13:10:46 +00:00
## Exemples rapides
2023-06-03 13:10:46 +00:00
Ici, vous pouvez trouver les fonctionnalités les plus basiques et intéressantes de Frida pour créer rapidement un script :
2023-06-03 13:10:46 +00:00
### Appeler Frida depuis la ligne de commande
```bash
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.
```
2023-06-03 13:10:46 +00:00
### Script Python de base
```python
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()
```
2023-06-03 13:10:46 +00:00
### Accrocher des fonctions sans paramètres
2023-06-03 13:10:46 +00:00
Accrochez la fonction `a()` de la classe `sg.vantagepoint.a.c`.
```javascript
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;
};
});
```
2023-06-03 13:10:46 +00:00
# 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
```java
public class Example {
public static void main(String[] args) {
System.out.println("Hello, world!");
System.exit(0);
}
}
```
## Script Frida
2023-06-03 13:10:46 +00:00
```js
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);
};
});
```
2023-06-03 13:10:46 +00:00
## Exécution
```bash
$ javac Example.java
$ frida -f java -l script.js --no-pause Example
```
## Résultat
```
Intercepté System.exit(0)
Intercepté Runtime.exit(0)
```
```javascript
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 :)");
};
```
2023-06-03 13:10:46 +00:00
# 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](https://www.frida.re/docs/android/).
2023-06-03 13:10:46 +00:00
## É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:
2023-06-03 13:10:46 +00:00
```javascript
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:
```bash
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.
```javascript
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);
};
```
2023-06-03 13:10:46 +00:00
# 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 :
```javascript
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.
2023-06-03 13:10:46 +00:00
## Conclusion
2023-06-03 13:10:46 +00:00
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.
```javascript
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);
};
```
2023-06-03 13:10:46 +00:00
### Accrochage de fonctions avec des paramètres et récupération de la valeur
2023-06-03 13:10:46 +00:00
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:
```javascript
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
};
```
2023-06-03 13:10:46 +00:00
### Accrochage de fonctions et appel avec notre entrée
2023-06-03 13:10:46 +00:00
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](https://11x256.github.io/Frida-hooking-android-part-2/))
```javascript
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;
};
```
2023-06-03 13:10:46 +00:00
### Obtenir un objet déjà créé d'une classe
2023-06-03 13:10:46 +00:00
Si vous voulez extraire un attribut d'un objet créé, vous pouvez utiliser ceci.
2023-06-03 13:10:46 +00:00
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 :
```javascript
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(){}
});
```
2022-10-27 23:22:18 +00:00
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
**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**](https://go.intigriti.com/hacktricks) aujourd'hui et commencez à gagner des primes allant jusqu'à **100 000 $**!
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
{% embed url="https://go.intigriti.com/hacktricks" %}
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
<details>
2022-04-28 16:01:33 +00:00
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* Travaillez-vous dans une **entreprise de cybersécurité**? Voulez-vous voir votre **entreprise annoncée dans HackTricks**? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF**? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop)!
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
2022-04-28 16:01:33 +00:00
</details>