# Smali - Decompilazione/\[Modifica]/Compilazione
Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
A volte è interessante modificare il codice dell'applicazione per accedere a informazioni nascoste (come password o flag ben oscurati). In tal caso, potrebbe essere interessante decompilare l'apk, modificare il codice e ricompilarlo.
**Riferimento agli opcode:** [http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html)
## Metodo Veloce
Utilizzando **Visual Studio Code** e l'estensione [APKLab](https://github.com/APKLab/APKLab), puoi **decompilare**, modificare, **ricompilare**, firmare e installare automaticamente l'applicazione senza eseguire alcun comando.
Un altro **script** che semplifica molto questa operazione è [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
## Decompilare l'APK
Utilizzando APKTool puoi accedere al **codice smali e alle risorse**:
```bash
apktool d APP.apk
```
Se **apktool** ti dà un errore, prova a [installare l'**ultima versione**](https://ibotpeaches.github.io/Apktool/install/)
Alcuni **file interessanti a cui dovresti dare un'occhiata sono**:
* _res/values/strings.xml_ (e tutti gli xml all'interno di res/values/\*)
* _AndroidManifest.xml_
* Qualsiasi file con estensione _.sqlite_ o _.db_
Se `apktool` ha **problemi nel decodificare l'applicazione**, dai un'occhiata a [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) o prova ad utilizzare l'argomento **`-r`** (Non decodificare le risorse). In questo modo, se il problema era nelle risorse e non nel codice sorgente, non avrai il problema (non decompilerai nemmeno le risorse).
## Modifica del codice Smali
Puoi **modificare** le **istruzioni**, cambiare il **valore** di alcune variabili o **aggiungere** nuove istruzioni. Io cambio il codice Smali utilizzando [**VS Code**](https://code.visualstudio.com), quindi installa l'estensione **smalise** e l'editor ti dirà se qualche **istruzione è errata**.\
Alcuni **esempi** possono essere trovati qui:
* [Esempi di modifiche Smali](smali-changes.md)
* [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
Oppure puoi [**controllare di seguito alcune modifiche Smali spiegate**](smali-changes.md#modifying-smali).
## Ricompila l'APK
Dopo aver modificato il codice, puoi **ricompilare** il codice utilizzando:
```bash
apktool b . #In the folder generated when you decompiled the application
```
Compilerà il nuovo APK all'interno della cartella _**dist**_.
Se **apktool** restituisce un **errore**, prova a [installare l'ultima versione](https://ibotpeaches.github.io/Apktool/install/)
### **Firma il nuovo APK**
Successivamente, devi **generare una chiave** (ti verrà chiesto una password e alcune informazioni che puoi compilare casualmente):
```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias
```
Infine, **firma** il nuovo APK:
```bash
jarsigner -keystore key.jks path/to/dist/*
```
### Ottimizza nuova applicazione
**zipalign** è uno strumento di allineamento degli archivi che fornisce importanti ottimizzazioni ai file delle applicazioni Android (APK). [Maggiori informazioni qui](https://developer.android.com/studio/command-line/zipalign).
```bash
zipalign [-f] [-v] infile.apk outfile.apk
zipalign -v 4 infile.apk
```
### **Firma il nuovo APK (ancora?)**
Se **preferisci** utilizzare [**apksigner**](https://developer.android.com/studio/command-line/) invece di jarsigner, **dovresti firmare l'apk** dopo aver applicato **l'ottimizzazione con** zipalign. MA NOTA CHE DEVI **FIRMARE L'APPLICAZIONE UNA SOLA VOLTA** CON jarsigner (prima di zipalign) O CON apksigner (dopo zipalign).
```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk
```
## Modifica di Smali
Per il seguente codice Java Hello World:
```java
public static void printHelloWorld() {
System.out.println("Hello World")
}
```
Il codice Smali sarebbe:
```java
.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
```
L'insieme di istruzioni Smali è disponibile [qui](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
### Modifiche leggere
### Modifica dei valori iniziali di una variabile all'interno di una funzione
Alcune variabili vengono definite all'inizio della funzione utilizzando l'opcode _const_, è possibile modificare i loro valori o definirne di nuove:
```bash
#Number
const v9, 0xf4240
const/4 v8, 0x1
#Strings
const-string v5, "wins"
```
### Operazioni di base
#### Modifica del codice Smali
Il codice Smali è il linguaggio di assemblaggio utilizzato per le applicazioni Android. Per effettuare modifiche al codice Smali, è possibile seguire i seguenti passaggi:
1. Decomprimere l'applicazione Android utilizzando uno strumento come apktool.
2. Navigare nella directory dell'applicazione decompressa e individuare la cartella `smali`, che contiene i file Smali.
3. Aprire il file Smali corrispondente alla classe che si desidera modificare utilizzando un editor di testo.
4. Effettuare le modifiche necessarie al codice Smali.
5. Salvare il file Smali modificato.
6. Ricompilare l'applicazione utilizzando apktool o un altro strumento simile.
7. Firmare l'applicazione con una chiave valida.
8. Installare l'applicazione modificata sul dispositivo Android di destinazione per testarla.
#### Modifica delle risorse
Le risorse di un'applicazione Android, come immagini, layout e stringhe, possono essere modificate per personalizzare l'aspetto e il comportamento dell'applicazione. Per effettuare modifiche alle risorse di un'applicazione Android, è possibile seguire i seguenti passaggi:
1. Decomprimere l'applicazione Android utilizzando uno strumento come apktool.
2. Navigare nella directory dell'applicazione decompressa e individuare la cartella `res`, che contiene le risorse.
3. Modificare le risorse desiderate, ad esempio sostituendo un'immagine o modificando una stringa nel file XML corrispondente.
4. Salvare le modifiche apportate alle risorse.
5. Ricompilare l'applicazione utilizzando apktool o un altro strumento simile.
6. Firmare l'applicazione con una chiave valida.
7. Installare l'applicazione modificata sul dispositivo Android di destinazione per testarla.
#### Modifica delle autorizzazioni
Le autorizzazioni di un'applicazione Android determinano l'accesso alle risorse e alle funzionalità del dispositivo. Per modificare le autorizzazioni di un'applicazione Android, è possibile seguire i seguenti passaggi:
1. Decomprimere l'applicazione Android utilizzando uno strumento come apktool.
2. Navigare nella directory dell'applicazione decompressa e individuare il file `AndroidManifest.xml`, che contiene le informazioni sull'applicazione.
3. Aprire il file `AndroidManifest.xml` utilizzando un editor di testo.
4. Modificare le autorizzazioni desiderate, ad esempio aggiungendo o rimuovendo le dichiarazioni di autorizzazione.
5. Salvare il file `AndroidManifest.xml` modificato.
6. Ricompilare l'applicazione utilizzando apktool o un altro strumento simile.
7. Firmare l'applicazione con una chiave valida.
8. Installare l'applicazione modificata sul dispositivo Android di destinazione per testarla.
```bash
#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
```
### Cambiamenti importanti
### Registrazione degli eventi
```bash
#Log win:
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: "
```
Raccomandazioni:
* Se stai per utilizzare variabili dichiarate all'interno della funzione (dichiarate v0,v1,v2...), inserisci queste righe tra _.local \_ e le dichiarazioni delle variabili (_const v0, 0x1_)
* Se desideri inserire il codice di registrazione nel mezzo del codice di una funzione:
* Aggiungi 2 al numero delle variabili dichiarate: Es: da _.locals 10_ a _.locals 12_
* Le nuove variabili dovrebbero essere i numeri successivi delle variabili già dichiarate (in questo esempio dovrebbero essere _v10_ e _v11_, ricorda che inizia da v0).
* Modifica il codice della funzione di registrazione e utilizza _v10_ e _v11_ al posto di _v5_ e _v1_.
### Toasting
Ricorda di aggiungere 3 al numero di _.locals_ all'inizio della funzione.
Questo codice è preparato per essere inserito nel **mezzo di una funzione** (**cambia** il numero delle **variabili** come necessario). Prenderà il **valore di this.o**, lo **trasformerà** in **Stringa** e quindi **creerà** un **toast** con il suo valore.
```bash
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
```
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!
Altri modi per supportare HackTricks:
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT**](https://opensea.io/collection/the-peass-family) esclusivi
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo Telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai repository github di** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).