Frida Tutorial 2

HackTricks'i Destekleyin

Bug bounty ipucu: Intigriti'ye kaydolun, hackers tarafından, hackers için oluşturulmuş premium bir bug bounty platformu! Bugün https://go.intigriti.com/hacktricks adresine katılın ve $100,000'a kadar ödüller kazanmaya başlayın!

Bu yazının özeti: https://11x256.github.io/Frida-hooking-android-part-2/ (Bölümler 2, 3 & 4) APKs ve Kaynak kodu: https://github.com/11x256/frida-android-examples

Bölüm 1 çok kolay.

Orijinal kodun bazı bölümleri çalışmıyor ve burada değiştirilmiştir.

Bölüm 2

Burada aynı isme sahip 2 fonksiyonu farklı parametrelerle nasıl hook'layacağınızı görebilirsiniz. Ayrıca, kendi parametrelerinizle bir fonksiyonu nasıl çağıracağınızı öğreneceksiniz. Ve son olarak, bir sınıfın örneğini nasıl bulup bir fonksiyonu çağırmasını sağlayacağınız ile ilgili bir örnek var.

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

Görüyorsunuz ki, bir String oluşturmak için önce java.lang.String sınıfına referans verilmiş ve ardından içeriği bir String olan $new nesnesi oluşturulmuştur. Bu, bir sınıfın yeni bir nesnesini oluşturmanın doğru yoludur. Ancak, bu durumda this.fun() fonksiyonuna herhangi bir String geçirebilirsiniz: 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

Bölüm 3

Python

Artık Python aracılığıyla bağlı uygulamaya komut göndermeyi ve fonksiyonu çağırmayı göreceksiniz:

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

Komut "1" çıkış yapacak, komut "2" sınıfın bir örneğini bulacak ve özel fonksiyonu secret() çağıracak ve komut "3" fonksiyonu secret() hooklayacak, böylece farklı bir dize döndürecek.

Yani, eğer "2" çağırırsanız gerçek sırrı alacaksınız, ama eğer önce "3" ve sonra "2" çağırırsanız sahte sırrı alacaksınız.

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
};

Bölüm 4

Burada Python ve JS'in etkileşimde bulunmasını JSON nesneleri kullanarak nasıl yapacağınızı göreceksiniz. JS, verileri Python istemcisine göndermek için send() fonksiyonunu kullanır ve Python, verileri JS betiğine göndermek için post() fonksiyonunu kullanır. JS, Python'dan bir yanıt alana kadar yürütmeyi engelleyecektir.

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);
}
});
  1. bölümde yeni bir şey olmadığı için açıklamayacağım. Ama okumak isterseniz burada: https://11x256.github.io/Frida-hooking-android-part-5/

Bug bounty ipucu: hackerlar tarafından, hackerlar için oluşturulmuş premium bir bug bounty platformu olan Intigriti'ye kaydolun! Bugün https://go.intigriti.com/hacktricks adresine katılın ve $100,000'a kadar ödüller kazanmaya başlayın!

HackTricks'i Destekleyin

Last updated