mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-20 18:14:15 +00:00
217 lines
13 KiB
Markdown
217 lines
13 KiB
Markdown
# Smali - Decompilando/\[Modificando]/Compilando
|
|
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* 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)!
|
|
* 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 seus truques 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).
|
|
|
|
</details>
|
|
|
|
Às vezes, é interessante modificar o código do aplicativo para acessar informações ocultas para você (talvez senhas bem ofuscadas ou flags). Nesse caso, pode ser interessante descompilar o apk, modificar o código e recompilá-lo.
|
|
|
|
**Referência de opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html)
|
|
|
|
## Forma Rápida
|
|
|
|
Usando o **Visual Studio Code** e a extensão [APKLab](https://github.com/APKLab/APKLab), você pode **descompilar**, modificar, **recompilar**, assinar e instalar o aplicativo automaticamente, sem executar nenhum comando.
|
|
|
|
Outro **script** que facilita muito essa tarefa é [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)****
|
|
|
|
## Descompilar o APK
|
|
|
|
Usando o APKTool, você pode acessar o **código smali e recursos**:
|
|
```
|
|
apktool d APP.apk
|
|
```
|
|
Se o **apktool** apresentar algum erro, tente [instalar a **versão mais recente**](https://ibotpeaches.github.io/Apktool/install/)
|
|
|
|
Alguns **arquivos interessantes que você deve procurar são**:
|
|
|
|
* _res/values/strings.xml_ (e todos os xmls dentro de res/values/\*)
|
|
* _AndroidManifest.xml_
|
|
* Qualquer arquivo com a extensão _.sqlite_ ou _.db_
|
|
|
|
Se o `apktool` tiver **problemas ao decodificar o aplicativo**, dê uma olhada em [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) ou tente usar o argumento **`-r`** (Não decodificar recursos). Então, se o problema estiver em um recurso e não no código-fonte, você não terá o problema (você também não descompilará os recursos).
|
|
|
|
## Alterar o código Smali
|
|
|
|
Você pode **alterar** **instruções**, alterar o **valor** de algumas variáveis ou **adicionar** novas instruções. Eu altero o código Smali usando o [**VS Code**](https://code.visualstudio.com), então você instala a extensão **smalise** e o editor irá informar se alguma **instrução estiver incorreta**.\
|
|
Alguns **exemplos** podem ser encontrados aqui:
|
|
|
|
* [Exemplos de alterações no Smali](smali-changes.md)
|
|
* [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
|
|
|
Ou você pode [**ver abaixo algumas alterações no Smali explicadas**](smali-changes.md#modifying-smali).
|
|
|
|
## Recompilar o APK
|
|
|
|
Após modificar o código, você pode **recompilar** o código usando:
|
|
```bash
|
|
apktool b . #In the folder generated when you decompiled the application
|
|
```
|
|
Ele irá **compilar** o novo APK **dentro** da pasta _**dist**_.
|
|
|
|
Se o **apktool** lançar um **erro**, tente [instalar a **versão mais recente**](https://ibotpeaches.github.io/Apktool/install/)
|
|
|
|
### **Assine o novo APK**
|
|
|
|
Em seguida, você precisa **gerar uma chave** (será solicitada uma senha e algumas informações que você pode preencher aleatoriamente):
|
|
```bash
|
|
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
|
```
|
|
Finalmente, **assinando** o novo APK:
|
|
```bash
|
|
jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
|
```
|
|
### Otimizar nova aplicação
|
|
|
|
**zipalign** é uma ferramenta de alinhamento de arquivos que fornece otimização importante para arquivos de aplicativos Android (APK). [Mais informações aqui](https://developer.android.com/studio/command-line/zipalign).
|
|
```bash
|
|
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
|
zipalign -v 4 infile.apk
|
|
```
|
|
### **Assine o novo APK (novamente?)**
|
|
|
|
Se você **preferir** usar o \[**apksigner**]\([**https://developer.android.com/studio/command-line/apksigner**](https://developer.android.com/studio/command-line/apksigner))\*\* em vez do jarsigner, **você deve assinar o apk** após aplicar **a otimização com** zipalign\*\*. MAS OBSERVE QUE\*\* VOCÊ SÓ PRECISA ASSINAR O APLICATIVO UMA VEZ\*\* COM o jarsigner (antes do zipalign) OU COM o apksigner (após o zipalign).
|
|
```bash
|
|
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
|
```
|
|
## Modificando Smali
|
|
|
|
Para o seguinte código Java Hello World:
|
|
```
|
|
public static void printHelloWorld() {
|
|
System.out.println("Hello World")
|
|
}
|
|
```
|
|
O código Smali seria:
|
|
```
|
|
.method public static printHelloWorld()V
|
|
.registers 2
|
|
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
|
|
const-string v1, "Hello World"
|
|
invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
|
|
return-void
|
|
.end method
|
|
```
|
|
O conjunto de instruções Smali está disponível [aqui](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
|
|
|
### Mudanças Leves
|
|
|
|
### Modificar valores iniciais de uma variável dentro de uma função
|
|
|
|
Algumas variáveis são definidas no início da função usando o opcode _const_, você pode modificar seus valores ou definir novas variáveis:
|
|
```
|
|
#Number
|
|
const v9, 0xf4240
|
|
const/4 v8, 0x1
|
|
#Strings
|
|
const-string v5, "wins"
|
|
```
|
|
### Operações Básicas
|
|
|
|
#### Adding Log Statements
|
|
|
|
#### Adicionando Declarações de Log
|
|
|
|
To understand the flow of an Android app and identify potential vulnerabilities, it is often helpful to add log statements to the app's code. This allows us to see the values of variables, method calls, and other important information during runtime.
|
|
|
|
Para entender o fluxo de um aplicativo Android e identificar possíveis vulnerabilidades, muitas vezes é útil adicionar declarações de log ao código do aplicativo. Isso nos permite ver os valores das variáveis, chamadas de método e outras informações importantes durante a execução.
|
|
|
|
To add a log statement, we need to modify the smali code of the app. Smali is the assembly-like language used by Android apps. We can use a text editor or a specialized tool like apktool to decompile the app's APK file and access its smali code.
|
|
|
|
Para adicionar uma declaração de log, precisamos modificar o código smali do aplicativo. Smali é a linguagem semelhante a assembly usada pelos aplicativos Android. Podemos usar um editor de texto ou uma ferramenta especializada como o apktool para descompilar o arquivo APK do aplicativo e acessar seu código smali.
|
|
|
|
Once we have the smali code, we can search for the specific method or section where we want to add the log statement. We then insert the log statement using the appropriate smali syntax.
|
|
|
|
Depois de obtermos o código smali, podemos procurar pelo método ou seção específica onde queremos adicionar a declaração de log. Em seguida, inserimos a declaração de log usando a sintaxe smali apropriada.
|
|
|
|
For example, to log the value of a variable named `password` in a method called `login`, we can add the following smali code:
|
|
|
|
Por exemplo, para registrar o valor de uma variável chamada `password` em um método chamado `login`, podemos adicionar o seguinte código smali:
|
|
|
|
```smali
|
|
const-string v0, "password: "
|
|
invoke-static {v0, p1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
|
|
```
|
|
|
|
In this code, `const-string` is used to define a string value, `invoke-static` is used to call the `d` method of the `Log` class, and `v0` and `p1` are registers that hold the string values.
|
|
|
|
Neste código, `const-string` é usado para definir um valor de string, `invoke-static` é usado para chamar o método `d` da classe `Log`, e `v0` e `p1` são registradores que armazenam os valores de string.
|
|
|
|
After adding the log statement, we can recompile the smali code back into an APK file using apktool. We can then install the modified APK on an Android device or emulator to observe the log output.
|
|
|
|
Após adicionar a declaração de log, podemos recompilar o código smali de volta para um arquivo APK usando o apktool. Em seguida, podemos instalar o APK modificado em um dispositivo Android ou emulador para observar a saída do log.
|
|
```
|
|
#Math
|
|
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
|
|
mul-int v0,v2,0x2 #v2*0x2 and save in v0
|
|
|
|
#Move the value of one object into another
|
|
move v1,v2
|
|
|
|
#Condtions
|
|
if-ge #Greater or equals
|
|
if-le #Less or equals
|
|
if-eq #Equals
|
|
|
|
#Get/Save attributes of an object
|
|
iget v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save this.o inside v0
|
|
iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside this.o
|
|
|
|
#goto
|
|
:goto_6 #Declare this where you want to start a loop
|
|
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
|
|
goto :goto_6 #Always go to: :goto_6
|
|
```
|
|
### Mudanças Maiores
|
|
|
|
### Registro (Logging)
|
|
```
|
|
#Log win: <number>
|
|
iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5
|
|
invoke-static {v5}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; #Transform number to String
|
|
move-result-object v1 #Move to v1
|
|
const-string v5, "wins" #Save "win" inside v5
|
|
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
|
|
```
|
|
Recomendações:
|
|
|
|
* Se você for usar variáveis declaradas dentro da função (declaradas v0,v1,v2...), coloque essas linhas entre _.local \<número>_ e as declarações das variáveis (_const v0, 0x1_)
|
|
* Se você quiser colocar o código de log no meio do código de uma função:
|
|
* Adicione 2 ao número de variáveis declaradas: Ex: de _.locals 10_ para _.locals 12_
|
|
* As novas variáveis devem ser os próximos números das variáveis já declaradas (neste exemplo, seriam _v10_ e _v11_, lembre-se de que começa em v0).
|
|
* Altere o código da função de log e use _v10_ e _v11_ em vez de _v5_ e _v1_.
|
|
|
|
### Toasting
|
|
|
|
Lembre-se de adicionar 3 ao número de _.locals_ no início da função.
|
|
|
|
Este código está preparado para ser inserido no **meio de uma função** (**altere** o número das **variáveis** conforme necessário). Ele irá pegar o **valor de this.o**, **transformá-lo** em **String** e então **fazer** um **toast** com o seu valor.
|
|
```
|
|
const/4 v10, 0x1
|
|
const/4 v11, 0x1
|
|
const/4 v12, 0x1
|
|
iget v10, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I
|
|
invoke-static {v10}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
|
|
move-result-object v11
|
|
invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
|
|
move-result-object v12
|
|
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
|
```
|
|
<details>
|
|
|
|
<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>
|
|
|
|
* Você trabalha em uma **empresa de cibersegurança**? 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)!
|
|
* 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 seus truques 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).
|
|
|
|
</details>
|