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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Εγκατάσταση
Εγκαταστήστε τα 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)
- Αποσυμπιέστε το 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" }
}
- Αναφορά/φόρτωση του gadget ώστε να αρχικοποιηθεί νωρίς:
- Πιο απλό: Πρόσθεσε ένα μικρό Java stub που καλεί System.loadLibrary(“frida-gadget”) μέσα στο Application.onCreate(), ή χρησιμοποίησε την ήδη υπάρχουσα φόρτωση native βιβλιοθηκών.
- Επαναπακετάρισε και υπέγραψε το 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
- Συνδέσου από τον 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 withresetprop, 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 σας.
- Δημιουργήστε έναν 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
- Διαμορφώστε το Gadget ώστε να φορτώνει αυτόματα το script σας Ο patcher του Objection αναμένει ένα Gadget config· όταν χρησιμοποιείτε το script mode, καθορίστε το on-disk path μέσα στον APK lib dir:
{
"interaction": {
"type": "script",
"path": "libfrida-gadget.script.so"
}
}
- Αυτοματοποιήστε το 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
- Επαληθεύστε το 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”)
- 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
- https://github.com/DERE-ad2001/Frida-Labs
- Part 1 of Advanced Frida Usage blog series: IOS Encryption Libraries
Αναφορές
- Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa
- Frida Gadget documentation
- Frida releases (server binaries)
- Objection (SensePost)
- Modding And Distributing Mobile Apps with Frida
- frida-jdwp-loader
- Library injection for debuggable Android apps (blog)
- jdwp-lib-injector (original idea/tool)
- jdwp-shellifier
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks

