Smali - Decompiling/[Modifying]/Compiling

Support HackTricks

A volte è interessante modificare il codice dell'applicazione per accedere a informazioni nascoste per te (forse password o flag ben offuscate). Quindi, potrebbe essere interessante decompilare l'apk, modificare il codice e ricompilarlo.

Riferimento Opcode: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

Modo Veloce

Utilizzando Visual Studio Code e l'estensione APKLab, puoi decompilare automaticamente, modificare, ricompilare, firmare e installare l'applicazione senza eseguire alcun comando.

Un altro script che facilita molto questo compito è https://github.com/ax/apk.sh

Decompilare l'APK

Utilizzando APKTool puoi accedere al codice smali e alle risorse:

apktool d APP.apk

Se apktool ti dà qualche errore, prova a installare la versione più recente

Alcuni file interessanti da esaminare 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 a decodificare l'applicazione, dai un'occhiata a https://ibotpeaches.github.io/Apktool/documentation/#framework-files o prova a usare l'argomento -r (Non decodificare le risorse). Poi, se il problema era in una risorsa e non nel codice sorgente, non avrai il problema (non decompilando nemmeno le risorse).

Cambiare il codice smali

Puoi cambiare istruzioni, cambiare il valore di alcune variabili o aggiungere nuove istruzioni. Io cambio il codice Smali usando VS Code, poi installi l'estensione smalise e l'editor ti dirà se qualche istruzione è errata. Alcuni esempi possono essere trovati qui:

Oppure puoi controllare qui sotto alcuni cambiamenti Smali spiegati.

Ricompilare l'APK

Dopo aver modificato il codice, puoi ricompilare il codice usando:

apktool b . #In the folder generated when you decompiled the application

Compilerà il nuovo APK all'interno della cartella dist.

Se apktool genera un errore, prova a installare la versione più recente

Firma il nuovo APK

Poi, devi generare una chiave (ti verrà chiesta una password e alcune informazioni che puoi compilare casualmente):

keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>

Finalmente, firma il nuovo APK:

jarsigner -keystore key.jks path/to/dist/* <your-alias>

Ottimizza una nuova applicazione

zipalign è uno strumento di allineamento degli archivi che fornisce importanti ottimizzazioni ai file delle applicazioni Android (APK). Maggiori informazioni qui.

zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk

Firma il nuovo APK (di nuovo?)

Se preferisci utilizzare apksigner invece di jarsigner, dovresti firmare l'apk dopo aver applicato l'ottimizzazione con zipalign. MA FAI ATTENZIONE CHE DEVI FIRMARE L'APPLICAZIONE UNA SOLA VOLTA CON jarsigner (prima di zipalign) O CON apksigner (dopo zipalign).

apksigner sign --ks key.jks ./dist/mycompiled.apk

Modifying Smali

Per il seguente codice Java Hello World:

public static void printHelloWorld() {
System.out.println("Hello World")
}

Il codice Smali sarebbe:

.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

Il set di istruzioni Smali è disponibile qui.

Modifiche leggere

Modificare i valori iniziali di una variabile all'interno di una funzione

Alcune variabili sono definite all'inizio della funzione utilizzando l'opcode const, puoi modificare i loro valori, oppure puoi definirne di nuovi:

#Number
const v9, 0xf4240
const/4 v8, 0x1
#Strings
const-string v5, "wins"

Operazioni di base

#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 Maggiori

Registrazione

#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>"

Raccomandazioni:

  • Se intendi utilizzare variabili dichiarate all'interno della funzione (dichiarate v0,v1,v2...) inserisci queste righe tra il .local <numero> e le dichiarazioni delle variabili (const v0, 0x1)

  • Se vuoi inserire il codice di logging nel mezzo del codice di una funzione:

  • Aggiungi 2 al numero di 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 con v0).

  • Cambia il codice della funzione di logging e usa v10 e v11 invece 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, trasformerà in String e poi farà un toast con il suo valore.

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
Supporta HackTricks

Last updated