Frida Tutorial 2

Reading time: 5 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Dies ist eine Zusammenfassung des Beitrags: https://11x256.github.io/Frida-hooking-android-part-2/ (Teile 2, 3 & 4)
APKs und Quellcode: https://github.com/11x256/frida-android-examples

Teil 1 ist so einfach.

Einige Teile des ursprünglichen Codes funktionieren nicht und wurden hier modifiziert.

Teil 2

Hier sehen Sie ein Beispiel, wie man 2 Funktionen mit demselben Namen aber unterschiedlichen Parametern hookt.
Außerdem werden Sie lernen, wie man eine Funktion mit eigenen Parametern aufruft.
Und schließlich gibt es ein Beispiel, wie man eine Instanz einer Klasse findet und sie eine Funktion aufrufen lässt.

javascript
//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 () { }
});
});

Sie können sehen, dass zur Erstellung eines Strings zuerst die Klasse java.lang.String referenziert wurde und dann ein $new Objekt dieser Klasse mit einem String als Inhalt erstellt wurde. Dies ist der richtige Weg, um ein neues Objekt einer Klasse zu erstellen. Aber in diesem Fall könnten Sie einfach this.fun() jeden String übergeben, wie: this.fun("hey there!")

Python

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

Teil 3

Python

Jetzt werden Sie sehen, wie Sie Befehle an die gehookte App über Python senden, um eine Funktion aufzurufen:

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

Der Befehl "1" wird beenden, der Befehl "2" wird eine Instanz der Klasse finden und die private Funktion secret() aufrufen und der Befehl "3" wird die Funktion secret() hooken, sodass sie eine andere Zeichenkette zurückgibt.

Wenn du also "2" aufrufst, erhältst du das echte Geheimnis, aber wenn du zuerst "3" und dann "2" aufrufst, erhältst du das falsche Geheimnis.

JS

javascript
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,
}

Teil 4

Hier sehen Sie, wie Python und JS interagieren können, indem JSON-Objekte verwendet werden. JS verwendet die send()-Funktion, um Daten an den Python-Client zu senden, und Python verwendet die post()-Funktion, um Daten an das JS-Skript zu senden. JS blockiert die Ausführung, bis es eine Antwort von Python erhält.

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

javascript
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)
}
})

Es gibt einen Teil 5, den ich nicht erklären werde, da es nichts Neues gibt. Aber wenn du es lesen möchtest, ist es hier: https://11x256.github.io/Frida-hooking-android-part-5/

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks