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

471 lines
17 KiB
Markdown
Raw Normal View History

2024-02-11 01:46:25 +00:00
# Samouczek Frida
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-01-03 10:43:38 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
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
2024-02-11 01:46:25 +00:00
**Wskazówka dotycząca bug bounty**: **zarejestruj się** na platformie **Intigriti**, premium **platformie bug bounty stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**!
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
2024-02-11 01:46:25 +00:00
## Instalacja
2024-02-11 01:46:25 +00:00
Zainstaluj **narzędzia Frida**:
2020-09-09 15:07:39 +00:00
```bash
pip install frida-tools
pip install frida
```
2024-02-11 01:46:25 +00:00
**Pobierz i zainstaluj** na urządzeniu Android **serwer Frida** ([Pobierz najnowsze wydanie](https://github.com/frida/frida/releases)).\
Jednolinijkowe polecenie do ponownego uruchomienia adb w trybie root, połączenia z nim, przesłania frida-server, nadania uprawnień do wykonania i uruchomienia go w tle:
{% code overflow="wrap" %}
2020-09-09 15:07:39 +00:00
```bash
2024-02-11 01:46:25 +00:00
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 %}
2024-02-11 01:46:25 +00:00
**Sprawdź**, czy to **działa**:
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
```
2024-02-11 01:46:25 +00:00
## Samouczki
2024-02-11 01:46:25 +00:00
### [Samouczek 1](frida-tutorial-1.md)
2024-02-11 01:46:25 +00:00
**Źródło**: [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)\
2024-02-11 01:46:25 +00:00
**Kod źródłowy**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
2024-02-11 01:46:25 +00:00
**Kliknij [link, aby przeczytać](frida-tutorial-1.md).**
2024-02-11 01:46:25 +00:00
### [Samouczek 2](frida-tutorial-2.md)
2024-02-11 01:46:25 +00:00
**Źródło**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Części 2, 3 i 4)\
**APK i kod źródłowy**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
2024-02-11 01:46:25 +00:00
**Kliknij [link, aby przeczytać](frida-tutorial-2.md).**
2024-02-11 01:46:25 +00:00
### [Samouczek 3](owaspuncrackable-1.md)
2024-02-11 01:46:25 +00:00
**Źródło**: [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)
2024-02-11 01:46:25 +00:00
**Kliknij [link, aby przeczytać](owaspuncrackable-1.md).**
2024-02-11 01:46:25 +00:00
**Więcej niesamowitych skryptów Frida znajdziesz tutaj:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
2024-02-11 01:46:25 +00:00
## Szybkie przykłady
2024-02-11 01:46:25 +00:00
### Wywoływanie Fridy z wiersza poleceń
```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.
```
2024-02-11 01:46:25 +00:00
### Podstawowy skrypt Pythona
```python
import frida
# Connect to the USB device
device = frida.get_usb_device()
# Attach to the target process
pid = device.spawn(["com.example.app"])
session = device.attach(pid)
# Load the JavaScript code
with open("script.js", "r") as file:
script_code = file.read()
# Create the script
script = session.create_script(script_code)
# Load the script into the target process
script.load()
# Resume the target process
device.resume(pid)
# Keep the script running
input("Press Enter to stop...")
# Clean up
session.detach()
device.kill(pid)
```
### Podstawowy skrypt Pythona
```python
import frida
# Połącz się z urządzeniem USB
device = frida.get_usb_device()
# Dołącz do procesu docelowego
pid = device.spawn(["com.example.app"])
session = device.attach(pid)
# Wczytaj kod JavaScript
with open("script.js", "r") as file:
script_code = file.read()
# Utwórz skrypt
script = session.create_script(script_code)
# Wczytaj skrypt do procesu docelowego
script.load()
2024-02-11 01:46:25 +00:00
# Wznów działanie procesu docelowego
device.resume(pid)
2024-02-11 01:46:25 +00:00
# Utrzymuj działanie skryptu
input("Naciśnij Enter, aby zatrzymać...")
# Sprzątanie
session.detach()
device.kill(pid)
```
```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()
```
2024-02-11 01:46:25 +00:00
### Hookowanie funkcji bez parametrów
2024-02-11 01:46:25 +00:00
Zahacz funkcję `a()` z klasy `sg.vantagepoint.a.c`
```javascript
Java.perform(function () {
; rootcheck1.a.overload().implementation = function() {
2024-02-11 01:46:25 +00:00
rootcheck1.a.overload().implementation = function() {
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()");
return false;
};
});
```
2024-02-11 01:46:25 +00:00
# Hook java `exit()`
## Introduction
In this tutorial, we will learn how to hook the `exit()` method in Java using Frida. By hooking this method, we can intercept the application's exit calls and perform additional actions before the application terminates.
## Prerequisites
Before we begin, make sure you have the following:
- A rooted Android device or an emulator
- Frida installed on your machine
- Basic knowledge of JavaScript and Java
## Steps
Follow these steps to hook the `exit()` method:
1. Launch the target application on your Android device or emulator.
2. Open a terminal and start the Frida server by running the following command:
```bash
frida-server
```
3. Create a new JavaScript file, for example `hook_exit.js`, and add the following code:
```javascript
Java.perform(function() {
var System = Java.use('java.lang.System');
var Runtime = Java.use('java.lang.Runtime');
// Hook the exit() method of System class
System.exit.implementation = function(code) {
console.log('System.exit() called with code: ' + code);
// Perform additional actions here
// Call the original exit() method
this.exit(code);
};
// Hook the exit() method of Runtime class
Runtime.getRuntime().exit.implementation = function(code) {
console.log('Runtime.exit() called with code: ' + code);
// Perform additional actions here
// Call the original exit() method
this.exit(code);
};
});
```
4. Save the JavaScript file.
5. In the terminal, navigate to the directory where the JavaScript file is saved.
6. Use Frida to inject the JavaScript code into the target application by running the following command:
2024-02-11 01:46:25 +00:00
```bash
frida -U -l hook_exit.js -f <package_name>
```
2024-02-11 01:46:25 +00:00
Replace `<package_name>` with the package name of the target application.
7. You should see the output of the `console.log()` statements in the terminal whenever the `exit()` method is called.
8. Customize the additional actions in the JavaScript code as per your requirements.
## Conclusion
By hooking the `exit()` method in Java using Frida, we can intercept the application's exit calls and perform additional actions before the application terminates. This technique can be useful for various purposes, such as debugging, analyzing application behavior, or modifying the application's flow.
```javascript
var sysexit = Java.use("java.lang.System");
2024-02-11 01:46:25 +00:00
sysexit.exit.overload("int").implementation = function(var_0) {
send("java.lang.System.exit(I)V // We avoid exiting the application :)");
};
```
2024-02-11 01:46:25 +00:00
# Frida Tutorial: Hook MainActivity `.onStart()` & `.onCreate()`
W tym samouczku dowiesz się, jak używać Fridy do przechwytywania wywołań metod `.onStart()` i `.onCreate()` w klasie MainActivity w aplikacji Androidowej.
## Wymagania
Aby zacząć, musisz mieć zainstalowane następujące narzędzia:
- [Frida](https://frida.re/docs/installation/)
- [Android Studio](https://developer.android.com/studio)
## Kroki
1. Sklonuj repozytorium z przykładową aplikacją Androidową:
```
git clone https://github.com/example/example-app.git
```
2. Otwórz projekt w Android Studio i zbuduj go.
2024-02-11 01:46:25 +00:00
3. Uruchom aplikację na urządzeniu lub emulatorze.
2024-02-11 01:46:25 +00:00
4. Uruchom Fridę w trybie serwera na swoim komputerze:
```
frida-server
```
5. Uruchom skrypt Fridy, który przechwytuje wywołania metod `.onStart()` i `.onCreate()` w klasie 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 (savedInstanceState) {
console.log('Hooked MainActivity.onCreate()');
this.onCreate(savedInstanceState);
};
});
```
6. Podłącz się do urządzenia/emulatora za pomocą Fridy:
```
frida -U com.example.app -l script.js
```
7. Teraz, gdy aplikacja zostanie uruchomiona, zobaczysz w konsoli wiadomości potwierdzające, że metody `.onStart()` i `.onCreate()` zostały przechwycone.
## Podsumowanie
Dzięki Fridzie możesz łatwo przechwytywać wywołania metod w aplikacjach Androidowych. W tym samouczku nauczyłeś się, jak przechwycić metody `.onStart()` i `.onCreate()` w klasie MainActivity.
```javascript
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity");
2024-02-11 01:46:25 +00:00
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);
};
```
2024-02-11 01:46:25 +00:00
# Hook android `.onCreate()`
2024-02-11 01:46:25 +00:00
## Introduction
2024-02-11 01:46:25 +00:00
In this tutorial, we will learn how to hook the `.onCreate()` method in an Android application using Frida. By hooking this method, we can intercept and modify the behavior of the application during its initialization process.
## Prerequisites
Before we begin, make sure you have the following:
- A rooted Android device or an emulator
- Frida installed on your machine
- Basic knowledge of JavaScript and Android development
## Steps
1. Start by launching the target application on your device or emulator.
2. Open a terminal and run the following command to start the Frida server:
```bash
frida-server
```
3. Next, we need to find the process ID (PID) of the target application. Run the following command to list all running processes:
```bash
frida-ps -U
```
Look for the process corresponding to the target application and note down its PID.
4. Now, create a new JavaScript file (e.g., `hook.js`) and add the following code:
```javascript
Java.perform(function() {
var targetClass = Java.use('com.example.TargetClass');
targetClass.onCreate.implementation = function() {
console.log('onCreate() hooked');
// Add your custom code here
this.onCreate();
};
});
```
2024-02-11 01:46:25 +00:00
Replace `com.example.TargetClass` with the actual class name of the target application.
2024-02-11 01:46:25 +00:00
5. Save the `hook.js` file and run the following command to start the hooking process:
2024-02-11 01:46:25 +00:00
```bash
frida -U -l hook.js -p <PID>
```
Replace `<PID>` with the PID of the target application obtained in step 3.
6. If everything is set up correctly, you should see the message `onCreate() hooked` in the Frida console.
7. Now, whenever the target application's `.onCreate()` method is called, your custom code will be executed.
## Conclusion
By hooking the `.onCreate()` method in an Android application using Frida, you can gain control over the application's initialization process and modify its behavior as desired. This technique can be useful for various purposes, such as bypassing security checks or analyzing the application's internal workings.
```javascript
2024-02-11 01:46:25 +00:00
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);
};
```
2024-02-11 01:46:25 +00:00
### Hookowanie funkcji z parametrami i pobieranie wartości
2024-02-11 01:46:25 +00:00
Hookowanie funkcji deszyfrującej. Wyświetl wejście, wywołaj oryginalną funkcję, odszyfruj dane wejściowe i na koniec wyświetl odszyfrowane dane:
```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
};
```
### Hookowanie funkcji i wywoływanie ich z naszym wejściem
2024-02-11 01:46:25 +00:00
Zahacz funkcję, która przyjmuje ciąg znaków i wywołaj ją z innym ciągiem znaków (od [tutaj](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
2024-02-11 01:46:25 +00:00
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;
};
```
2024-02-11 01:46:25 +00:00
### Pobieranie już utworzonego obiektu klasy
2024-02-11 01:46:25 +00:00
Jeśli chcesz wyodrębnić pewną cechę utworzonego obiektu, możesz to zrobić za pomocą tego sposobu.
2024-02-11 01:46:25 +00:00
W tym przykładzie zobaczysz, jak pobrać obiekt klasy my\_activity i jak wywołać funkcję .secret(), która wyświetli prywatną cechę obiektu:
```javascript
Java.choose("com.example.a11x256.frida_test.my_activity" , {
2024-02-11 01:46:25 +00:00
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(){}
});
```
2024-02-11 01:46:25 +00:00
## Inne samouczki Frida
* [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
2024-02-11 01:46:25 +00:00
* [Część 1 zaawansowanego wykorzystania Frida: Biblioteki szyfrowania IOS](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
**Wskazówka dotycząca nagrody za błąd**: **Zarejestruj się** na platformie **Intigriti**, premium **platformie nagród za błędy stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody do **100 000 USD**!
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
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2024-01-03 10:43:38 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>