Frida Tutorial 1

Reading time: 3 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Este é um resumo do post: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Código Fonte: https://github.com/t0thkr1s/frida-demo

Python

Frida permite que você insira código JavaScript dentro das funções de um aplicativo em execução. Mas você pode usar python para chamar os hooks e até mesmo para interagir com os hooks.

Este é um script python fácil que você pode usar com todos os exemplos propostos neste 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()

Chame o script:

bash
python hooking.py <hookN.js>

É útil saber como usar python com frida, mas para estes exemplos você também pode chamar diretamente o Frida usando as ferramentas de linha de comando frida:

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

Hook 1 - Bypass Boolean

Aqui você pode ver como hook um método booleano (checkPin) da classe: 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: A função recebe como parâmetro uma String, não é necessário sobrecarregar?

Hook 2 - Força Bruta de Função

Função Não Estática

Se você quiser chamar uma função não estática de uma classe, você primeiro precisa de uma instância dessa classe. Então, você pode usar essa instância para chamar a função.
Para fazer isso, você poderia encontrar uma instância existente e usá-la:

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

Neste caso, isso não está funcionando, pois não há nenhuma instância e a função é estática.

Função Estática

Se a função for estática, você pode simplesmente chamá-la:

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 e valor de retorno

Você pode hookear uma função e fazer com que ela imprima o valor dos argumentos passados e o valor do 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

Neste tutorial, você conectou métodos usando o nome do método e .implementation. Mas se houver mais de um método com o mesmo nome, você precisará especificar o método que deseja conectar indicando o tipo dos argumentos.

Você pode ver isso em o próximo tutorial.