hacktricks/mobile-pentesting/android-app-pentesting/smali-changes.md

201 lines
11 KiB
Markdown
Raw Normal View History

2024-02-10 15:36:32 +00:00
# Smali - Dekompilieren/\[Modifizieren]/Kompilieren
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2024-02-03 01:15:34 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) Github-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>
2024-02-10 15:36:32 +00:00
Manchmal ist es interessant, den Anwendungscode zu modifizieren, um auf versteckte Informationen zuzugreifen (vielleicht gut verschleierte Passwörter oder Flags). In diesem Fall kann es interessant sein, die APK zu dekompilieren, den Code zu modifizieren und ihn anschließend neu zu kompilieren.
2024-02-10 15:36:32 +00:00
**Opcodes-Referenz:** [http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html)
2024-02-10 15:36:32 +00:00
## Schneller Weg
2020-12-15 10:14:26 +00:00
2024-02-10 15:36:32 +00:00
Mit **Visual Studio Code** und der Erweiterung [APKLab](https://github.com/APKLab/APKLab) können Sie die Anwendung automatisch dekompilieren, den Code modifizieren, neu kompilieren, signieren und installieren, ohne einen Befehl auszuführen.
2020-12-15 10:14:26 +00:00
2024-02-10 15:36:32 +00:00
Ein weiteres **Skript**, das diese Aufgabe sehr erleichtert, ist [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)
2022-12-27 16:55:40 +00:00
2024-02-10 15:36:32 +00:00
## APK dekompilieren
2024-02-10 15:36:32 +00:00
Mit APKTool können Sie auf den **Smali-Code und die Ressourcen** zugreifen:
2024-02-08 03:08:28 +00:00
```bash
apktool d APP.apk
```
2024-02-10 15:36:32 +00:00
Wenn **apktool** einen Fehler anzeigt, versuchen Sie, die **neueste Version** zu installieren.
2024-02-10 15:36:32 +00:00
Einige **interessante Dateien, auf die Sie achten sollten**, sind:
2024-02-10 15:36:32 +00:00
* _res/values/strings.xml_ (und alle xml-Dateien in res/values/\*)
* _AndroidManifest.xml_
2024-02-10 15:36:32 +00:00
* Jede Datei mit der Erweiterung _.sqlite_ oder _.db_
2024-02-10 15:36:32 +00:00
Wenn `apktool` **Probleme beim Dekodieren der Anwendung** hat, werfen Sie einen Blick auf [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) oder versuchen Sie, das Argument **`-r`** zu verwenden (Ressourcen nicht dekodieren). Wenn das Problem in einer Ressource und nicht im Quellcode lag, haben Sie das Problem nicht (Sie dekodieren auch nicht die Ressourcen).
2024-02-10 15:36:32 +00:00
## Ändern des Smali-Codes
2024-02-10 15:36:32 +00:00
Sie können **Anweisungen ändern**, den **Wert** einiger Variablen ändern oder neue Anweisungen **hinzufügen**. Ich ändere den Smali-Code mit [**VS Code**](https://code.visualstudio.com). Sie installieren dann die **smalise-Erweiterung** und der Editor zeigt Ihnen an, ob eine **Anweisung falsch ist**.\
Einige **Beispiele** finden Sie hier:
2024-02-10 15:36:32 +00:00
* [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)
2024-02-10 15:36:32 +00:00
Oder Sie können [**unten einige erklärte Smali-Änderungen überprüfen**](smali-changes.md#modifying-smali).
2024-02-10 15:36:32 +00:00
## APK neu kompilieren
2024-02-10 15:36:32 +00:00
Nachdem Sie den Code geändert haben, können Sie den Code mit folgendem Befehl **neu kompilieren**:
```bash
apktool b . #In the folder generated when you decompiled the application
```
2024-02-10 15:36:32 +00:00
Es wird die neue APK im Ordner _**dist**_ **kompilieren**.
2024-02-10 15:36:32 +00:00
Wenn **apktool** einen **Fehler** wirft, versuchen Sie, die **neueste Version** zu installieren.
2024-02-10 15:36:32 +00:00
### **Signieren Sie die neue APK**
2024-02-10 15:36:32 +00:00
Dann müssen Sie einen **Schlüssel generieren** (Sie werden nach einem Passwort und einigen Informationen gefragt, die Sie zufällig ausfüllen können):
```bash
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
```
2024-02-10 15:36:32 +00:00
Schließlich **signieren** Sie die neue APK-Datei:
```bash
jarsigner -keystore key.jks path/to/dist/* <your-alias>
```
2024-02-10 15:36:32 +00:00
### Optimiere die neue Anwendung
2024-02-10 15:36:32 +00:00
**zipalign** ist ein Archivausrichtungswerkzeug, das wichtige Optimierungen für Android-Anwendungsdateien (APK) bietet. [Weitere Informationen hier](https://developer.android.com/studio/command-line/zipalign).
```bash
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk
```
2024-02-10 15:36:32 +00:00
### **Signiere die neue APK (erneut?)**
2024-02-10 15:36:32 +00:00
Wenn du **lieber** [**apksigner**](https://developer.android.com/studio/command-line/) anstelle von jarsigner verwenden möchtest, **solltest du die APK** nach der Anwendung der **Optimierung mit** zipalign signieren. ABER BEACHTE, DASS DU DIE ANWENDUNG NUR EINMAL MIT jarsigner (vor zipalign) ODER MIT apksigner (nach zipalign) **SIGNIEREN MUSST**.
```bash
apksigner sign --ks key.jks ./dist/mycompiled.apk
```
2024-02-10 15:36:32 +00:00
## Ändern von Smali
2024-02-10 15:36:32 +00:00
Für den folgenden Hello World Java-Code:
2024-02-08 03:08:28 +00:00
```java
public static void printHelloWorld() {
2024-02-10 15:36:32 +00:00
System.out.println("Hello World")
}
```
2024-02-10 15:36:32 +00:00
Der Smali-Code wäre:
2024-02-08 03:08:28 +00:00
```java
.method public static printHelloWorld()V
2024-02-10 15:36:32 +00:00
.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
```
2024-02-10 15:36:32 +00:00
Der Smali-Befehlssatz ist [hier](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions) verfügbar.
2024-02-10 15:36:32 +00:00
### Leichte Änderungen
2024-02-10 15:36:32 +00:00
### Ändern der Anfangswerte einer Variablen innerhalb einer Funktion
2024-02-10 15:36:32 +00:00
Einige Variablen werden zu Beginn der Funktion mit dem Opcode _const_ definiert. Sie können ihre Werte ändern oder neue Variablen definieren:
2024-02-08 03:08:28 +00:00
```bash
#Number
const v9, 0xf4240
const/4 v8, 0x1
#Strings
const-string v5, "wins"
```
2024-02-10 15:36:32 +00:00
### Grundlegende Operationen
#### Ändern von Smali-Code
2024-02-10 15:36:32 +00:00
Um eine Android-App zu hacken, müssen wir den Smali-Code ändern. Smali ist eine Assemblersprache für die Dalvik Virtual Machine (DVM), die von Android verwendet wird. Hier sind einige grundlegende Operationen, die wir durchführen können:
2024-02-10 15:36:32 +00:00
- **Ändern von Konstanten**: Wir können die Werte von Konstanten ändern, um das Verhalten der App zu beeinflussen.
- **Ändern von Methodenaufrufen**: Wir können Methodenaufrufe ändern, um die App dazu zu bringen, andere Funktionen auszuführen oder bestimmte Bedingungen zu umgehen.
- **Ändern von Variablen**: Wir können Variablenwerte ändern, um das Verhalten der App zu beeinflussen.
- **Hinzufügen von Code**: Wir können zusätzlichen Code einfügen, um neue Funktionen zur App hinzuzufügen oder vorhandenen Code zu erweitern.
- **Entfernen von Code**: Wir können Code entfernen, um bestimmte Funktionen der App zu deaktivieren oder zu umgehen.
Diese grundlegenden Operationen ermöglichen es uns, den Smali-Code einer Android-App zu manipulieren und sie für unsere Zwecke anzupassen. Es ist wichtig, vorsichtig vorzugehen und die Auswirkungen unserer Änderungen zu verstehen, um unerwünschte Nebenwirkungen zu vermeiden.
2024-02-08 03:08:28 +00:00
```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
```
2024-02-10 15:36:32 +00:00
### Größere Änderungen
2024-02-10 15:36:32 +00:00
### Protokollierung
2024-02-08 03:08:28 +00:00
```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>"
```
2024-02-10 15:36:32 +00:00
Empfehlungen:
2024-02-10 15:36:32 +00:00
* Wenn Sie deklarierte Variablen innerhalb der Funktion verwenden möchten (deklariert v0, v1, v2...), platzieren Sie diese Zeilen zwischen _.local \<Zahl>_ und den Deklarationen der Variablen (_const v0, 0x1_)
* Wenn Sie den Protokollierungscode in der Mitte des Codes einer Funktion platzieren 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 mit v0 beginnt).
* Ändern Sie den Code der Protokollierungsfunktion und verwenden Sie _v10_ und _v11_ anstelle von _v5_ und _v1_.
2024-02-10 15:36:32 +00:00
### Toasten
2024-02-10 15:36:32 +00:00
Denken Sie daran, 3 zur Anzahl der _.locals_ am Anfang der Funktion hinzuzufügen.
2024-02-10 15:36:32 +00:00
Dieser Code ist darauf vorbereitet, in der **Mitte einer Funktion** eingefügt zu werden (**ändern** Sie die Anzahl der **Variablen** bei Bedarf). Er nimmt den **Wert von this.o**, **wandelt** ihn in einen **String** um und **zeigt** dann einen **Toast** mit seinem Wert an.
2024-02-08 03:08:28 +00:00
```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
```
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2024-02-03 01:15:34 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>