Frida Tutorial 2

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team AWS του HackTricks)!

Συμβουλή για bug bounty: Εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα, και αρχίστε να κερδίζετε αμοιβές έως και $100,000!

Αυτό είναι ένα σύνοψη της ανάρτησης: https://11x256.github.io/Frida-hooking-android-part-2/ (Μέρη 2, 3 & 4) APKs και πηγαίος κώδικας: https://github.com/11x256/frida-android-examples

Το μέρος 1 είναι τόσο εύκολο.

**Κάποια μέρη του αρχικού κ

//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() ώστε να επιστρέφει ένα διαφορετικό string.

Έτσι, αν καλέσετε την εντολή "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/

Συμβουλή για bug bounty: Εγγραφείτε στο Intigriti, μια πρεμιέρα πλατφόρμα bug bounty δημιουργημένη από χάκερς, για χάκερς! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
  • Δουλεύετε σε μια εταιρεία κυβερνοασφάλειας; Θέλετε να δείτε την εταιρεία σας διαφημισμένη στο HackTricks; Ή θέλετε να έχετε πρόσβαση στην τελευταία έκδοση του PEASS ή να κατεβάσετε το HackTricks σε μορφή PDF; Ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!

  • Ανακαλύψτε την Οικογένεια PEASS, τη συλλογή μας από αποκλειστικά NFTs

  • Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα τηλεγράφου ή ακολουθήστε με στο Twitter 🐦@carlospolopm.

  • Μοιραστείτε τα κόλπα σας στο hacking υποβάλλοντας PRs στο αποθετήριο hacktricks και αποθετήριο hacktricks-cloud.

Last updated