Frida Tutorial 1

Reading time: 4 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

To jest podsumowanie posta: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Kod źródłowy: https://github.com/t0thkr1s/frida-demo

Python

Frida pozwala na wstawienie kodu JavaScript wewnątrz funkcji działającej aplikacji. Możesz jednak użyć pytania do wywołania hooków, a nawet do interakcji z hookami.

To prosty skrypt w Pythonie, który możesz użyć ze wszystkimi proponowanymi przykładami w tym samouczku:

python
#hooking.py
import frida, sys

with open(sys.argv[1], 'r') as f:
jscode = f.read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()

Wywołaj skrypt:

bash
python hooking.py <hookN.js>

Przydatne jest, aby wiedzieć, jak używać Pythona z Frida, ale w tych przykładach możesz również bezpośrednio wywołać Frida, używając narzędzi wiersza poleceń frida:

bash
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo

Hook 1 - Boolean Bypass

Tutaj możesz zobaczyć, jak hookować metodę boolean (checkPin) z klasy: infosecadventures.fridademo.utils.PinUtil

javascript
//hook1.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")
var MainActivity = Java.use("infosecadventures.fridademo.utils.PinUtil")
MainActivity.checkPin.implementation = function (pin) {
console.log("[ + ] PIN check successfully bypassed!")
return true
}
})
python hooking.py hook1.js

Patrz: Funkcja przyjmuje jako parametr String, czy nie trzeba przeciążać?

Hook 2 - Bruteforce funkcji

Funkcja niena statyczna

Jeśli chcesz wywołać niena statyczną funkcję klasy, najpierw potrzebujesz instancji tej klasy. Następnie możesz użyć tej instancji, aby wywołać funkcję.
Aby to zrobić, możesz znaleźć istniejącą instancję i użyć jej:

javascript
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
Java.choose("infosecadventures.fridademo.utils.PinUtil", {
onMatch: function (instance) {
console.log("[ * ] Instance found in memory: " + instance)
for (var i = 1000; i < 9999; i++) {
if (instance.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
break
}
}
},
onComplete: function () {},
})
})

W tym przypadku to nie działa, ponieważ nie ma żadnej instancji, a funkcja jest statyczna.

Funkcja statyczna

Jeśli funkcja jest statyczna, możesz po prostu ją wywołać:

javascript
//hook2.js
Java.perform(function () {
console.log("[ * ] Starting PIN Brute-force, please wait...")
var PinUtil = Java.use("infosecadventures.fridademo.utils.PinUtil")

for (var i = 1000; i < 9999; i++) {
if (PinUtil.checkPin(i + "") == true) {
console.log("[ + ] Found correct PIN: " + i)
}
}
})

Hook 3 - Pobieranie argumentów i wartości zwracanej

Możesz podpiąć funkcję i sprawić, aby drukowała wartość przekazanych argumentów oraz wartość wartości zwracanej:

javascript
//hook3.js
Java.perform(function () {
console.log("[ * ] Starting implementation override...")

var EncryptionUtil = Java.use(
"infosecadventures.fridademo.utils.EncryptionUtil"
)
EncryptionUtil.encrypt.implementation = function (key, value) {
console.log("Key: " + key)
console.log("Value: " + value)
var encrypted_ret = this.encrypt(key, value) //Call the original function
console.log("Encrypted value: " + encrypted_ret)
return encrypted_ret
}
})

Ważne

W tym samouczku podłączyłeś metody używając nazwy metody i .implementation. Ale jeśli było więcej niż jedna metoda o tej samej nazwie, będziesz musiał określić metodę, którą chcesz podłączyć wskazując typ argumentów.

Możesz to zobaczyć w następnym samouczku.

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks