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

Εγκατάσταση

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

pip install frida-tools
pip install frida

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

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

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

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)

Δύο συνηθισμένοι τρόποι για να instrument εφαρμογές Android με Frida:

  • Frida server (rooted devices): Ανεβάζετε και εκτελείτε έναν native daemon που σας επιτρέπει να attach σε οποιαδήποτε process.
  • Frida Gadget (no root): Πακετάρετε τη Frida ως shared library μέσα στο APK και τη φορτώνετε αυτόματα μέσα στην target process.

Frida server (rooted)

# 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/<abi>/ (π.χ., lib/arm64-v8a/)
  • Δημιουργήστε assets/frida-gadget.config με τις ρυθμίσεις φόρτωσης του script σας

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

{
"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 βιβλιοθηκών.
  1. Επαναπακετάρισε και υπέγραψε το APK, στη συνέχεια εγκατέστησέ το:
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. Συνδέσου από τον host στη διαδικασία gadget:
frida-ps -Uai
frida -U -n com.example.app

Σημειώσεις

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

JDWP-based Frida injection without root/repackaging (frida-jdwp-loader)

Αν το APK είναι debuggable (android:debuggable=“true”), μπορείς να συνδεθείς μέσω JDWP και να εγχύσεις μια native library σε ένα Java breakpoint. Χωρίς root και χωρίς επανασυσκευασία του APK.

  • Repo: https://github.com/frankheat/frida-jdwp-loader
  • Απαιτήσεις: ADB, Python 3, USB/Wireless debugging. Η εφαρμογή πρέπει να είναι debuggable (emulator with ro.debuggable=1, rooted device with resetprop, or rebuild manifest).

Quick start

git clone https://github.com/frankheat/frida-jdwp-loader.git
cd frida-jdwp-loader
# Inject frida-gadget.so into a debuggable target
python frida-jdwp-loader.py frida -n com.example.myapplication
# Keep the breakpoint thread suspended for early hooks
python frida-jdwp-loader.py frida -n com.example.myapplication -s
# Networkless: run a local agent script via Gadget "script" mode
python frida-jdwp-loader.py frida -n com.example.myapplication -i script -l script.js

Σημειώσεις

  • Λειτουργίες: spawn (break at Application.onCreate) ή attach (break at Activity.onStart). Χρησιμοποιήστε -b για να ορίσετε μια συγκεκριμένη Java μέθοδο, -g για να επιλέξετε Gadget version/path, -p για να επιλέξετε JDWP port.
  • Λειτουργία ακρόασης: προωθήστε το Gadget (προεπιλεγμένο 127.0.0.1:27042) αν χρειάζεται: adb forward tcp:27042 tcp:27042; στη συνέχεια frida-ps -H 127.0.0.1:27042.
  • Αυτό αξιοποιεί το JDWP debugging. Ο κίνδυνος είναι η αποστολή debuggable builds ή η έκθεση του JDWP.

Self-contained agent + Gadget embedding (Frida 17+; automated with Objection)

Το Frida 17 αφαίρεσε τα ενσωματωμένα Java/ObjC bridges από το GumJS. Εάν ο agent σας κάνει hook σε Java, πρέπει να συμπεριλάβετε το Java bridge μέσα στο bundle σας.

  1. Δημιουργήστε έναν Frida agent (TypeScript) και συμπεριλάβετε το Java bridge
# Scaffolding
frida-create -t agent -o mod
cd mod && npm install
# Install the Java bridge for Frida 17+
npm install frida-java-bridge
# Dev loop (optional live-reload via REPL)
npm run watch

Ελάχιστο Java hook (αναγκάζει τις ρίψεις ζαριών να είναι 1):

import Java from "frida-java-bridge";

Java.perform(function () {
var dicer = Java.use("org.secuso.privacyfriendlydicer.dicer.Dicer");
dicer.rollDice.implementation = function (numDice: number, numFaces: number) {
return Array(numDice).fill(1);
};
});

Δημιουργία ενός ενιαίου πακέτου για ενσωμάτωση:

npm run build    # produces _agent.js via frida-compile

Γρήγορος έλεγχος USB (προαιρετικό):

frida -U -f org.secuso.privacyfriendlydicer -l _agent.js
  1. Διαμορφώστε το Gadget ώστε να φορτώνει αυτόματα το script σας Ο patcher του Objection αναμένει ένα Gadget config· όταν χρησιμοποιείτε το script mode, καθορίστε το on-disk path μέσα στον APK lib dir:
{
"interaction": {
"type": "script",
"path": "libfrida-gadget.script.so"
}
}
  1. Αυτοματοποιήστε το APK patching με Objection
# Embed Gadget, config, and your compiled agent into the APK; rebuild and sign
objection patchapk -s org.secuso.privacyfriendlydicer.apk \
-c gadget-config.json \
-l mod/_agent.js \
--use-aapt2

Τι κάνει το patchapk (σε υψηλό επίπεδο):

  • Εντοπίζει το ABI της συσκευής (π.χ., arm64-v8a) και κατεβάζει το αντίστοιχο Gadget
  • Προαιρετικά προσθέτει το android.permission.INTERNET όταν χρειάζεται
  • Ενσωματώνει έναν στατικό αρχικοποιητή κλάσης που καλεί System.loadLibrary(“frida-gadget”) στο activity εκκίνησης
  • Τοποθετεί τα ακόλουθα κάτω από lib/<abi>/:
  • libfrida-gadget.so
  • libfrida-gadget.config.so (σειριοποιημένη διαμόρφωση)
  • libfrida-gadget.script.so (το _agent.js σας)

Παράδειγμα εγχυόμενου smali (στατικός αρχικοποιητής):

.method static constructor <clinit>()V
.locals 1
const-string v0, "frida-gadget"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
return-void
.end method
  1. Επαληθεύστε το repack
apktool d org.secuso.privacyfriendlydicer.apk
apktool d org.secuso.privacyfriendlydicer.objection.apk
# Inspect differences
diff -r org.secuso.privacyfriendlydicer org.secuso.privacyfriendlydicer.objection

Αναμενόμενες αλλαγές:

  • AndroidManifest.xml μπορεί να περιλαμβάνει <uses-permission android:name="android.permission.INTERNET"/>
  • Νέες native libs κάτω από lib/<abi>/ όπως παραπάνω
  • Το launchable activity smali περιέχει ένα static <clinit> που καλεί System.loadLibrary(“frida-gadget”)
  1. Split APKs
  • Patch the base APK (αυτό που δηλώνει MAIN/LAUNCHER activity)
  • Re-sign τα υπόλοιπα splits με το ίδιο key:
objection signapk split1.apk split2.apk ...
  • Εγκαταστήστε splits μαζί:
adb install-multiple split1.apk split2.apk ...
  • Για διανομή, μπορείτε να συγχωνεύσετε τα splits σε ένα ενιαίο APK με APKEditor, και στη συνέχεια να κάνετε align/sign

Οδηγοί

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

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

Tutorial 2

Από: https://11x256.github.io/Frida-hooking-android-part-2/ (Parts 2, 3 & 4)
APKs και Πηγαίος Κώδικας: https://github.com/11x256/frida-android-examples

Ακολουθήστε τον 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

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

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

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

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

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

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

Hook the function a() της κλάσης sg.vantagepoint.a.c

Java.perform(function () {
rootcheck1.a.overload().implementation = function() {
send("sg.vantagepoint.a.c.a()Z   Root check 1 HIT!  su.exists()")
return false;
};
});

Hook java exit()

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

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

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 functions με παραμέτρους και ανάκτηση της τιμής

Hooking a decryption function. Print το input, κάλεσε την original function για να decrypt το input και, τέλος, print τα plain δεδομένα:

Hooking a decryption function (Java) — print inputs/outputs ```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 }

</details>

### Hooking συναρτήσεων και κλήση τους με τα δεδομένα εισόδου μας

Hook μια συνάρτηση που λαμβάνει ένα string και κάλεσέ την με άλλο string (από [here](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
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() που θα τυπώσει μια ιδιωτική ιδιότητα του αντικειμένου:

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