mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 13:13:41 +00:00
446 lines
19 KiB
Markdown
446 lines
19 KiB
Markdown
# Tutoriel Frida
|
|
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* 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)
|
|
* 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).
|
|
|
|
</details>
|
|
|
|
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
|
|
|
**Astuce pour les primes de bug** : **inscrivez-vous** sur **Intigriti**, une **plateforme premium de primes de bug 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 $** !
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
## Installation
|
|
|
|
Installez les **outils frida** :
|
|
```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)).\
|
|
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" %}
|
|
```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 %}
|
|
|
|
**Vérifiez** si cela **fonctionne** :
|
|
```bash
|
|
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](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)\
|
|
**Code source**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
|
|
|
Suivez le [lien pour le lire](frida-tutorial-1.md).
|
|
|
|
### [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)\
|
|
**APKs et code source**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
|
|
|
Suivez le [lien pour le lire](frida-tutorial-2.md).
|
|
|
|
### [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)
|
|
|
|
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)
|
|
|
|
## 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
|
|
```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.
|
|
```
|
|
### 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()
|
|
```
|
|
### 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;
|
|
};
|
|
});
|
|
```
|
|
# Hook java `exit()`
|
|
|
|
In this tutorial, we will learn how to hook the `exit()` method in a Java application using Frida. By hooking this method, we can intercept the application's exit calls and perform additional actions before the application terminates.
|
|
|
|
## Prerequisites
|
|
|
|
Before getting started, make sure you have the following:
|
|
|
|
- A rooted Android device or an emulator with Frida Server installed.
|
|
- Frida installed on your computer.
|
|
|
|
## Steps
|
|
|
|
1. Launch the target application on your Android device or emulator.
|
|
|
|
2. Open a terminal and start the Frida REPL by running the following command:
|
|
|
|
```bash
|
|
frida -U -f <package_name> --no-pause
|
|
```
|
|
|
|
Replace `<package_name>` with the package name of the target application.
|
|
|
|
3. In the Frida REPL, enter the following JavaScript code to hook the `exit()` method:
|
|
|
|
```javascript
|
|
Java.perform(function() {
|
|
var System = Java.use('java.lang.System');
|
|
System.exit.implementation = function() {
|
|
console.log('exit() method called');
|
|
// Perform additional actions here
|
|
// ...
|
|
// Call the original exit() method
|
|
this.exit.apply(this, arguments);
|
|
};
|
|
});
|
|
```
|
|
|
|
This code uses the `Java.perform()` function to hook the `exit()` method of the `java.lang.System` class. Inside the hook, you can add your custom actions before calling the original `exit()` method.
|
|
|
|
4. Press `Ctrl + C` to exit the Frida REPL.
|
|
|
|
## Testing
|
|
|
|
To test the hook, trigger an exit event in the target application. You should see the message `'exit() method called'` printed in the terminal where you started the Frida REPL.
|
|
|
|
By hooking the `exit()` method, you can intercept and modify the application's exit behavior, allowing you to perform additional actions or prevent the application from terminating.
|
|
```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
|
|
|
|
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.
|
|
|
|
## Prérequis
|
|
|
|
Avant de commencer, assurez-vous d'avoir les éléments suivants :
|
|
|
|
- Un appareil Android rooté ou un émulateur Android
|
|
- Frida Server installé sur l'appareil cible
|
|
- Un ordinateur avec Frida installé
|
|
|
|
## Étapes
|
|
|
|
1. Tout d'abord, démarrez l'application Android sur votre appareil cible ou émulateur.
|
|
|
|
2. Sur votre ordinateur, ouvrez un terminal et exécutez la commande suivante pour démarrer Frida :
|
|
|
|
```
|
|
frida -U -f com.example.app
|
|
```
|
|
|
|
Assurez-vous de remplacer `com.example.app` par le nom de package de votre application cible.
|
|
|
|
3. Une fois que Frida est connecté à l'application, vous pouvez utiliser le script suivant pour accrocher les méthodes `.onStart()` et `.onCreate()` de la classe MainActivity :
|
|
|
|
```javascript
|
|
Java.perform(function() {
|
|
var MainActivity = Java.use('com.example.app.MainActivity');
|
|
|
|
MainActivity.onStart.implementation = function() {
|
|
console.log('Hooked MainActivity.onStart()');
|
|
this.onStart();
|
|
};
|
|
|
|
MainActivity.onCreate.implementation = function() {
|
|
console.log('Hooked MainActivity.onCreate()');
|
|
this.onCreate();
|
|
};
|
|
});
|
|
```
|
|
|
|
Ce script utilise la fonction `Java.perform()` de Frida pour accéder à la classe MainActivity. Ensuite, il remplace les implémentations des méthodes `.onStart()` et `.onCreate()` par des fonctions personnalisées qui affichent un message de journalisation et appellent ensuite les méthodes d'origine.
|
|
|
|
4. Enregistrez le script dans un fichier, par exemple `hook.js`, puis exécutez la commande suivante pour charger le script dans Frida :
|
|
|
|
```
|
|
frida -U -l hook.js -f com.example.app
|
|
```
|
|
|
|
Encore une fois, assurez-vous de remplacer `com.example.app` par le nom de package de votre application cible.
|
|
|
|
5. Maintenant, lorsque vous exécutez l'application Android, vous devriez voir les messages de journalisation indiquant que les méthodes `.onStart()` et `.onCreate()` ont été accrochées avec succès.
|
|
|
|
```
|
|
Hooked MainActivity.onStart()
|
|
Hooked MainActivity.onCreate()
|
|
```
|
|
|
|
Cela signifie que Frida a réussi à accrocher ces méthodes et à les modifier pour y ajouter du code personnalisé.
|
|
|
|
## Conclusion
|
|
|
|
Dans ce tutoriel, nous avons appris comment utiliser Frida pour accrocher les méthodes `.onStart()` et `.onCreate()` de la classe MainActivity dans une application Android. Cela nous permet de modifier le comportement de ces méthodes et d'ajouter notre propre code. Frida est un outil puissant pour le pentest des applications Android et offre de nombreuses possibilités pour l'analyse et la manipulation dynamique des applications.
|
|
```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);
|
|
};
|
|
```
|
|
# Tutoriel Frida : Hook de `.onCreate()` sur Android
|
|
|
|
Dans ce tutoriel, nous allons apprendre comment utiliser Frida pour effectuer un hook sur la méthode `.onCreate()` d'une application Android. Le hooking de cette méthode nous permettra d'intercepter et de modifier son comportement.
|
|
|
|
## Prérequis
|
|
|
|
Avant de commencer, assurez-vous d'avoir les éléments suivants :
|
|
|
|
- Un appareil Android rooté ou un émulateur Android
|
|
- Frida Server installé sur l'appareil cible
|
|
- Un environnement de développement configuré pour exécuter des scripts Frida
|
|
|
|
## Étapes
|
|
|
|
Suivez les étapes ci-dessous pour effectuer le hook de `.onCreate()` :
|
|
|
|
1. Tout d'abord, identifiez l'application Android sur laquelle vous souhaitez effectuer le hook. Vous pouvez utiliser des outils tels que `adb` pour obtenir la liste des applications installées sur l'appareil cible.
|
|
|
|
2. Lancez l'application cible sur votre appareil Android ou émulateur.
|
|
|
|
3. Dans votre environnement de développement, créez un script Frida pour effectuer le hook. Voici un exemple de script qui affiche un message lorsque la méthode `.onCreate()` est appelée :
|
|
|
|
```javascript
|
|
Java.perform(function() {
|
|
var targetClass = Java.use('com.example.MyActivity');
|
|
targetClass.onCreate.implementation = function() {
|
|
console.log('La méthode .onCreate() a été appelée !');
|
|
this.onCreate();
|
|
};
|
|
});
|
|
```
|
|
|
|
Assurez-vous de remplacer `com.example.MyActivity` par le nom de la classe de l'activité que vous souhaitez cibler.
|
|
|
|
4. Enregistrez le script Frida avec l'extension `.js`, par exemple `hook.js`.
|
|
|
|
5. Dans votre environnement de développement, exécutez le script Frida en utilisant la commande suivante :
|
|
|
|
```bash
|
|
frida -U -l hook.js -f com.example.app
|
|
```
|
|
|
|
Assurez-vous de remplacer `com.example.app` par le nom du package de l'application cible.
|
|
|
|
6. Lorsque l'application cible est lancée, vous devriez voir le message du script Frida s'afficher dans la console de votre environnement de développement chaque fois que la méthode `.onCreate()` est appelée.
|
|
|
|
Et voilà ! Vous avez réussi à effectuer un hook sur la méthode `.onCreate()` d'une application Android en utilisant Frida. Vous pouvez maintenant utiliser cette technique pour analyser et modifier le comportement de l'application à votre guise.
|
|
```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
|
|
|
|
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;
|
|
};
|
|
```
|
|
### 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(){}
|
|
});
|
|
```
|
|
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
|
|
|
**Astuce de prime de bug**: **inscrivez-vous** à **Intigriti**, une plateforme premium de prime de bug créée par des hackers, pour les 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 $** !
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* 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)
|
|
* 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).
|
|
|
|
</details>
|