Frida Tutorial 1

Reading time: 3 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks'i Destekleyin

Bu gönderinin özeti: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Kaynak Kodu: https://github.com/t0thkr1s/frida-demo

Python

Frida, bir uygulamanın çalışan fonksiyonları içine JavaScript kodu eklemenizi sağlar. Ancak hook'ları çağırmak ve hatta hook'larla etkileşimde bulunmak için python kullanabilirsiniz.

Bu, bu öğreticideki tüm önerilen örneklerle kullanabileceğiniz kolay bir python betiğidir:

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

Scripti çağırın:

bash
python hooking.py <hookN.js>

Python'ı Frida ile nasıl kullanacağınızı bilmek faydalıdır, ancak bu örnekler için Frida'yı doğrudan komut satırı frida araçlarını kullanarak da çağırabilirsiniz:

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

Hook 1 - Boolean Bypass

Burada hook yaparak bir boolean metodunu (checkPin) infosecadventures.fridademo.utils.PinUtil sınıfından nasıl alacağınızı görebilirsiniz.

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

Bak: Fonksiyon bir String parametre alıyor, overload yapmaya gerek var mı?

Hook 2 - Fonksiyon Bruteforce

Statik Olmayan Fonksiyon

Eğer bir sınıfın statik olmayan fonksiyonunu çağırmak istiyorsanız, öncelikle o sınıfın bir örneğine ihtiyacınız var. Sonra, o örneği kullanarak fonksiyonu çağırabilirsiniz.
Bunu yapmak için, mevcut bir örneği bulabilir ve kullanabilirsiniz:

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

Bu durumda, herhangi bir örnek olmadığı için bu çalışmıyor ve fonksiyon Statik.

Statik Fonksiyon

Eğer fonksiyon statikse, onu doğrudan çağırabilirsiniz:

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 - Argümanları ve dönüş değerini alma

Bir fonksiyonu hooklayabilir ve geçirilen argümanların değerini ve dönüş değerinin değerini yazdırmasını sağlayabilirsiniz:

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

Önemli

Bu eğitimde, yöntemlerin adını ve .implementation kullanarak bağladınız. Ancak eğer aynı ada sahip birden fazla yöntem varsa, bağlamak istediğiniz yöntemi belirtmeniz gerekecek argümanların türünü belirterek.

Bunu bir sonraki eğitimde görebilirsiniz.