mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
220 lines
7.5 KiB
Markdown
220 lines
7.5 KiB
Markdown
# Frida Tutorial 2
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|
|
|
|
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Bug bounty tip**: **prijavite se** za **Intigriti**, premium **bug bounty platformu koju su kreirali hakeri, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas, i počnite da zarađujete nagrade do **$100,000**!
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
**Ovo je sažetak posta**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Delovi 2, 3 i 4)\
|
|
**APKs i izvorni kod**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
|
|
|
Deo 1 je veoma lak.
|
|
|
|
**Neki delovi originalnog koda ne rade i ovde su modifikovani.**
|
|
|
|
## Deo 2
|
|
|
|
Ovde možete videti primer kako da **hook-ujete 2 funkcije sa istim imenom** ali različitim parametrima.\
|
|
Takođe, naučićete kako da **pozovete funkciju sa svojim parametrima**.\
|
|
I na kraju, postoji primer kako da **pronađete instancu klase i naterate je da pozove funkciju**.
|
|
```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žete videti da je za kreiranje String-a prvo referencirana klasa _java.lang.String_, a zatim je kreiran _$new_ objekat te klase sa String-om kao sadržajem. Ovo je ispravan način za kreiranje novog objekta klase. Ali, u ovom slučaju, mogli biste jednostavno proslediti `this.fun()` bilo koji String kao: `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
|
|
```
|
|
## Deo 3
|
|
|
|
### Python
|
|
|
|
Sada ćete videti kako da šaljete komande aplikaciji koja je uhvaćena putem Pythona da pozovete funkciju:
|
|
```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()
|
|
```
|
|
Komanda "**1**" će **izaći**, komanda "**2**" će pronaći i **instancirati klasu i pozvati privatnu funkciju** _**secret()**_, a komanda "**3**" će **hook-ovati** funkciju _**secret()**_ tako da **vrati** **drugi string**.
|
|
|
|
Dakle, ako pozovete "**2**", dobićete **pravi tajni podatak**, ali ako pozovete "**3**" i zatim "**2**", dobićete **lažni tajni podatak**.
|
|
|
|
### 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,
|
|
}
|
|
```
|
|
## Deo 4
|
|
|
|
Ovde ćete videti kako da **Python i JS interaguju** koristeći JSON objekte. JS koristi `send()` funkciju da pošalje podatke klijentu u Pythonu, a Python koristi `post()` funkcije da pošalje podatke JS skripti. **JS će blokirati izvršenje** dok ne primi odgovor 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)
|
|
}
|
|
})
|
|
```
|
|
Postoji deo 5 koji neću objašnjavati jer nema ništa novo. Ali ako želite da pročitate, ovde je: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/)
|
|
|
|
<figure><img src="../../../images/i3.png" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Savjet za bug bounty**: **prijavite se** za **Intigriti**, premium **bug bounty platformu koju su kreirali hakeri, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas, i počnite da zarađujete nagrade do **$100,000**!
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
{{#include ../../../banners/hacktricks-training.md}}
|