Frida Οδηγός

Reading time: 8 minutes

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

Εγκατάσταση

Εγκαταστήστε τα frida tools:

bash
pip install frida-tools
pip install frida

Κατέβασε και εγκατάστησε στο android τον frida server (Download the latest release).
Μία εντολή μίας γραμμής για να επανεκκινήσεις το adb σε root mode, να συνδεθείς σε αυτό, να ανεβάσεις το frida-server, να του δώσεις δικαιώματα εκτέλεσης και να το τρέξεις στο παρασκήνιο:

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

Έλεγξε αν λειτουργεί:

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)

Δύο κοινές μέθοδοι για τη δυναμική ανάλυση εφαρμογών Android με Frida:

  • Frida server (rooted devices): Προωθείς (push) και τρέχεις έναν native daemon που σου επιτρέπει να κάνεις attach σε οποιαδήποτε διεργασία.
  • Frida Gadget (no root): Ενσωματώνεις το Frida ως shared library μέσα στο APK και το φορτώνεις αυτόματα μέσα στη στοχευόμενη διεργασία.

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

  1. Αποσυμπιέστε το APK, προσθέστε το gadget .so και το config:
  • Τοποθετήστε libfrida-gadget.so στο lib// (π.χ., lib/arm64-v8a/)
  • Δημιουργήστε assets/frida-gadget.config με τις ρυθμίσεις φόρτωσης script σας

Παράδειγμα frida-gadget.config

json
{
"interaction": { "type": "script", "path": "/sdcard/ssl-bypass.js" },
"runtime": { "logFile": "/sdcard/frida-gadget.log" }
}
  1. Αναφορά/φόρτωση του gadget ώστε να αρχικοποιηθεί νωρίς:
  • Πιο εύκολο: Προσθέστε ένα μικρό Java stub που καλεί System.loadLibrary("frida-gadget") στο Application.onCreate(), ή χρησιμοποιήστε την ήδη υπάρχουσα φόρτωση native lib.
  1. Ξαναπακετάρετε και υπογράψτε το APK, στη συνέχεια εγκαταστήστε:
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. Attach από host στο gadget process:
bash
frida-ps -Uai
frida -U -n com.example.app

Σημειώσεις

  • Το Gadget ανιχνεύεται από ορισμένες προστασίες· κρατήστε τα names/paths διακριτικά και φορτώστε αργά/υπό όρους αν χρειάζεται.
  • Σε hardened εφαρμογές, προτιμήστε testing σε rooted συσκευές με server + late attach, ή συνδυάστε με Magisk/Zygisk hiding.

Οδηγοί

Tutorial 1

Από: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Πηγαίος Κώδικας: https://github.com/t0thkr1s/frida-demo

Follow the link to read it.

Tutorial 2

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

Ακολουθήστε the link to read it.

Tutorial 3

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

Follow the link to read it.

Μπορείτε να βρείτε περισσότερα Awesome Frida scripts εδώ: https://codeshare.frida.re/

Γρήγορα Παραδείγματα

Κλήση του Frida από τη γραμμή εντολών

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.

Βασικό Python Script

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 συναρτήσεων χωρίς παραμέτρους

Hook τη συνάρτηση a() της κλάσης 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 συναρτήσεων με παραμέτρους και ανάκτηση της τιμής

Hooking μιας συνάρτησης decryption. Εκτύπωσε την είσοδο, κάλεσε την αρχική συνάρτηση για να decrypt την είσοδο και, τέλος, εκτύπωσε το απλό κείμενο:

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 functions and calling them with our input

Hook a function που δέχεται ένα string και κάλεσέ το με ένα άλλο string (from 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
}

Λήψη ενός ήδη δημιουργημένου αντικειμένου μιας κλάσης

Αν θέλεις να εξαγάγεις κάποια ιδιότητα ενός δημιουργημένου αντικειμένου, μπορείς να χρησιμοποιήσεις αυτό.

Σε αυτό το παράδειγμα θα δείτε πώς να πάρετε το αντικείμενο της κλάσης my_activity και πώς να καλέσετε τη συνάρτηση .secret() που θα εκτυπώσει μια ιδιωτική ιδιότητα του αντικειμένου:

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

Άλλα σεμινάρια για Frida

Αναφορές

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