Smali - Decompiling/[Modifying]/Compiling
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.
Opcodes-Referenz: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Schneller Weg
Mit Visual Studio Code und der Erweiterung APKLab können Sie die Anwendung automatisch dekompilieren, den Code modifizieren, neu kompilieren, signieren und installieren, ohne einen Befehl auszuführen.
Ein weiteres Skript, das diese Aufgabe sehr erleichtert, ist https://github.com/ax/apk.sh
APK dekompilieren
Mit APKTool können Sie auf den Smali-Code und die Ressourcen zugreifen:
Wenn apktool einen Fehler anzeigt, versuchen Sie, die neueste Version zu installieren.
Einige interessante Dateien, auf die Sie achten sollten, sind:
res/values/strings.xml (und alle xml-Dateien in res/values/*)
AndroidManifest.xml
Jede Datei mit der Erweiterung .sqlite oder .db
Wenn apktool
Probleme beim Dekodieren der Anwendung hat, werfen Sie einen Blick auf 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).
Ändern des Smali-Codes
Sie können Anweisungen ändern, den Wert einiger Variablen ändern oder neue Anweisungen hinzufügen. Ich ändere den Smali-Code mit VS Code. Sie installieren dann die smalise-Erweiterung und der Editor zeigt Ihnen an, ob eine Anweisung falsch ist. Einige Beispiele finden Sie hier:
Oder Sie können unten einige erklärte Smali-Änderungen überprüfen.
APK neu kompilieren
Nachdem Sie den Code geändert haben, können Sie den Code mit folgendem Befehl neu kompilieren:
Es wird die neue APK im Ordner dist kompilieren.
Wenn apktool einen Fehler wirft, versuchen Sie, die neueste Version zu installieren.
Signieren Sie die neue APK
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):
Schließlich signieren Sie die neue APK-Datei:
Optimiere die neue Anwendung
zipalign ist ein Archivausrichtungswerkzeug, das wichtige Optimierungen für Android-Anwendungsdateien (APK) bietet. Weitere Informationen hier.
Signiere die neue APK (erneut?)
Wenn du lieber apksigner 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.
Ändern von Smali
Für den folgenden Hello World Java-Code:
Der Smali-Code wäre:
Der Smali-Befehlssatz ist hier 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 ihre Werte ändern oder neue Variablen definieren:
Grundlegende Operationen
Ändern von Smali-Code
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:
Ä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.
Größere Änderungen
Protokollierung
Empfehlungen:
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.
Toasten
Denken Sie daran, 3 zur Anzahl der .locals am Anfang der Funktion hinzuzufügen.
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.
Last updated