hacktricks/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md

420 lines
18 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Tutorial do Frida
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
2023-06-06 18:56:34 +00:00
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
</details>
2022-04-28 16:01:33 +00:00
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2022-04-28 16:01:33 +00:00
**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**](https://go.intigriti.com/hacktricks) hoje mesmo e comece a ganhar recompensas de até **$100.000**!
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
{% embed url="https://go.intigriti.com/hacktricks" %}
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
## Instalação
2023-06-06 18:56:34 +00:00
Instale as **ferramentas do frida**:
2020-09-09 15:07:39 +00:00
```bash
pip install frida-tools
pip install frida
```
**Baixe e instale** no Android o **servidor frida** ([Baixe a versão mais recente](https://github.com/frida/frida/releases)).\
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" %}
2020-09-09 15:07:39 +00:00
```bash
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 %}
2023-06-06 18:56:34 +00:00
**Verifique** se está **funcionando**:
2020-09-09 15:07:39 +00:00
```bash
frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
```
2023-06-06 18:56:34 +00:00
## Tutoriais
2022-10-27 23:22:18 +00:00
### [Tutorial 1](frida-tutorial-1.md)
2023-06-06 18:56:34 +00:00
**De**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
2023-06-06 18:56:34 +00:00
**Código-fonte**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
2023-06-06 18:56:34 +00:00
Siga o [link para ler](frida-tutorial-1.md).
2022-10-27 23:22:18 +00:00
### [Tutorial 2](frida-tutorial-2.md)
2023-06-06 18:56:34 +00:00
**De**: [https://11x256.github.io/Frida-hooking-android-part-2/](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](https://github.com/11x256/frida-android-examples)
2023-06-06 18:56:34 +00:00
Siga o [link para ler](frida-tutorial-2.md).
2022-10-27 23:22:18 +00:00
### [Tutorial 3](owaspuncrackable-1.md)
2023-06-06 18:56:34 +00:00
**De**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk)
2023-06-06 18:56:34 +00:00
Siga o [link para ler](owaspuncrackable-1.md).\
**Você pode encontrar alguns scripts incríveis do Frida aqui:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
2023-06-06 18:56:34 +00:00
## Exemplos Rápidos
2023-06-06 18:56:34 +00:00
Aqui você pode encontrar as funcionalidades mais básicas e interessantes do Frida para criar um script rápido:
2023-06-06 18:56:34 +00:00
### Chamando o Frida a partir da linha de comando
```bash
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.
```
2023-06-06 18:56:34 +00:00
### Script Python Básico
```python
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
```python
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()
```
```python
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()
```
2023-06-06 18:56:34 +00:00
### Hooking de funções sem parâmetros
Faça o hook da função `a()` da classe `sg.vantagepoint.a.c`
```javascript
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;
};
});
```
2023-06-06 18:56:34 +00:00
# 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.
2023-06-06 18:56:34 +00:00
## Pré-requisitos
2023-06-06 18:56:34 +00:00
Antes de começar, certifique-se de ter o seguinte:
2023-06-06 18:56:34 +00:00
- 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.
2023-06-06 18:56:34 +00:00
## Passo a passo
2023-06-06 18:56:34 +00:00
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
```
2023-06-06 18:56:34 +00:00
Substitua `nome_do_pacote` pelo nome do pacote do aplicativo Android.
2023-06-06 18:56:34 +00:00
4. No prompt do Frida, execute o seguinte comando para listar as classes disponíveis no aplicativo:
2023-06-06 18:56:34 +00:00
```javascript
Java.enumerateLoadedClasses({
onMatch: function(className) {
console.log(className);
},
onComplete: function() {
console.log("Done");
}
});
```
2023-06-06 18:56:34 +00:00
Anote o nome da classe que contém o método `exit()`.
2023-06-06 18:56:34 +00:00
5. Agora, vamos fazer o hook no método `exit()`. No prompt do Frida, execute o seguinte comando:
2023-06-06 18:56:34 +00:00
```javascript
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();
}
```
2023-06-06 18:56:34 +00:00
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.
```javascript
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()`
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
Here's an example of how to hook these methods using Frida:
2023-06-06 18:56:34 +00:00
```javascript
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();
};
2023-06-06 18:56:34 +00:00
MainActivity.onCreate.implementation = function () {
console.log('Hooked MainActivity.onCreate()');
// Your custom code here
2023-06-06 18:56:34 +00:00
// Call the original method
this.onCreate();
};
});
```
2023-06-06 18:56:34 +00:00
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()`.
2023-06-06 18:56:34 +00:00
Remember to replace `'com.example.MainActivity'` with the actual package and class name of the MainActivity in the app you are testing.
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
Happy hacking!
```javascript
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);
};
```
2023-06-06 18:56:34 +00:00
# Hook android `.onCreate()`
Neste tutorial, vamos aprender como fazer hook no método `.onCreate()` de um aplicativo Android usando o Frida.
2023-06-06 18:56:34 +00:00
## Requisitos
- Dispositivo Android com acesso root ou emulador Android com Frida Server instalado.
- Frida CLI instalado no seu computador.
## Passo a passo
2023-06-06 18:56:34 +00:00
1. Primeiro, certifique-se de que o aplicativo Android alvo esteja instalado no dispositivo ou no emulador.
2023-06-06 18:56:34 +00:00
2. Conecte o dispositivo Android ao seu computador ou inicie o emulador.
2023-06-06 18:56:34 +00:00
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.
2023-06-06 18:56:34 +00:00
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()`.
```javascript
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.
2023-06-06 18:56:34 +00:00
8. Pressione `Enter` no terminal para executar o script Frida.
2023-06-06 18:56:34 +00:00
9. Agora, quando o aplicativo alvo for iniciado, o método `.onCreate()` será hookado e sua implementação personalizada será executada.
2023-06-06 18:56:34 +00:00
Você pode verificar a saída do console no terminal para confirmar que o hook foi bem-sucedido.
## Conclusão
2023-06-06 18:56:34 +00:00
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.
```javascript
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);
};
```
2023-06-06 18:56:34 +00:00
### 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:
```javascript
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](https://11x256.github.io/Frida-hooking-android-part-2/))
```javascript
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;
};
```
2023-06-06 18:56:34 +00:00
### 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:
```javascript
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(){}
});
```
<figure><img src="../../../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2022-04-28 16:01:33 +00:00
**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**](https://go.intigriti.com/hacktricks) hoje mesmo e comece a ganhar recompensas de até **$100.000**!
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
{% embed url="https://go.intigriti.com/hacktricks" %}
2022-04-28 16:01:33 +00:00
2022-10-27 23:22:18 +00:00
<details>
2022-04-28 16:01:33 +00:00
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
* Você trabalha em uma **empresa de cibersegurança**? Gostaria de ver sua **empresa anunciada no HackTricks**? Ou gostaria de ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
2023-06-06 18:56:34 +00:00
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>