# Samouczek Fridy 2
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! * Czy pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana na HackTricks**? lub chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)! * Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family) * Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com) * **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**repozytorium hacktricks**](https://github.com/carlospolop/hacktricks) **i** [**repozytorium hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
**Wskazówka dotycząca nagród za błędy**: **zarejestruj się** na platformie **Intigriti**, premium **platformie do nagród za błędy stworzonej przez hakerów, dla hakerów**! Dołącz do nas na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) już dziś i zacznij zarabiać nagrody aż do **100 000 dolarów**! {% embed url="https://go.intigriti.com/hacktricks" %} **To jest streszczenie posta**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Części 2, 3 i 4)\ **APKs i kod źródłowy**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples) Część 1 jest bardzo prosta. **Niektóre części oryginalnego kodu nie działają i zostały zmodyfikowane tutaj.** ## Część 2 Tutaj znajdziesz przykład, jak **hakować 2 funkcje o tej samej nazwie**, ale z różnymi parametrami.\ Ponadto dowiesz się, jak **wywołać funkcję z własnymi parametrami**.\ I wreszcie, jest przykład, jak **znaleźć instancję klasy i sprawić, aby wywołała funkcję**. ```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 () { } }); }); ``` Możesz zauważyć, że aby utworzyć ciąg znaków, najpierw odwołano się do klasy _java.lang.String_, a następnie utworzono obiekt _$new_ tej klasy z ciągiem znaków jako zawartością. To jest poprawny sposób tworzenia nowego obiektu klasy. Jednak w tym przypadku można było po prostu przekazać do `this.fun()` dowolny ciąg znaków, na przykład: `this.fun("hej tam!")` ### 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 ``` ## Część 3 ### Python Teraz zobaczysz, jak wysyłać polecenia do podłączonej aplikacji za pomocą Pythona, aby wywołać funkcję: ```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() ``` Komenda "**1**" zakończy działanie, komenda "**2**" znajdzie i wywoła instancję klasy oraz wywoła funkcję prywatną _**secret()**_, a komenda "**3**" podczepi funkcję _**secret()_ tak, aby zwracała **inne znaczenie**. Następnie, jeśli wywołasz "**2**", otrzymasz **prawdziwy sekret**, ale jeśli wywołasz "**3**" a następnie "**2**", otrzymasz **fałszywy sekret**. ### 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 }; ``` ## Część 4 Tutaj zobaczysz, jak sprawić, aby **Python i JS współdziałały** za pomocą obiektów JSON. JS używa funkcji `send()` do wysyłania danych do klienta Pythona, a Python używa funkcji `post()` do wysyłania danych do skryptu JS. **JS zablokuje wykonanie** do momentu otrzymania odpowiedzi od Pythona. ### 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); } }); ``` Istnieje część 5, której nie zamierzam wyjaśniać, ponieważ nie ma w niej nic nowego. Ale jeśli chcesz przeczytać, jest tutaj: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/)
**Wskazówka dotycząca nagrody za błąd**: **Zarejestruj się** na platformie **Intigriti**, premium platformie do **nagród za błędy stworzonej przez hakerów, dla hakerów**! Dołącz do nas już dziś na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) i zacznij zarabiać nagrody do **$100,000**! {% embed url="https://go.intigriti.com/hacktricks" %}
Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! * Czy pracujesz w **firmie zajmującej się cyberbezpieczeństwem**? Chcesz zobaczyć, jak Twoja **firma jest reklamowana w HackTricks**? lub chcesz mieć dostęp do **najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF**? Sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)! * Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family) * Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com) * **Dołącz do** [**💬**](https://emojipedia.org/speech-balloon/) [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** mnie na **Twitterze** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**repozytorium hacktricks**](https://github.com/carlospolop/hacktricks) **i** [**repozytorium hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).