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

419 lines
19 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
* 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 [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
2023-06-03 13:10:46 +00:00
* 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
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2022-04-28 16:01:33 +00:00
**Astuce de bug bounty** : **inscrivez-vous** sur **Intigriti**, une plateforme premium de **bug bounty créée par des hackers, pour des hackers** ! 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
```
**Téléchargez et installez** sur l'Android le **serveur frida** ([Téléchargez la dernière version](https://github.com/frida/frida/releases)).\
2023-06-03 13:10:46 +00:00
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 :
{% code overflow="wrap" %}
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 &"
```
{% endcode %}
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)
**Depuis**: [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)
**Depuis**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parties 2, 3 et 4)\
2023-06-03 13:10:46 +00:00
**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)
**Depuis**: [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
# Attach to the target process
session = frida.attach("com.example.app")
# Define the JavaScript code to be injected
js_code = """
Java.perform(function () {
// Find the target method
var targetMethod = Java.use("com.example.app.TargetClass.targetMethod");
// Hook the target method
targetMethod.implementation = function () {
// Print the arguments passed to the method
console.log("Arguments: " + Array.prototype.slice.call(arguments));
// Call the original method
var result = this.targetMethod.apply(this, arguments);
// Print the result
console.log("Result: " + result);
// Modify the result
result += 100;
// Return the modified result
return result;
};
});
"""
# Create the script
script = session.create_script(js_code)
# Load the script into the target process
script.load()
# Detach from the target process
session.detach()
```
### Script Python de base
```python
import frida
# Se connecter au processus cible
session = frida.attach("com.example.app")
# Définir le code JavaScript à injecter
js_code = """
Java.perform(function () {
// Trouver la méthode cible
var targetMethod = Java.use("com.example.app.TargetClass.targetMethod");
// Accrocher la méthode cible
targetMethod.implementation = function () {
// Afficher les arguments passés à la méthode
console.log("Arguments : " + Array.prototype.slice.call(arguments));
// Appeler la méthode originale
var result = this.targetMethod.apply(this, arguments);
// Afficher le résultat
console.log("Résultat : " + result);
// Modifier le résultat
result += 100;
// Retourner le résultat modifié
return result;
};
});
"""
# Créer le script
script = session.create_script(js_code)
# Charger le script dans le processus cible
script.load()
# Se détacher du processus cible
session.detach()
```
```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
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;
};
});
```
# Tutoriel Frida : Hook de la méthode `exit()` en Java
2023-06-03 13:10:46 +00:00
Dans ce tutoriel, nous allons apprendre comment utiliser Frida pour effectuer un hook sur la méthode `exit()` en Java. Frida est un outil puissant qui permet d'intercepter et de modifier le comportement des applications en temps réel.
2023-06-03 13:10:46 +00:00
## Prérequis
Avant de commencer, assurez-vous d'avoir installé Frida sur votre appareil Android. Vous pouvez trouver les instructions d'installation dans la [documentation officielle de Frida](https://frida.re/docs/android/).
2023-06-03 13:10:46 +00:00
## Étapes
1. Tout d'abord, nous devons créer un script Frida pour effectuer le hook sur la méthode `exit()`. Créez un nouveau fichier avec l'extension `.js` et ajoutez le code suivant :
2023-06-03 13:10:46 +00:00
```javascript
Java.perform(function() {
var System = Java.use('java.lang.System');
var Runtime = Java.use('java.lang.Runtime');
// Hook de la méthode exit()
System.exit.implementation = function() {
console.log('La méthode exit() a été appelée !');
// Ajoutez ici votre code personnalisé
// ...
// Appel de la méthode originale
this.exit.apply(this, arguments);
};
});
```
2023-06-03 13:10:46 +00:00
2. Enregistrez le fichier avec le nom de votre choix, par exemple `hook_exit.js`.
2023-06-03 13:10:46 +00:00
3. Maintenant, nous allons utiliser Frida pour charger notre script et effectuer le hook sur l'application cible. Ouvrez une nouvelle fenêtre de terminal et exécutez la commande suivante :
```bash
frida -U -l hook_exit.js --no-pause -f <nom_de_l'application>
```
Assurez-vous de remplacer `<nom_de_l'application>` par le nom du package de l'application que vous souhaitez cibler.
4. L'application cible sera lancée sur votre appareil Android et le script Frida sera exécuté. Lorsque la méthode `exit()` sera appelée, vous verrez le message "La méthode exit() a été appelée !" s'afficher dans la console.
5. À ce stade, vous pouvez ajouter votre propre code personnalisé à l'intérieur de la fonction de hook pour modifier le comportement de l'application lorsque la méthode `exit()` est appelée.
Et voilà ! Vous avez réussi à effectuer un hook sur la méthode `exit()` en Java à l'aide de Frida. Vous pouvez utiliser cette technique pour analyser et modifier le comportement des applications Android lorsqu'elles tentent de quitter.
```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 :)");
};
```
# Tutoriel Frida : Accrocher `.onStart()` & `.onCreate()` de MainActivity
2023-06-03 13:10:46 +00:00
Dans ce tutoriel, nous allons apprendre comment utiliser Frida pour accrocher les méthodes `.onStart()` et `.onCreate()` de la classe MainActivity dans une application Android.
2023-06-03 13:10:46 +00:00
## Prérequis
- Un appareil Android rooté ou un émulateur Android
- Frida Server installé sur l'appareil cible
- Un ordinateur avec Frida installé
2023-06-03 13:10:46 +00:00
## Étapes
2023-06-03 13:10:46 +00:00
1. Tout d'abord, assurez-vous que Frida Server est en cours d'exécution sur l'appareil cible. Vous pouvez le démarrer en utilisant la commande suivante :
2023-06-03 13:10:46 +00:00
```
frida-server -D
```
2. Connectez votre ordinateur à l'appareil cible en utilisant Frida. Vous pouvez utiliser la commande suivante :
```
frida -U com.package.name
```
2023-06-03 13:10:46 +00:00
Assurez-vous de remplacer `com.package.name` par le nom du package de l'application que vous souhaitez cibler.
2023-06-03 13:10:46 +00:00
3. Une fois connecté à l'appareil cible, vous pouvez utiliser Frida pour accrocher les méthodes `.onStart()` et `.onCreate()` de la classe MainActivity. Voici le script Frida que vous pouvez utiliser :
2023-06-03 13:10:46 +00:00
```javascript
Java.perform(function() {
var MainActivity = Java.use('com.package.name.MainActivity');
MainActivity.onStart.implementation = function() {
console.log('Hooked MainActivity.onStart()');
this.onStart();
};
MainActivity.onCreate.implementation = function() {
console.log('Hooked MainActivity.onCreate()');
this.onCreate();
};
});
```
2023-06-03 13:10:46 +00:00
Assurez-vous de remplacer `com.package.name` par le nom du package de l'application que vous ciblez.
2023-06-03 13:10:46 +00:00
4. Enregistrez le script Frida dans un fichier, par exemple `hook.js`.
2023-06-03 13:10:46 +00:00
5. Utilisez Frida pour exécuter le script sur l'appareil cible en utilisant la commande suivante :
```
frida -U -l hook.js com.package.name
```
Assurez-vous de remplacer `com.package.name` par le nom du package de l'application que vous ciblez.
6. Maintenant, lorsque l'application cible est lancée et que la méthode `.onStart()` ou `.onCreate()` de la classe MainActivity est appelée, vous verrez les messages "Hooked MainActivity.onStart()" ou "Hooked MainActivity.onCreate()" dans la sortie de Frida.
C'est tout ! Vous avez réussi à accrocher les méthodes `.onStart()` et `.onCreate()` de la classe MainActivity en utilisant Frida. Vous pouvez maintenant utiliser cette technique pour effectuer des tests de pénétration sur des applications Android et analyser leur comportement.
```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);
};
```
# Hook android `.onCreate()`
2023-06-03 13:10:46 +00:00
To hook the `.onCreate()` method in an Android application, we can use the Frida framework. Frida allows us to dynamically inject JavaScript code into the running application and modify its behavior.
2023-06-03 13:10:46 +00:00
Here's an example of how to hook the `.onCreate()` method using Frida:
2023-06-03 13:10:46 +00:00
```javascript
Java.perform(function() {
var targetClass = Java.use('com.example.MyActivity');
targetClass.onCreate.implementation = function(savedInstanceState) {
// Your custom code here
console.log('Hooked .onCreate()');
// Call the original method
this.onCreate(savedInstanceState);
};
});
```
2023-06-03 13:10:46 +00:00
In the above code, we first use `Java.use()` to get a reference to the target class (`com.example.MyActivity`). Then, we override the `.onCreate()` method by assigning our custom implementation to `targetClass.onCreate.implementation`. Inside our custom implementation, we can add any code we want to execute when the `.onCreate()` method is called. In this example, we simply log a message to the console.
2023-06-03 13:10:46 +00:00
Finally, we call the original `.onCreate()` method using `this.onCreate(savedInstanceState)` to ensure that the original functionality is preserved.
2023-06-03 13:10:46 +00:00
Remember to replace `com.example.MyActivity` with the actual class name you want to hook.
By hooking the `.onCreate()` method, we can intercept and modify the application's behavior at the very beginning of its lifecycle. This can be useful for various purposes, such as bypassing license checks, manipulating input data, or analyzing the application's initialization process.
Note: Make sure you have the necessary permissions and legal authorization before performing any security testing or penetration testing activities.
```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);
};
```
### Accrocher des fonctions avec des paramètres et récupérer 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 :
```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
};
```
### Accrocher des fonctions et les appeler 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
Si vous souhaitez 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 :
```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(){}
});
```
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2022-04-28 16:01:33 +00:00
**Astuce de prime de bug**: **inscrivez-vous** à **Intigriti**, une plateforme premium de **prime de bug créée par des hackers, pour des hackers**! 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
<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
* 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 [**La famille PEASS**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
2023-06-03 13:10:46 +00:00
* 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>