Frida Eğitimi 1

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) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Bu yazının özeti: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Kaynak Kod: https://github.com/t0thkr1s/frida-demo

Python

Frida, çalışan bir uygulamanın fonksiyonlarının içine insert JavaScript code yerleştirmenize olanak tanır. Ancak python’u hooks’ları call etmek ve hatta hooks ile interact etmek için kullanabilirsiniz.

Bu tutorial’de önerilen tüm örneklerle kullanabileceğiniz basit bir python scripti:

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

Script’i çağır:

python hooking.py <hookN.js>

python ile frida kullanmayı bilmek faydalıdır, ancak bu örneklerde komut satırından doğrudan frida araçlarını çağırabilirsiniz:

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

Hook 1 - Boolean Bypass

Burada infosecadventures.fridademo.utils.PinUtil sınıfından boolean bir metodu (checkPin) nasıl hooklayacağınızı görebilirsiniz.

//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

Mirar: La funcion recibe como parametro un String, no hace falta overload?

Hook 2 - Function Bruteforce

Statik Olmayan Fonksiyon

Bir sınıfın statik olmayan fonksiyonunu çağırmak istiyorsanız, önce o sınıfın bir örneğine ihtiyacınız vardır. Ardından, bu örneği fonksiyonu çağırmak için kullanabilirsiniz.
Bunu yapmak için, varolan bir örneği bulup kullanabilirsiniz:

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 bu çalışmıyor çünkü herhangi bir instance yok ve function Static

Static Function

Eğer function static ise, doğrudan çağırabilirsiniz:

//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 - Retrieving arguments and return value

Bir fonksiyonu hook’layabilir ve print ile passed arguments ve return value değerlerini yazdırmasını sağlayabilirsiniz:

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

Güncel Android sürümlerinde Hooking (14/15/16)

  • Frida 17.1.x+ ile Android 14–16’da Java hooking tekrar stabil oldu (ART quick entrypoint offset’ları düzeltildi). Eğer Java.choose Android 14+’da hiçbir şey döndürmüyorsa, frida-server/gadget ve CLI/Python paketlerini >=17.1.5’e yükseltin.
  • Erken anti-debug kontrolleri olan uygulamalar genellikle attach’tan önce kapanır. Hooks’ın onCreate’den önce yüklenmesi için spawn kullanın:
frida -U -f infosecadventures.fridademo -l hook1.js --no-pause
  • Birden fazla overload (aşırı yükleme) varsa, hedefi açıkça seçin:
var Cls = Java.use("com.example.Class")
Cls.doThing.overload('java.lang.String', 'int').implementation = function(s, i) {
return this.doThing(s, i)
}

Zygisk Gadget ile daha gizli enjeksiyon

Bazı uygulamalar ptrace veya frida-server’ı algılar. Magisk/Zygisk modülleri Zygote içinde frida-gadget yükleyebilir, böylece hiçbir süreç ptrace edilmez:

  1. Bir Zygisk gadget modülü (ör. zygisk-gadget) yükleyin ve cihazı yeniden başlatın.
  2. Hedef paketi ve başlatma kontrollerini atlamak için isteğe bağlı bir gecikmeyi yapılandırın:
adb shell "su -c 'echo infosecadventures.fridademo,5000 > /data/local/tmp/re.zyg.fri/target_packages'"
  1. Uygulamayı başlatın ve gadget name’e bağlanın:
frida -U -n Gadget -l hook3.js

Because the gadget is injected by Zygote, APK integrity checks stay untouched and basic ptrace/Frida string checks usually fail.

Önemli

Bu tutorial’da methodları method adını ve .implementation kullanarak hooked yaptınız. Ancak aynı ada sahip birden fazla method varsa, hooklamak istediğiniz method’u argüman tiplerini belirterek açıkça belirtmeniz gerekir.

You can see that in the next tutorial.

Referanslar

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) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin