hacktricks/mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md
2024-12-12 13:56:11 +01:00

7.1 KiB

Frida Tutorial 1

{% hint style="success" %} Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Dica de bug bounty: inscreva-se no Intigriti, uma plataforma de bug bounty premium criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100,000!

{% embed url="https://go.intigriti.com/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:

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

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:

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

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

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:

//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ê poderia hook uma função e fazer com que ela imprimisse o valor dos argumentos passados e o valor do 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

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 no próximo tutorial.

Dica de bug bounty: inscreva-se no Intigriti, uma plataforma premium de bug bounty criada por hackers, para hackers! Junte-se a nós em https://go.intigriti.com/hacktricks hoje e comece a ganhar recompensas de até $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

{% hint style="success" %} 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
{% endhint %}