Frida Tutorial 1
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 馃挰 Discord group or the telegram group or follow us on Twitter 馃惁 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Este es un resumen de la publicaci贸n: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
C贸digo Fuente: https://github.com/t0thkr1s/frida-demo
Python
Frida te permite insertar c贸digo JavaScript dentro de funciones de una aplicaci贸n en ejecuci贸n. Pero puedes usar python para llamar a los hooks e incluso para interactuar con los hooks.
Este es un script de python f谩cil que puedes usar con todos los ejemplos propuestos en este 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()
Llama al script:
python hooking.py <hookN.js>
Es 煤til saber c贸mo usar python con frida, pero para estos ejemplos tambi茅n podr铆as llamar directamente a Frida utilizando las herramientas de l铆nea de comandos frida:
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
Hook 1 - Bypass Boolean
Aqu铆 puedes ver c贸mo hookear un m茅todo booleano (checkPin) de la clase: 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
Mirar: La funci贸n recibe como par谩metro un String, 驴no hace falta sobrecargar?
Hook 2 - Fuerza Bruta de Funci贸n
Funci贸n No Est谩tica
Si quieres llamar a una funci贸n no est谩tica de una clase, primero necesitas una instancia de esa clase. Luego, puedes usar esa instancia para llamar a la funci贸n.
Para hacerlo, podr铆as encontrar una instancia existente y 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 () {},
})
})
En este caso, esto no est谩 funcionando ya que no hay ninguna instancia y la funci贸n es est谩tica.
Funci贸n Est谩tica
Si la funci贸n es est谩tica, simplemente podr铆as llamarla:
//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 - Recuperando argumentos y valor de retorno
Podr铆as enganchar una funci贸n y hacer que imprima el valor de los argumentos pasados y el valor del valor de retorno:
//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
}
})
Importante
En este tutorial has enganchado m茅todos usando el nombre del m茅todo y .implementation. Pero si hay m谩s de un m茅todo con el mismo nombre, necesitar谩s especificar el m茅todo que deseas enganchar indicando el tipo de los argumentos.
Puedes ver eso en el siguiente tutorial.