mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
165 lines
7.4 KiB
Markdown
165 lines
7.4 KiB
Markdown
# Smali - Decompiling/\[Modifying]/Compiling
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
Manchmal ist es interessant, den Anwendungscode zu modifizieren, um auf versteckte Informationen zuzugreifen (vielleicht gut obfuskierte Passwörter oder Flags). Dann könnte es interessant sein, die apk zu dekompilieren, den Code zu ändern und ihn neu zu kompilieren.
|
|
|
|
**Opcodes reference:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
|
|
|
## Fast Way
|
|
|
|
Mit **Visual Studio Code** und der [APKLab](https://github.com/APKLab/APKLab) Erweiterung können Sie die Anwendung **automatisch dekompilieren**, modifizieren, **neu kompilieren**, signieren und installieren, ohne einen Befehl auszuführen.
|
|
|
|
Ein weiteres **Skript**, das diese Aufgabe erheblich erleichtert, ist [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
|
|
|
|
## Decompile the APK
|
|
|
|
Mit APKTool können Sie auf den **smali code und die Ressourcen** zugreifen:
|
|
```bash
|
|
apktool d APP.apk
|
|
```
|
|
Wenn **apktool** einen Fehler anzeigt, versuche[ die **neueste Version**](https://ibotpeaches.github.io/Apktool/install/) zu installieren.
|
|
|
|
Einige **interessante Dateien, die du dir ansehen solltest, sind**:
|
|
|
|
- _res/values/strings.xml_ (und alle xmls in res/values/\*)
|
|
- _AndroidManifest.xml_
|
|
- Jede Datei mit der Erweiterung _.sqlite_ oder _.db_
|
|
|
|
Wenn `apktool` **Probleme beim Dekodieren der Anwendung** hat, schaue dir [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) an oder versuche das Argument **`-r`** zu verwenden (Ressourcen nicht dekodieren). Dann, wenn das Problem in einer Ressource und nicht im Quellcode lag, wirst du das Problem nicht haben (du wirst auch die Ressourcen nicht dekompilieren).
|
|
|
|
## Smali-Code ändern
|
|
|
|
Du kannst **Anweisungen ändern**, den **Wert** einiger Variablen ändern oder **neue Anweisungen hinzufügen**. Ich ändere den Smali-Code mit [**VS Code**](https://code.visualstudio.com), du installierst dann die **smalise Erweiterung** und der Editor wird dir sagen, ob eine **Anweisung falsch ist**.\
|
|
Einige **Beispiele** findest du hier:
|
|
|
|
- [Beispiele für Smali-Änderungen](smali-changes.md)
|
|
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
|
|
|
Oder du kannst [**unten einige Smali-Änderungen erklärt ansehen**](smali-changes.md#modifying-smali).
|
|
|
|
## APK neu kompilieren
|
|
|
|
Nachdem du den Code geändert hast, kannst du den Code mit **rekompilieren**:
|
|
```bash
|
|
apktool b . #In the folder generated when you decompiled the application
|
|
```
|
|
Es wird die neue APK **im** _**dist**_ Ordner **kompilieren**.
|
|
|
|
Wenn **apktool** einen **Fehler** ausgibt, versuche[ die **neueste Version**](https://ibotpeaches.github.io/Apktool/install/) zu installieren.
|
|
|
|
### **Signiere die neue APK**
|
|
|
|
Dann musst du einen **Schlüssel** **generieren** (du wirst nach einem Passwort und einigen Informationen gefragt, die du zufällig ausfüllen kannst):
|
|
```bash
|
|
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
|
```
|
|
Schließlich **signiere** die neue APK:
|
|
```bash
|
|
jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
|
```
|
|
### Neue Anwendung optimieren
|
|
|
|
**zipalign** ist ein Archiv-Ausrichtungswerkzeug, das wichtige Optimierungen für Android-Anwendungen (APK) bietet. [More information here](https://developer.android.com/studio/command-line/zipalign).
|
|
```bash
|
|
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
|
zipalign -v 4 infile.apk
|
|
```
|
|
### **Signiere die neue APK (noch einmal?)**
|
|
|
|
Wenn du **bevorzugst**, [**apksigner**](https://developer.android.com/studio/command-line/) anstelle von jarsigner zu verwenden, **solltest du die apk signieren**, nachdem du **die Optimierung mit** zipalign angewendet hast. ABER BEACHTE, DASS DU DIE ANWENDUNG NUR EINMAL **MIT jarsigner** (vor zipalign) ODER MIT aspsigner (nach zipalign) **SIGNIEREN MUSST**.
|
|
```bash
|
|
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
|
```
|
|
## Modifying Smali
|
|
|
|
Für den folgenden Hello World Java-Code:
|
|
```java
|
|
public static void printHelloWorld() {
|
|
System.out.println("Hello World")
|
|
}
|
|
```
|
|
Der Smali-Code wäre:
|
|
```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
|
|
```
|
|
Das Smali-Befehlssatz ist [hier](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions) verfügbar.
|
|
|
|
### Leichte Änderungen
|
|
|
|
### Ändern der Anfangswerte einer Variablen innerhalb einer Funktion
|
|
|
|
Einige Variablen werden zu Beginn der Funktion mit dem Opcode _const_ definiert, Sie können deren Werte ändern oder neue definieren:
|
|
```bash
|
|
#Number
|
|
const v9, 0xf4240
|
|
const/4 v8, 0x1
|
|
#Strings
|
|
const-string v5, "wins"
|
|
```
|
|
### Grundlegende Operationen
|
|
```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
|
|
```
|
|
### Größere Änderungen
|
|
|
|
### Protokollierung
|
|
```bash
|
|
#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>"
|
|
```
|
|
Empfehlungen:
|
|
|
|
- Wenn Sie deklarierte Variablen innerhalb der Funktion verwenden möchten (deklarierte v0,v1,v2...), setzen Sie diese Zeilen zwischen die _.local \<number>_ und die Deklarationen der Variablen (_const v0, 0x1_)
|
|
- Wenn Sie den Logging-Code in die Mitte des Codes einer Funktion einfügen möchten:
|
|
- Fügen Sie 2 zur Anzahl der deklarierten Variablen hinzu: z.B. von _.locals 10_ zu _.locals 12_
|
|
- Die neuen Variablen sollten die nächsten Zahlen der bereits deklarierten Variablen sein (in diesem Beispiel sollten es _v10_ und _v11_ sein, denken Sie daran, dass es bei v0 beginnt).
|
|
- Ändern Sie den Code der Logging-Funktion und verwenden Sie _v10_ und _v11_ anstelle von _v5_ und _v1_.
|
|
|
|
### Toasting
|
|
|
|
Denken Sie daran, 3 zur Anzahl der _.locals_ zu Beginn der Funktion hinzuzufügen.
|
|
|
|
Dieser Code ist vorbereitet, um in die **Mitte einer Funktion** eingefügt zu werden (**ändern** Sie die Nummer der **Variablen** nach Bedarf). Er wird den **Wert von this.o** nehmen, ihn in **String** umwandeln und dann einen **Toast** mit seinem Wert **machen**.
|
|
```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
|
|
```
|
|
{{#include ../../banners/hacktricks-training.md}}
|