120 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Frida Tutorial 1
{{#include ../../../banners/hacktricks-training.md}}
**Bu gönderinin özeti**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
**Kaynak Kodu**: [https://github.com/t0thkr1s/frida-demo](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](frida-tutorial-2.md) görebilirsiniz.