Frida Tutorial 2
Reading time: 6 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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Αυτό είναι μια περίληψη της ανάρτησης: https://11x256.github.io/Frida-hooking-android-part-2/ (Μέρη 2, 3 & 4)
APKs και Πηγαίος Κώδικας: https://github.com/11x256/frida-android-examples
Το μέρος 1 είναι πολύ εύκολο.
Ορισμένα μέρη του αρχικού κώδικα δεν λειτουργούν και έχουν τροποποιηθεί εδώ.
Μέρος 2
Εδώ μπορείτε να δείτε ένα παράδειγμα του πώς να hook 2 συναρτήσεις με το ίδιο όνομα αλλά διαφορετικές παραμέτρους.
Επίσης, θα μάθετε πώς να καλέσετε μια συνάρτηση με τις δικές σας παραμέτρους.
Και τέλος, υπάρχει ένα παράδειγμα του πώς να βρείτε μια παρουσία μιας κλάσης και να την κάνετε να καλέσει μια συνάρτηση.
//s2.js
console.log("Script loaded successfully ");
Java.perform(function x() {
console.log("Inside java perform function");
var my_class = Java.use("com.example.a11x256.frida_test.my_activity");
//Hook "fun" with parameters (int, int)
my_class.fun.overload("int", "int").implementation = function (x, y) { //hooking the old function
console.log("original call: fun(" + x + ", " + y + ")");
var ret_value = this.fun(2, 5);
return ret_value;
};
//Hook "fun" with paramater(String)
var string_class = Java.use("java.lang.String");
my_class.fun.overload("java.lang.String").implementation = function (x) { //hooking the new function
console.log("*")
//Create a new String and call the function with your input.
var my_string = string_class.$new("My TeSt String#####");
console.log("Original arg: " + x);
var ret = this.fun(my_string);
console.log("Return value: " + ret);
console.log("*")
return ret;
};
//Find an instance of the class and call "secret" function.
Java.choose("com.example.a11x256.frida_test.my_activity", {
onMatch: function (instance) {
console.log(tring, and the it has"Found instance: " + instance);
console.log("Result of secret func: " + instance.secret());
},
onComplete: function () { }
});
});
Μπορείτε να δείτε ότι για να δημιουργήσετε μια String πρώτα έχει αναφερθεί η κλάση java.lang.String και στη συνέχεια έχει δημιουργηθεί ένα $new αντικείμενο αυτής της κλάσης με μια String ως περιεχόμενο. Αυτή είναι η σωστή μέθοδος για να δημιουργήσετε ένα νέο αντικείμενο μιας κλάσης. Αλλά, σε αυτή την περίπτωση, θα μπορούσατε απλά να περάσετε στη this.fun()
οποιαδήποτε String όπως: this.fun("hey there!")
Python
//loader.py
import frida
import time
device = frida.get_usb_device()
pid = device.spawn(["com.example.a11x256.frida_test"])
device.resume(pid)
time.sleep(1) #Without it Java.perform silently fails
session = device.attach(pid)
script = session.create_script(open("s2.js").read())
script.load()
#prevent the python script from terminating
raw_input()
python loader.py
Μέρος 3
Python
Τώρα θα δείτε πώς να στείλετε εντολές στην εφαρμογή που έχει συνδεθεί μέσω Python για να καλέσετε τη συνάρτηση:
//loader.py
import time
import frida
def my_message_handler(message, payload):
print message
print payload
device = frida.get_usb_device()
pid = device.spawn(["com.example.a11x256.frida_test"])
device.resume(pid)
time.sleep(1) # Without it Java.perform silently fails
session = device.attach(pid)
with open("s3.js") as f:
script = session.create_script(f.read())
script.on("message", my_message_handler)
script.load()
command = ""
while 1 == 1:
command = raw_input("Enter command:\n1: Exit\n2: Call secret function\n3: Hook Secret\nchoice:")
if command == "1":
break
elif command == "2":
script.exports.callsecretfunction()
elif command == "3":
script.exports.hooksecretfunction()
Η εντολή "1" θα βγει, η εντολή "2" θα βρει και θα καλέσει την ιδιωτική συνάρτηση secret() και η εντολή "3" θα συνδέσει τη συνάρτηση secret() έτσι ώστε να επιστρέφει μια διαφορετική συμβολοσειρά.
Έτσι, αν καλέσετε "2" θα λάβετε το πραγματικό μυστικό, αλλά αν καλέσετε "3" και μετά "2" θα λάβετε το ψεύτικο μυστικό.
JS
console.log("Script loaded successfully ")
var instances_array = []
function callSecretFun() {
Java.perform(function () {
if (instances_array.length == 0) {
// if array is empty
Java.choose("com.example.a11x256.frida_test.my_activity", {
onMatch: function (instance) {
console.log("Found instance: " + instance)
instances_array.push(instance)
console.log("Result of secret func: " + instance.secret())
},
onComplete: function () {},
})
} else {
//else if the array has some values
console.log("Result of secret func: " + instances_array[0].secret())
}
})
}
function hookSecret() {
Java.perform(function () {
var my_class = Java.use("com.example.a11x256.frida_test.my_activity")
var string_class = Java.use("java.lang.String")
my_class.secret.overload().implementation = function () {
var my_string = string_class.$new("TE ENGANNNNEEE")
return my_string
}
})
}
rpc.exports = {
callsecretfunction: callSecretFun,
hooksecretfunction: hookSecret,
}
Μέρος 4
Εδώ θα δείτε πώς να κάνετε Python και JS να αλληλεπιδρούν χρησιμοποιώντας αντικείμενα JSON. Ο JS χρησιμοποιεί τη συνάρτηση send()
για να στείλει δεδομένα στον πελάτη Python, και η Python χρησιμοποιεί τις συναρτήσεις post()
για να στείλει δεδομένα στο σενάριο JS. Ο JS θα μπλοκάρει την εκτέλεση μέχρι να λάβει μια απάντηση από την Python.
Python
//loader.py
import time
import frida
def my_message_handler(message, payload):
print message
print payload
if message["type"] == "send":
print message["payload"]
data = message["payload"].split(":")[1].strip()
print 'message:', message
data = data.decode("base64")
user, pw = data.split(":")
data = ("admin" + ":" + pw).encode("base64")
print "encoded data:", data
script.post({"my_data": data}) # send JSON object
print "Modified data sent"
device = frida.get_usb_device()
pid = device.spawn(["com.example.a11x256.frida_test"])
device.resume(pid)
time.sleep(1)
session = device.attach(pid)
with open("s4.js") as f:
script = session.create_script(f.read())
script.on("message", my_message_handler) # register the message handler
script.load()
raw_input()
JS
console.log("Script loaded successfully ")
Java.perform(function () {
var tv_class = Java.use("android.widget.TextView")
tv_class.setText.overload("java.lang.CharSequence").implementation =
function (x) {
var string_to_send = x.toString()
var string_to_recv = ""
send(string_to_send) // send data to python code
recv(function (received_json_object) {
string_to_recv = received_json_object.my_data
}).wait() //block execution till the message is received
console.log("Final string_to_recv: " + string_to_recv)
return this.setText(string_to_recv)
}
})
Υπάρχει ένα μέρος 5 που δεν πρόκειται να εξηγήσω γιατί δεν υπάρχει τίποτα νέο. Αλλά αν θέλετε να το διαβάσετε, είναι εδώ: https://11x256.github.io/Frida-hooking-android-part-5/
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.