Frida Anleitung

Reading time: 8 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Installation

Installiere frida tools:

bash
pip install frida-tools
pip install frida

Download und installiere in the android den frida server (Download the latest release).
Einzeiler, um adb im Root-Modus neu zu starten, eine Verbindung herzustellen, frida-server hochzuladen, Ausführungsrechte zu vergeben und ihn im Hintergrund laufen zu lassen:

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 &"

Prüfe ob es funktioniert:

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

Frida server vs. Gadget (root vs. no-root)

Zwei gängige Methoden, um Android-Apps mit Frida zu instrumentieren:

  • Frida server (rooted devices): Auf das Gerät pushen und einen nativen Daemon starten, der es erlaubt, sich an jeden Prozess anzuhängen.
  • Frida Gadget (no root): Frida als shared library in die APK einbinden und automatisch im Zielprozess laden.

Frida server (rooted)

bash
# Download the matching frida-server binary for your device's arch
# https://github.com/frida/frida/releases
adb root
adb push frida-server-<ver>-android-<arch> /data/local/tmp/frida-server
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server &    # run at boot via init/magisk if desired

# From host, list processes and attach
frida-ps -Uai
frida -U -n com.example.app

Frida Gadget (ohne Root)

  1. Entpacke die APK, füge das gadget .so und die Konfiguration hinzu:
  • Platziere libfrida-gadget.so in lib// (z. B. lib/arm64-v8a/)
  • Erstelle assets/frida-gadget.config mit deinen Einstellungen zum Laden von Skripten

Beispiel frida-gadget.config

json
{
"interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" },
"runtime": { "logFile": "/sdcard/frida-gadget.log" }
}
  1. Referenziere/lade das gadget so, dass es frühzeitig initialisiert wird:
  • Am einfachsten: Füge einen kleinen Java-Stub hinzu, der System.loadLibrary("frida-gadget") in Application.onCreate() aufruft, oder verwende bereits vorhandenes native lib loading.
  1. Repacke und signiere die APK, und installiere sie anschließend:
bash
apktool d app.apk -o app_m
# ... add gadget .so and config ...
apktool b app_m -o app_gadget.apk
uber-apk-signer -a app_gadget.apk -o out_signed
adb install -r out_signed/app_gadget-aligned-debugSigned.apk
  1. Vom Host an den Gadget-Prozess anhängen:
bash
frida-ps -Uai
frida -U -n com.example.app

Hinweise

  • Gadget wird von einigen Schutzmechanismen erkannt; halte Namen/Pfade unauffällig und lade ihn spät/bedarfsabhängig, falls nötig.
  • Bei gehärteten Apps bevorzugt rooted Testing mit server + late attach, oder kombiniere das mit Magisk/Zygisk-Hiding.

Tutorials

Tutorial 1

Quelle: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Quellcode: https://github.com/t0thkr1s/frida-demo

Folge dem Link zum Lesen.

Tutorial 2

Quelle: https://11x256.github.io/Frida-hooking-android-part-2/ (Parts 2, 3 & 4)
APKs and Source code: https://github.com/11x256/frida-android-examples

Folge dem Link zum Lesen.

Tutorial 3

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

Folge dem Link zum Lesen.

Weitere tolle Frida-Skripte findest du hier: https://codeshare.frida.re/

Quick Examples

Calling Frida from command line

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.

Grundlegendes Python-Skript

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()

Hooking functions ohne Parameter

Hook die Funktion a() der Klasse 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()

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  :)")
}

Hook MainActivity .onStart() & .onCreate()

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()

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)
}

Hooking von Funktionen mit Parametern und Abrufen des Werts

Hooking einer Decryption-Funktion. Gib die Eingabe aus, rufe die Originalfunktion auf, entschlüssle die Eingabe und gib schließlich den Klartext aus:

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
}

Hooking von Funktionen und deren Aufruf mit unserer Eingabe

Hook eine Funktion, die einen string empfängt, und rufe sie mit einem anderen string auf (von here)

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
}

Abrufen eines bereits erstellten Objekts einer Klasse

Wenn du ein Attribut eines bereits erstellten Objekts extrahieren möchtest, kannst du das Folgende verwenden.

In diesem Beispiel siehst du, wie man das Objekt der Klasse my_activity erhält und wie man die Funktion .secret() aufruft, die ein privates Attribut des Objekts ausgibt:

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 () {},
})

Weitere Frida-Tutorials

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks