12 KiB
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!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR a HackTricks e 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
Metodo Veloce
Utilizzando Visual Studio Code e l'estensione 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
Decompilare l'APK
Utilizzando APKTool puoi accedere al codice smali e alle risorse:
apktool d APP.apk
Se apktool ti dà un errore, prova a installare l'ultima versione
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 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, quindi installa l'estensione smalise e l'editor ti dirà se qualche istruzione è errata.
Alcuni esempi possono essere trovati qui:
Oppure puoi controllare di seguito alcune modifiche Smali spiegate.
Ricompila l'APK
Dopo aver modificato il codice, puoi ricompilare il codice utilizzando:
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
Firma il nuovo APK
Successivamente, devi generare una chiave (ti verrà chiesto una password e alcune informazioni che puoi compilare casualmente):
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
Infine, firma il nuovo APK:
jarsigner -keystore key.jks path/to/dist/* <your-alias>
Ottimizza 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 (ancora?)
Se preferisci utilizzare apksigner 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).
apksigner sign --ks key.jks ./dist/mycompiled.apk
Modifica di 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
L'insieme di istruzioni Smali è disponibile qui.
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:
#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:
- Decomprimere l'applicazione Android utilizzando uno strumento come apktool.
- Navigare nella directory dell'applicazione decompressa e individuare la cartella
smali
, che contiene i file Smali. - Aprire il file Smali corrispondente alla classe che si desidera modificare utilizzando un editor di testo.
- Effettuare le modifiche necessarie al codice Smali.
- Salvare il file Smali modificato.
- Ricompilare l'applicazione utilizzando apktool o un altro strumento simile.
- Firmare l'applicazione con una chiave valida.
- 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:
- Decomprimere l'applicazione Android utilizzando uno strumento come apktool.
- Navigare nella directory dell'applicazione decompressa e individuare la cartella
res
, che contiene le risorse. - Modificare le risorse desiderate, ad esempio sostituendo un'immagine o modificando una stringa nel file XML corrispondente.
- Salvare le modifiche apportate alle risorse.
- Ricompilare l'applicazione utilizzando apktool o un altro strumento simile.
- Firmare l'applicazione con una chiave valida.
- 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:
- Decomprimere l'applicazione Android utilizzando uno strumento come apktool.
- Navigare nella directory dell'applicazione decompressa e individuare il file
AndroidManifest.xml
, che contiene le informazioni sull'applicazione. - Aprire il file
AndroidManifest.xml
utilizzando un editor di testo. - Modificare le autorizzazioni desiderate, ad esempio aggiungendo o rimuovendo le dichiarazioni di autorizzazione.
- Salvare il file
AndroidManifest.xml
modificato. - Ricompilare l'applicazione utilizzando apktool o un altro strumento simile.
- Firmare l'applicazione con una chiave valida.
- Installare l'applicazione modificata sul dispositivo Android di destinazione per testarla.
#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
#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 stai per utilizzare variabili dichiarate all'interno della funzione (dichiarate v0,v1,v2...), inserisci queste righe tra .local <numero> 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.
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!
- Ottieni il merchandising ufficiale di PEASS & HackTricks
- Scopri The PEASS Family, la nostra collezione di NFT esclusivi
- Unisciti al 💬 gruppo Discord o al gruppo Telegram o seguici su Twitter 🐦 @carlospolopm.
- Condividi i tuoi trucchi di hacking inviando PR ai repository github di HackTricks e HackTricks Cloud.