hacktricks/mobile-pentesting/android-app-pentesting/frida-tutorial
2023-10-09 20:03:21 +00:00
..
frida-tutorial-1.md Translated ['README.md', 'backdoors/salseo.md', 'forensics/basic-forensi 2023-10-05 15:37:31 +00:00
frida-tutorial-2.md Translated to Portuguese 2023-06-06 18:56:34 +00:00
objection-tutorial.md Translated ['backdoors/salseo.md', 'forensics/basic-forensic-methodology 2023-08-22 10:36:28 +00:00
owaspuncrackable-1.md Translated ['generic-methodologies-and-resources/shells/windows.md', 'ma 2023-07-13 10:23:45 +00:00
README.md Translated ['macos-hardening/macos-security-and-privilege-escalation/mac 2023-10-09 20:03:21 +00:00

Tutorial do Frida

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 mesmo e comece a ganhar recompensas de até $100.000!

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

Instalação

Instale as ferramentas do frida:

pip install frida-tools
pip install frida

Baixe e instale no Android o servidor frida (Baixe a versão mais recente).
Um comando para reiniciar o adb no modo root, conectar-se a ele, fazer upload do frida-server, dar permissões de execução e executá-lo em segundo plano:

{% code overflow="wrap" %}

adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"

{% endcode %}

Verifique se está funcionando:

frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name

Tutoriais

Tutorial 1

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

Siga o link para ler.

Tutorial 2

De: https://11x256.github.io/Frida-hooking-android-part-2/ (Partes 2, 3 e 4)
APKs e Código-fonte: https://github.com/11x256/frida-android-examples

Siga o link para ler.

Tutorial 3

De: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk

Siga o link para ler.
Você pode encontrar alguns scripts incríveis do Frida aqui: https://codeshare.frida.re/

Exemplos Rápidos

Aqui você pode encontrar as funcionalidades mais básicas e interessantes do Frida para criar um script rápido:

Chamando o Frida a partir da linha de comando

frida-ps -U

#Basic frida hooking
frida -l disableRoot.js -f owasp.mstg.uncrackable1

#Hooking before starting the app
frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
#The --no-pause and -f options allow the app to be spawned automatically,
#frozen so that the instrumentation can occur, and the automatically
#continue execution with our modified code.

Script Python Básico

import frida

# Attach to the target process
session = frida.attach("com.example.app")

# Define the JavaScript code to be injected
js_code = """
Java.perform(function () {
    // Intercept the target method
    var targetClass = Java.use("com.example.app.TargetClass");
    targetClass.targetMethod.implementation = function () {
        // Modify the behavior of the method
        console.log("Method intercepted!");
        return this.targetMethod();
    };
});
"""

# Create the script
script = session.create_script(js_code)

# Load the script into the target process
script.load()

# Detach from the target process
session.detach()

Script Python Básico

import frida

# Anexar ao processo alvo
session = frida.attach("com.example.app")

# Definir o código JavaScript a ser injetado
js_code = """
Java.perform(function () {
    // Interceptar o método alvo
    var targetClass = Java.use("com.example.app.TargetClass");
    targetClass.targetMethod.implementation = function () {
        // Modificar o comportamento do método
        console.log("Método interceptado!");
        return this.targetMethod();
    };
});
"""

# Criar o script
script = session.create_script(js_code)

# Carregar o script no processo alvo
script.load()

# Desanexar do processo alvo
session.detach()
import frida, sys

jscode = open(sys.argv[0]).read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()

Hooking de funções sem parâmetros

Faça o hook da função a() da classe sg.vantagepoint.a.c

Java.perform(function () {
;  rootcheck1.a.overload().implementation = function() {
rootcheck1.a.overload().implementation = function() {
send("sg.vantagepoint.a.c.a()Z   Root check 1 HIT!  su.exists()");
return false;
};
});

Hook java exit()

Neste tutorial, vamos aprender como fazer um hook no método exit() em um aplicativo Android usando o Frida.

Introdução

O Frida é uma poderosa ferramenta de instrumentação e manipulação de código que permite realizar hooks em aplicativos Android. Com o Frida, podemos interceptar chamadas de métodos e modificar seu comportamento.

Pré-requisitos

Antes de começar, certifique-se de ter o seguinte:

  • Um dispositivo Android com acesso root ou um emulador Android configurado.
  • O Frida Server instalado no dispositivo ou no emulador.
  • O ambiente de desenvolvimento configurado para executar comandos Frida.

Passo a passo

Siga as etapas abaixo para fazer um hook no método exit():

  1. Abra o aplicativo Android no qual você deseja fazer o hook.

  2. Inicie o servidor Frida no dispositivo ou no emulador.

  3. Abra um terminal e execute o seguinte comando para se conectar ao dispositivo ou emulador:

    frida -U nome_do_pacote
    

    Substitua nome_do_pacote pelo nome do pacote do aplicativo Android.

  4. No prompt do Frida, execute o seguinte comando para listar as classes disponíveis no aplicativo:

    Java.enumerateLoadedClasses({
        onMatch: function(className) {
            console.log(className);
        },
        onComplete: function() {
            console.log("Done");
        }
    });
    

    Anote o nome da classe que contém o método exit().

  5. Agora, vamos fazer o hook no método exit(). No prompt do Frida, execute o seguinte comando:

    Java.use('nome_da_classe').exit.implementation = function() {
        console.log("Hooked exit()");
        // Faça as modificações desejadas aqui
        // ...
        // Chame o método original
        this.exit();
    }
    

    Substitua nome_da_classe pelo nome da classe que contém o método exit().

  6. Execute o método no aplicativo Android que chama o método exit(). Você verá a mensagem "Hooked exit()" no prompt do Frida, indicando que o hook foi bem-sucedido.

Conclusão

Neste tutorial, aprendemos como fazer um hook no método exit() em um aplicativo Android usando o Frida. O Frida é uma ferramenta poderosa que nos permite interceptar chamadas de métodos e modificar seu comportamento. Com essa técnica, podemos explorar e modificar o fluxo de execução de um aplicativo Android para fins de teste de segurança ou depuração.

var sysexit = Java.use("java.lang.System");
sysexit.exit.overload("int").implementation = function(var_0) {
send("java.lang.System.exit(I)V  // We avoid exiting the application  :)");
};

Hook MainActivity .onStart() & .onCreate()

To hook the .onStart() and .onCreate() methods of the MainActivity class in an Android app, we can use the Frida framework. Frida allows us to dynamically inject JavaScript code into the app's runtime and intercept method calls.

Here's an example of how to hook these methods using Frida:

Java.perform(function () {
  var MainActivity = Java.use('com.example.MainActivity');

  MainActivity.onStart.implementation = function () {
    console.log('Hooked MainActivity.onStart()');
    // Your custom code here

    // Call the original method
    this.onStart();
  };

  MainActivity.onCreate.implementation = function () {
    console.log('Hooked MainActivity.onCreate()');
    // Your custom code here

    // Call the original method
    this.onCreate();
  };
});

In the above code, we first use Java.use() to obtain a reference to the MainActivity class. Then, we override the .onStart() and .onCreate() methods using .implementation. Inside the overridden methods, you can add your custom code to be executed when these methods are called. Finally, we call the original methods using this.onStart() and this.onCreate().

Remember to replace 'com.example.MainActivity' with the actual package and class name of the MainActivity in the app you are testing.

By hooking these methods, you can intercept their execution and perform various actions, such as logging sensitive information, modifying method parameters, or even bypassing certain checks.

Happy hacking!

var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity");
mainactivity.onStart.overload().implementation = function() {
send("MainActivity.onStart() HIT!!!");
var ret = this.onStart.overload().call(this);
};
mainactivity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
send("MainActivity.onCreate() HIT!!!");
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
};

Hook android .onCreate()

Neste tutorial, vamos aprender como fazer hook no método .onCreate() de um aplicativo Android usando o Frida.

Requisitos

  • Dispositivo Android com acesso root ou emulador Android com Frida Server instalado.
  • Frida CLI instalado no seu computador.

Passo a passo

  1. Primeiro, certifique-se de que o aplicativo Android alvo esteja instalado no dispositivo ou no emulador.

  2. Conecte o dispositivo Android ao seu computador ou inicie o emulador.

  3. Abra o terminal e execute o seguinte comando para iniciar o servidor Frida:

    frida-server
    
  4. No terminal, navegue até o diretório onde o arquivo APK do aplicativo alvo está localizado.

  5. Execute o seguinte comando para iniciar o aplicativo alvo com o Frida:

    frida -U -l script.js --no-pause com.example.app
    

    Certifique-se de substituir script.js pelo nome do seu script Frida e com.example.app pelo nome do pacote do aplicativo alvo.

  6. Agora, o Frida está anexado ao processo do aplicativo alvo. Você pode começar a escrever seu script Frida para fazer o hook no método .onCreate().

    Java.perform(function () {
        var targetClass = Java.use('com.example.app.MainActivity');
    
        targetClass.onCreate.implementation = function () {
            console.log('Hooked .onCreate()');
            // Seu código personalizado aqui
            this.onCreate();
        };
    });
    

    Este script substituirá a implementação original do método .onCreate() pela sua própria implementação personalizada. Certifique-se de adicionar seu código personalizado dentro da função implementation.

  7. Salve o script Frida e volte para o terminal.

  8. Pressione Enter no terminal para executar o script Frida.

  9. Agora, quando o aplicativo alvo for iniciado, o método .onCreate() será hookado e sua implementação personalizada será executada.

    Você pode verificar a saída do console no terminal para confirmar que o hook foi bem-sucedido.

Conclusão

Frida é uma ferramenta poderosa para fazer hook em aplicativos Android e modificar seu comportamento. Neste tutorial, aprendemos como fazer o hook no método .onCreate() de um aplicativo Android usando o Frida. Agora você pode explorar ainda mais as capacidades do Frida para realizar testes de segurança e análise de aplicativos Android.

var activity = Java.use("android.app.Activity");
activity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
send("Activity HIT!!!");
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
};

Hooking de funções com parâmetros e recuperando o valor

Hooking de uma função de descriptografia. Imprimir a entrada, chamar a função original para descriptografar a entrada e, por fim, imprimir os dados em texto simples:

function getString(data){
var ret = "";
for (var i=0; i < data.length; i++){
ret += data[i].toString();
}
return ret
}
var aes_decrypt = Java.use("sg.vantagepoint.a.a");
aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
send("sg.vantagepoint.a.a.a([B[B)[B   doFinal(enc)  // AES/ECB/PKCS7Padding");
send("Key       : " + getString(var_0));
send("Encrypted : " + getString(var_1));
var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
send("Decrypted : " + ret);

var flag = "";
for (var i=0; i < ret.length; i++){
flag += String.fromCharCode(ret[i]);
}
send("Decrypted flag: " + flag);
return ret; //[B
};

Hooking de funções e chamando-as com nossa entrada

Faça o hook de uma função que recebe uma string e chame-a com outra string (de aqui)

var string_class = Java.use("java.lang.String"); // get a JS wrapper for java's String class

my_class.fun.overload("java.lang.String").implementation = function(x){ //hooking the new function
var my_string = string_class.$new("My TeSt String#####"); //creating a new String by using `new` operator
console.log("Original arg: " +x );
var ret =  this.fun(my_string); // calling the original function with the new String, and putting its return value in ret variable
console.log("Return value: "+ret);
return ret;
};

Obtendo um objeto já criado de uma classe

Se você deseja extrair algum atributo de um objeto criado, você pode usar isso.

Neste exemplo, você verá como obter o objeto da classe my_activity e como chamar a função .secret() que imprimirá um atributo privado do objeto:

Java.choose("com.example.a11x256.frida_test.my_activity" , {
onMatch : function(instance){ //This function will be called for every instance found by frida
console.log("Found instance: "+instance);
console.log("Result of secret func: " + instance.secret());
},
onComplete:function(){}
});

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

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

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥