Frida Οδηγός 1

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Αυτή είναι μια περίληψη της ανάρτησης: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Πηγαίος Κώδικας: https://github.com/t0thkr1s/frida-demo

Python

Η Frida σας επιτρέπει να insert JavaScript code μέσα σε συναρτήσεις μιας εφαρμογής που τρέχει. Μπορείτε όμως να χρησιμοποιήσετε python για να καλέσετε τα hooks και ακόμη να αλληλεπιδράσετε με τα hooks.

Αυτό είναι ένα απλό python script που μπορείτε να χρησιμοποιήσετε με όλα τα προτεινόμενα παραδείγματα σε αυτόν τον οδηγό:

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

Κάλεσε το script:

python hooking.py <hookN.js>

Είναι χρήσιμο να γνωρίζετε πώς να χρησιμοποιείτε python με frida, αλλά για αυτά τα παραδείγματα μπορείτε επίσης να καλέσετε απευθείας τη Frida με εργαλεία frida από τη γραμμή εντολών:

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

Hook 1 - Boolean Bypass

Εδώ μπορείτε να δείτε πώς να hook μια boolean μέθοδο (checkPin) από την κλάση: infosecadventures.fridademo.utils.PinUtil

//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

Μη-στατική Συνάρτηση

Αν θέλεις να καλέσεις μια μη-στατική συνάρτηση μιας κλάσης, πρέπει πρώτα να έχεις ένα αντικείμενο αυτής της κλάσης. Έπειτα, μπορείς να χρησιμοποιήσεις αυτό το αντικείμενο για να καλέσεις τη συνάρτηση.
Για αυτό, μπορείς να βρεις ένα υπάρχον αντικείμενο και να το χρησιμοποιήσεις:

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

Σε αυτή την περίπτωση αυτό δεν λειτουργεί επειδή δεν υπάρχει κάποιο instance και η συνάρτηση είναι Static

Static Συνάρτηση

Εάν η συνάρτηση είναι static, μπορείτε απλά να την καλέσετε:

//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 - Ανάκτηση των arguments και της return value

Μπορείτε να κάνετε hook μια συνάρτηση και να την αναγκάσετε να print την τιμή των passed arguments και την τιμή της return value:

//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 σε πρόσφατες εκδόσεις Android (14/15/16)

  • Από Frida 17.1.x+ το Java hooking σε Android 14–16 είναι ξανά σταθερό (ART quick entrypoint offsets διορθώθηκαν). Αν το Java.choose δεν επιστρέφει τίποτα σε Android 14+, αναβαθμίστε frida-server/gadget και τα πακέτα CLI/Python σε >=17.1.5.
  • Εφαρμογές με early anti-debug checks συχνά τερματίζουν πριν το attach. Χρησιμοποιήστε spawn ώστε τα hooks να φορτωθούν πριν το onCreate:
frida -U -f infosecadventures.fridademo -l hook1.js --no-pause
  • Όταν υπάρχουν πολλαπλές υπερφορτώσεις, επιλέξτε ρητά τον στόχο:
var Cls = Java.use("com.example.Class")
Cls.doThing.overload('java.lang.String', 'int').implementation = function(s, i) {
return this.doThing(s, i)
}

Πιο διακριτική εισαγωγή με Zygisk Gadget

Μερικές εφαρμογές ανιχνεύουν ptrace ή frida-server. Magisk/Zygisk modules μπορούν να φορτώσουν frida-gadget μέσα στο Zygote ώστε κανένας process να μην βρίσκεται υπό ptrace:

  1. Εγκαταστήστε ένα Zygisk gadget module (π.χ., zygisk-gadget) και reboot.
  2. Διαμορφώστε το target package και μια optional delay για να παρακάμψετε τα startup checks:
adb shell "su -c 'echo infosecadventures.fridademo,5000 > /data/local/tmp/re.zyg.fri/target_packages'"
  1. Εκκινήστε την εφαρμογή και συνδεθείτε στο όνομα gadget:
frida -U -n Gadget -l hook3.js

Επειδή το gadget εγχέεται από το Zygote, οι έλεγχοι ακεραιότητας του APK παραμένουν ανεπηρέαστοι και οι βασικοί έλεγχοι συμβολοσειρών ptrace/Frida συνήθως αποτυγχάνουν.

Σημαντικό

Σε αυτό το tutorial έχετε κάνει hook μεθόδους χρησιμοποιώντας το όνομα της μεθόδου και .implementation. Αλλά αν υπάρχουν δύο ή περισσότερες μέθοδοι με το ίδιο όνομα, θα χρειαστεί να καθορίσετε τη μέθοδο που θέλετε να κάνετε hook δηλώνοντας τον τύπο των ορισμάτων.

Μπορείτε να το δείτε στο the next tutorial.

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks