# Smali - Ontkompilering/\[Wysiging]/Kompilering
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)! Ander maniere om HackTricks te ondersteun: * As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com) * Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family) * **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐩 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Deel jou hacktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-repos.
Soms is dit interessant om die toepassingskode te wysig om toegang te verkry tot verborge inligting vir jou (miskien goed verduisterde wagwoorde of vlae). Dan kan dit interessant wees om die apk te ontkompileer, die kode te wysig en dit weer te kompileer. **Opcodes verwysing:** [http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html) ## Vinnige Metode Met behulp van **Visual Studio Code** en die [APKLab](https://github.com/APKLab/APKLab) uitbreiding, kan jy die toepassing **outomaties ontkompileer**, wysig, **kompileer**, onderteken & installeer sonder om enige bevel uit te voer. 'n Ander **skripsie** wat hierdie taak baie vergemaklik, is [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh) ## Ontkompileer die APK Met behulp van APKTool kan jy toegang kry tot die **smali-kode en hulpbronne**: ```bash apktool d APP.apk ``` As **apktool** jou enige fout gee, probeer om die [**nuutste weergawe**](https://ibotpeaches.github.io/Apktool/install/) te installeer. Sommige **interessante lĂȘers waarop jy moet let** is: * _res/values/strings.xml_ (en alle xml's binne res/values/\*) * _AndroidManifest.xml_ * Enige lĂȘer met die uitbreiding _.sqlite_ of _.db_ As `apktool` **probleme ondervind met die dekodeer van die toepassing**, kyk na [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) of probeer om die argument **`-r`** te gebruik (Dekodeer nie hulpbronne nie). As die probleem in 'n hulpbron was en nie in die bronkode nie, sal jy nie die probleem hĂȘ nie (jy sal ook nie die hulpbronne dekodeer nie). ## Verander smali-kode Jy kan **instruksies verander**, die **waarde** van sommige veranderlikes verander of **nuwe instruksies byvoeg**. Ek verander die Smali-kode met behulp van [**VS Code**](https://code.visualstudio.com), jy installeer dan die **smalise-uitbreiding** en die redakteur sal jou vertel of enige **instruksie onjuis** is.\ Sommige **voorbeelde** kan hier gevind word: * [Voorbeelde van Smali-veranderinge](smali-changes.md) * [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md) Of jy kan [**hieronder 'n paar Smali-veranderinge wat verduidelik word, nagaan**](smali-changes.md#modifying-smali). ## Kompileer die APK weer Nadat jy die kode verander het, kan jy die kode **kompileer** deur gebruik te maak van: ```bash apktool b . #In the folder generated when you decompiled the application ``` Dit sal die nuwe APK **kompileer** binne die _**dist**_ vouer. As **apktool** 'n **fout** gooi, probeer [die **nuutste weergawe** installeer](https://ibotpeaches.github.io/Apktool/install/) ### **Onderteken die nuwe APK** Dan moet jy 'n **sleutel genereer** (jy sal gevra word vir 'n wagwoord en vir sommige inligting wat jy lukraak kan invul): ```bash keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias ``` Uiteindelik, **teken** die nuwe APK: ```bash jarsigner -keystore key.jks path/to/dist/* ``` ### Optimeer nuwe aansoek **zipalign** is 'n argief-uitlyningstool wat belangrike optimalisering aan Android-aansoek (APK) lĂȘers bied. [Meer inligting hier](https://developer.android.com/studio/command-line/zipalign). ```bash zipalign [-f] [-v] infile.apk outfile.apk zipalign -v 4 infile.apk ``` ### **Onderteken die nuwe APK (weer?)** As jy verkies om [apksigner](https://developer.android.com/studio/command-line/) te gebruik in plaas van jarsigner, moet jy die apk onderteken nadat jy die optimalisering met zipalign toegepas het. MAAR LET OP DAT JY DIE AANSOEK SLEGS EEN KEER MOET ONDERTEKEN MET jarsigner (voor zipalign) OF MET apksigner (na zipalign). ```bash apksigner sign --ks key.jks ./dist/mycompiled.apk ``` ## Wysiging van Smali Vir die volgende Hello World Java-kode: ```java public static void printHelloWorld() { System.out.println("Hello World") } ``` Die Smali-kode sal wees: ```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 ``` Die Smali instruksie stel is beskikbaar [hier](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions). ### Ligte Veranderinge ### Wysig aanvanklike waardes van 'n veranderlike binne 'n funksie Sommige veranderlikes word aan die begin van die funksie gedefinieer deur die opcode _const_, jy kan sy waardes wysig, of jy kan nuwe een definieer: ```bash #Number const v9, 0xf4240 const/4 v8, 0x1 #Strings const-string v5, "wins" ``` ### Basiese Operasies #### Smali-lĂȘers wysig Smali-lĂȘers is die mensleesbare weergawe van die Android Dalvik Bytecode. Dit kan gewysig word om die gedrag van 'n Android-toepassing te verander. Hier is 'n paar basiese operasies wat jy kan uitvoer op Smali-lĂȘers: ##### 1. Instruksies toevoeg Jy kan nuwe instruksies byvoeg om die funksionaliteit van die toepassing te verander. Byvoorbeeld, jy kan 'n nuwe funksie implementeer deur die nodige Smali-instruksies by te voeg. ##### 2. Instruksies verwyder As jy 'n spesifieke funksie of gedrag wil uitskakel, kan jy die relevante Smali-instruksies verwyder. Dit sal verhoed dat die toepassing daardie spesifieke funksie uitvoer. ##### 3. Instruksies wysig Jy kan bestaande Smali-instruksies wysig om die funksionaliteit van die toepassing aan te pas. Byvoorbeeld, jy kan 'n waarde verander wat deur 'n instruksie gebruik word, of jy kan 'n voorwaardelike instruksie verander om 'n ander pad te volg. ##### 4. Metodes vervang Jy kan bestaande metodes in die Smali-lĂȘer vervang met jou eie implementasie. Dit gee jou die vermoĂ« om die funksionaliteit van die toepassing te verander sonder om nuwe instruksies by te voeg. ##### 5. Klasstruktuur wysig Jy kan die klasstruktuur van die Smali-lĂȘer wysig deur klasse te verwyder, nuwe klasse by te voeg of bestaande klasse te wysig. Hierdie operasie kan die gedrag van die toepassing drasties verander. ##### 6. Hulpbronne wysig Smali-lĂȘers bevat ook verwysings na hulpbronne soos teks, beelde en klanklĂȘers. Jy kan hierdie hulpbronne wysig om die visuele of klankaspekte van die toepassing te verander. ##### 7. ManifestlĂȘer wysig Die manifestlĂȘer bevat belangrike inligting oor die toepassing, soos die toestemmings wat dit vereis en die komponente wat dit bevat. Jy kan die manifestlĂȘer wysig om die toepassing se gedrag te beĂŻnvloed. ##### 8. Smali-lĂȘers saamvoeg As jy 'n nuwe funksie wil toevoeg wat afhanklik is van bestaande Smali-kode, kan jy die lĂȘers saamvoeg om die funksionaliteit te bereik. ##### 9. Smali-lĂȘers opsplit As jy slegs 'n deel van die Smali-kode wil wysig, kan jy die lĂȘers opsplit en slegs die relevante deel wysig. ##### 10. Smali-lĂȘers onderteken Nadat jy die Smali-lĂȘers gewysig het, moet jy dit onderteken om te verseker dat die toepassing korrek uitgevoer word. ```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 ``` ### Groter Veranderinge ### Logging ```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: " ``` Aanbevelings: * As jy verklaarde veranderlikes binne die funksie gaan gebruik (verklaarde v0,v1,v2...), plaas hierdie lyne tussen die _.local \_ en die verklarings van die veranderlikes (_const v0, 0x1_) * As jy die logkode in die middel van die funksie se kode wil plaas: * Voeg 2 by die aantal verklaarde veranderlikes: Byvoorbeeld: vanaf _.locals 10_ na _.locals 12_ * Die nuwe veranderlikes moet die volgende nommers van die reeds verklaarde veranderlikes wees (in hierdie voorbeeld moet dit _v10_ en _v11_ wees, onthou dat dit begin by v0). * Verander die kode van die logfunksie en gebruik _v10_ en _v11_ in plaas van _v5_ en _v1_. ### Rooster Onthou om 3 by die aantal _.locals_ aan die begin van die funksie te voeg. Hierdie kode is gereed om in die **middel van 'n funksie** **ingevoeg** te word (**verander** die nommer van die **veranderlikes** soos nodig). Dit sal die **waarde van this.o** neem, dit na 'n **String** omskep en dan 'n **rooster** maak met sy waarde. ```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 ```
Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)! Ander maniere om HackTricks te ondersteun: * As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat**, kyk na die [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com) * Ontdek [**The PEASS Family**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family) * **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐩 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Deel jou hacking-truuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-opslagplekke.