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

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:

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

Llama al script:

bash
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:

bash
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

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

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:

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

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:

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

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

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.