Frida Tutorial 1
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Questo è un riassunto del post: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Source Code: https://github.com/t0thkr1s/frida-demo
Python
Frida ti permette di inserire JavaScript code all’interno delle funzioni di un’applicazione in esecuzione. Ma puoi usare python per chiamare gli hooks e persino per interagire con gli hooks.
Questo è un semplice script python che puoi usare con tutti gli esempi proposti in questo tutorial:
#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()
Esegui lo script:
python hooking.py <hookN.js>
È utile sapere come usare python con frida, ma per questi esempi puoi anche chiamare direttamente Frida utilizzando gli strumenti frida da riga di comando:
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
Hook 1 - Boolean Bypass
Qui puoi vedere come hook un metodo boolean (checkPin) dalla classe: infosecadventures.fridademo.utils.PinUtil
//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
Guarda: La funzione riceve come parametro una String, non serve l’overload?
Hook 2 - Function Bruteforce
Funzione non statica
Se vuoi chiamare una funzione non statica di una classe, devi prima ottenere un’istanza di quella classe. Poi puoi usare quell’istanza per chiamare la funzione.
Per farlo, potresti trovare un’istanza esistente e usarla:
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 () {},
})
})
In questo caso non funziona perché non esiste alcuna instance e la function è Static
Static Function
Se la function è static, puoi semplicemente chiamarla:
//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 - Recupero degli argomenti e del valore di ritorno
Puoi effettuare un hook su una funzione e farla stampare il valore degli argomenti passati e il valore di ritorno:
//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
}
})
Hooking su versioni recenti di Android (14/15/16)
- A partire da Frida 17.1.x+ il Java hooking su Android 14–16 è di nuovo stabile (ART quick entrypoint offsets sono stati corretti). Se
Java.choosenon restituisce nulla su Android 14+, aggiorna frida-server/gadget e i pacchetti CLI/Python a >=17.1.5. - Le app con controlli anti-debug precoci spesso terminano prima di
attach. Usa spawn in modo che gli hook vengano caricati prima dionCreate:
frida -U -f infosecadventures.fridademo -l hook1.js --no-pause
- Quando esistono più overload, seleziona esplicitamente il target:
var Cls = Java.use("com.example.Class")
Cls.doThing.overload('java.lang.String', 'int').implementation = function(s, i) {
return this.doThing(s, i)
}
Iniezione più furtiva con Zygisk Gadget
Alcune app rilevano ptrace o frida-server. I moduli Magisk/Zygisk possono caricare frida-gadget all’interno di Zygote in modo che nessun processo sia sottoposto a ptrace:
- Installa un modulo Zygisk gadget (es.
zygisk-gadget) e riavvia. - Configura il package di destinazione e un ritardo opzionale per bypassare i controlli all’avvio:
adb shell "su -c 'echo infosecadventures.fridademo,5000 > /data/local/tmp/re.zyg.fri/target_packages'"
- Avvia l’app e collegati al gadget indicato dal nome:
frida -U -n Gadget -l hook3.js
Poiché il gadget è iniettato da Zygote, APK integrity checks restano intatti e i controlli stringa base ptrace/Frida solitamente falliscono.
Importante
In questo tutorial hai hooked i metodi usando il nome del metodo e .implementation. Ma se ci fossero più di un metodo con lo stesso nome, dovrai specificare il metodo che vuoi hook indicando il tipo degli argomenti.
Puoi vederlo nel prossimo tutorial.
Riferimenti
- Frida News (Android 14–16 fixes & Frida 17.x releases)
- zygisk-gadget – Zygisk module that loads frida-gadget
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


