# 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).