Frida Tutorial 1

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

Dies ist eine Zusammenfassung des Beitrags: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Source Code: https://github.com/t0thkr1s/frida-demo

Python

Frida ermöglicht es dir, insert JavaScript code in Funktionen einer laufenden Anwendung einzufügen. Du kannst aber python verwenden, um die hooks zu aufrufen und sogar mit den hooks zu interagieren.

Das ist ein einfaches python-Skript, das du mit allen in diesem Tutorial vorgeschlagenen Beispielen verwenden kannst:

#hooking.py
import frida, sys

with open(sys.argv[1], 'r') as f:
jscode = f.read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()

Rufe das Skript auf:

python hooking.py <hookN.js>

Es ist nützlich zu wissen, wie man python mit frida verwendet, aber für diese Beispiele könntest du Frida auch direkt mit den command line frida tools aufrufen:

frida -U --no-pause -l hookN.js -f infosecadventures.fridademo

Hook 1 - Boolean Bypass

Hier kannst du sehen, wie ein hook auf eine boolean Methode (checkPin) der Klasse infosecadventures.fridademo.utils.PinUtil angewendet wird.

//hook1.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")
var MainActivity = Java.use("infosecadventures.fridademo.utils.PinUtil")
MainActivity.checkPin.implementation = function (pin) {
console.log("[ + ] PIN check successfully bypassed!")
return true
}
})
python hooking.py hook1.js

Mirar: La funcion recibe como parametro un String, no hace falta overload?

Hook 2 - Function Bruteforce

Non-Static Function

Wenn du eine nicht-statische Funktion einer Klasse aufrufen willst, brauchst du zuerst eine Instanz dieser Klasse. Dann kannst du diese Instanz verwenden, um die Funktion aufzurufen.
Dazu könntest du eine vorhandene Instanz finden und sie verwenden:

Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
Java.choose("infosecadventures.fridademo.utils.PinUtil", {
onMatch: function (instance) {
console.log("[ * ] Instance found in memory: " + instance)
for (var i = 1000; i < 9999; i++) {
if (instance.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
break
}
}
},
onComplete: function () {},
})
})

In diesem Fall funktioniert das nicht, da keine Instanz vorhanden ist und die Funktion statisch ist.

Statische Funktion

Wenn die Funktion statisch ist, kannst du sie einfach aufrufen:

//hook2.js
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
var PinUtil = Java.use("infosecadventures.fridademo.utils.PinUtil")

for (var i = 1000; i < 9999; i++) {
if (PinUtil.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
}
}
})

Hook 3 - Argumente und Rückgabewert auslesen

Du kannst eine Funktion hooken und sie dazu bringen, den Wert der übergebenen Argumente und den Wert des Rückgabewerts auszugeben:

//hook3.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")

var EncryptionUtil = Java.use(
"infosecadventures.fridademo.utils.EncryptionUtil"
)
EncryptionUtil.encrypt.implementation = function (key, value) {
console.log("Key: " + key)
console.log("Value: " + value)
var encrypted_ret = this.encrypt(key, value) //Call the original function
console.log("Encrypted value: " + encrypted_ret)
return encrypted_ret
}
})

Hooking on recent Android versions (14/15/16)

  • Seit Frida 17.1.x+ ist Java hooking auf Android 14–16 wieder stabil (ART quick entrypoint offsets wurden behoben). Wenn Java.choose auf Android 14+ nichts zurückgibt, aktualisiere frida-server/gadget und die CLI/Python-Pakete auf >=17.1.5.
  • Apps mit frühen anti-debug checks sterben oft schon vor attach. Verwende spawn, damit Hooks vor onCreate geladen werden:
frida -U -f infosecadventures.fridademo -l hook1.js --no-pause
  • Wenn mehrere Overloads vorhanden sind, wähle das Ziel explizit aus:
var Cls = Java.use("com.example.Class")
Cls.doThing.overload('java.lang.String', 'int').implementation = function(s, i) {
return this.doThing(s, i)
}

Unauffälligere injection mit Zygisk Gadget

Einige Apps erkennen ptrace oder frida-server. Magisk/Zygisk-Module können frida-gadget in Zygote laden, sodass kein Prozess ptraced wird:

  1. Installiere ein Zygisk-Gadget-Modul (z. B. zygisk-gadget) und starte das Gerät neu.
  2. Konfiguriere das Zielpaket und eine optionale Verzögerung, um Startprüfungen zu umgehen:
adb shell "su -c 'echo infosecadventures.fridademo,5000 > /data/local/tmp/re.zyg.fri/target_packages'"
  1. Starte die App und verbinde dich mit dem gadget-Namen:
frida -U -n Gadget -l hook3.js

Weil das Gadget von Zygote injiziert wird, bleiben APK-Integritätsprüfungen unberührt und grundlegende ptrace/Frida-String-Checks schlagen normalerweise fehl.

Wichtig

In diesem Tutorial haben Sie hooked methods unter Verwendung des Methodennamens und .implementation. Aber wenn es mehr als eine Methode mit demselben Namen gibt, müssen Sie die Methode angeben, die Sie hooken möchten, und dabei den Typ der Argumente angeben.

Siehe das nächste Tutorial.

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