Es ist allgemein bekannt, dass Android-Apps in Form von verteilt werden Android-Anwendungspaket Dateien oder kurz APK-Dateien. Die meisten Leute betrachten eine APK jedoch als Black Box und haben keine Ahnung, wie sie erstellt wurde oder was darin enthalten ist. Selbst die meisten App-Entwickler kennen die Anatomie einer APK nur oberflächlich. In integrierten Entwicklungsumgebungen wie Android Studio genügt ein Klick, um ein Android-Projekt in eine APK zu verwandeln.
In diesem Tutorial werden wir eine Android-App analysieren. Mit anderen Worten, wir öffnen die APK und schauen uns den Inhalt an. Da es sich bei einer APK nur um eine binäre Datei handelt, die nur von Maschinen gelesen werden kann, werde ich Ihnen außerdem einige Werkzeuge vorstellen, mit denen Sie den Inhalt in eine für Menschen lesbarere Form übersetzen können.
Um mitzumachen, brauchst du:
Viele Leute machen das aus reiner Neugier. Andere genießen die Möglichkeit, direkt auf die Bilder, Sounds und anderen Assets ihrer Lieblingsspiele oder Apps zuzugreifen. Es gibt jedoch wichtigere Gründe, warum Sie in eine APK hineinschauen möchten.
Wenn Sie gerade erst mit der Android-App-Entwicklung angefangen haben, können Sie viel lernen, wenn Sie in APK-Dateien von beliebten Apps oder von Profis erstellten Apps nachschauen. Wenn Sie beispielsweise die XML-Layoutdateien einer App betrachten, die auf mehreren Bildschirmgrößen gut aussieht, können Sie Ihre eigenen Fähigkeiten zur Layouterstellung verbessern.
Apps, die aus nicht vertrauenswürdigen Quellen heruntergeladen wurden, können schädlichen Code enthalten. Wenn Sie bereits ein erfahrener App-Entwickler sind, können Sie durch das Zerlegen solcher Apps den Code anzeigen, um ein besseres Verständnis darüber zu erhalten, was sie unter der Haube wirklich tun.
Sie können nicht viel von einer APK lernen, ohne ein grundlegendes Verständnis dafür zu haben, wie sie erstellt wird. Tatsächlich sind die wichtigsten Werkzeuge, die zum Analysieren einer APK verwendet werden, auch die Werkzeuge, mit denen eine APK erstellt wird.
Android-Projekte bestehen hauptsächlich aus Java-Quellcode, XML-Layouts, XML-Metadaten und Elementen wie Bildern, Videos und Sounds. Bevor das Android-Betriebssystem all diese Dateien verwenden kann, müssen sie in eine für sie verständliche Form konvertiert werden. Diese Konvertierung beinhaltet viele Zwischenaufgaben, die normalerweise als Android-Erstellungsprozess bezeichnet werden. Die endgültige Ausgabe des Build-Prozesses ist eine APK oder Android-Anwendungspaket.
In Android Studio-Projekten übernimmt das Android-Plugin für Gradle alle Zwischenaufgaben des Erstellungsprozesses.
Eine der ersten wichtigen Aufgaben ist die Generierung einer aufgerufenen Datei R.java. Mit dieser Datei können Entwickler mithilfe von numerischen Konstanten einfach auf das Projektlayout und die zu zeichnenden Ressourcen in ihrem Java-Code zugreifen. Um die Datei zu erzeugen, wird ein Werkzeug aufgerufen aapt, was ist kurz für Android Asset-Paketierungswerkzeug, wird eingesetzt. Das Tool konvertiert außerdem alle XML-Ressourcen zusammen mit der Manifestdatei des Projekts in ein Binärformat.
Alle Java-Dateien einschließlich R.java, werden dann mit dem Java-Compiler in Klassendateien konvertiert. Wie Sie vielleicht bereits wissen, bestehen Klassendateien aus Bytecode, die von einer Java-Laufzeit-Engine interpretiert werden können. Android verwendet jedoch eine spezielle Art der Laufzeit, die Android-Laufzeit (ART), die für mobile Geräte optimiert ist. Sobald alle Klassendateien generiert wurden, wird ein Werkzeug aufgerufen dx wird verwendet, um den Bytecode in den Dalvik-Bytecode zu übersetzen, ein Format, das ART versteht.
Sobald die Ressourcen und Java-Dateien verarbeitet wurden, werden sie in einer Archivdatei abgelegt, die einer JAR-Datei sehr ähnlich ist. Die Archivdatei wird dann mit einem privaten Schlüssel signiert, der dem App-Entwickler gehört. Diese beiden Vorgänge werden vom Gradle-Plugin ohne externe Werkzeuge ausgeführt. Der Schlüssel des Entwicklers wird jedoch von einem Schlüsselspeicher abgerufen, der von keytool verwaltet wird.
Abschließend werden einige Optimierungen in der Archivdatei mit der vorgenommen Zipalign Tool, um sicherzustellen, dass der Speicher, den die App während der Ausführung benötigt, auf ein Minimum beschränkt ist. Zu diesem Zeitpunkt ist die Archivdatei eine gültige APK, die vom Android-Betriebssystem verwendet werden kann.
Nachdem Sie nun verstanden haben, wie APK-Dateien erstellt und verwendet werden, öffnen Sie eine und sehen Sie sich den Inhalt an. In diesem Tutorial verwenden wir das APK einer aufgerufenen App Beispiel-Soft-Tastatur, die auf dem Android-Emulator vorinstalliert ist. Wenn Sie jedoch ein physisches Gerät bevorzugen, können Sie das APK einer App, die Sie darauf installiert haben, genauso einfach verwenden.
Um den Inhalt des APK zu überprüfen, müssen Sie ihn zuerst vom Emulator auf Ihren Computer übertragen. Bevor Sie dies tun, müssen Sie den Paketnamen und den absoluten Pfad des APK kennen. Benutzen adb
eine Shell-Sitzung auf Ihrem Emulator öffnen.
ADB Shell
Wenn Sie die Shell-Eingabeaufforderung sehen, verwenden Sie die PM-Liste
Befehl, um die Paketnamen aller installierten Apps aufzulisten.
pm liste pakete
Der Paketname der App, an der wir interessiert sind, lautet com.example.android.softkeyboard. Sie sollten es in der Liste sehen können. Übergeben Sie den Paketnamen an die PM-Pfad
Befehl können Sie den absoluten Pfad der APK bestimmen.
pm path com.example.android.softkeyboard
Die Ausgabe des obigen Befehls sieht folgendermaßen aus:
Paket: /data/app/SoftKeyboard/SoftKeyboard.apk
Nachdem Sie den Pfad kennen, können Sie die Shell beenden und die APK mit dem Befehl auf Ihren Computer übertragen Adb ziehen
Befehl. Der folgende Befehl überträgt ihn an Ihren Computer / tmp Verzeichnis:
adb pull /data/app/SoftKeyboard/SoftKeyboard.apk / tmp
In diesem Lernprogramm haben Sie bereits erfahren, dass ein APK nur eine komprimierte Archivdatei ist. Das bedeutet, dass Sie den Standard-Archivmanager Ihres Betriebssystems verwenden können, um dessen Inhalt zu extrahieren. Wenn Sie Windows verwenden, müssen Sie möglicherweise zuerst die Erweiterung der Datei ändern .apk zu .Postleitzahl. Nach dem Extrahieren des Inhalts des APK sollten Sie die Dateien im APK sehen können.
Wenn Sie ein App-Entwickler sind, sollten viele Dateien im APK bekannt sein. Abgesehen von den Bildern in der res In diesem Ordner befinden sich die Dateien in einem Format, mit dem Sie ohne Hilfe einiger Werkzeuge nicht arbeiten können.
Das Android SDK enthält alle Tools, die Sie zum Analysieren des Inhalts eines APK benötigen. Sie haben das früher gelernt aapt
Wird verwendet, um XML-Ressourcen während des Erstellungsprozesses zu packen. Es kann auch verwendet werden, um viele Informationen aus einer APK zu lesen.
Beispielsweise können Sie es verwenden Dump xmltree
Option zum Lesen des Inhalts einer beliebigen binären XML-Datei im APK. So lesen Sie eine Layout-Datei namens res / layout / input.xml:
aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml
Die Ausgabe sollte ungefähr so aussehen:
N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (line = 21) A: android: id (0x010100d0) = @ 0x7f080000 A: android: layout_width (0x010100f4) = (Typ 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (typ 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (typ 0x12) 0xffffffff
Es ist kein XML, aber dank Einrückung und Beschriftungen wie N für den Namensraum, E für Element und EIN Für Attribut sollten Sie es lesen können.
Im vorherigen Schritt haben Sie gesehen, dass das entschlüsselte XML anstelle von Zeichenfolgen Hexadezimalzahlen enthält. Diese Zahlen sind Verweise auf Zeichenfolgen in einer Datei resources.arsc, welche die Ressourcentabelle der App darstellt.
Du kannst den ... benutzen Dump-Ressourcen
Option von aapt
um die Ressourcentabelle anzuzeigen. Hier ist wie:
aapt dump --values resources /tmp/SoftKeyboard.apk
Aus der Ausgabe des Befehls können Sie die genauen Werte der in der App verwendeten Zeichenfolgen ermitteln. Hier ist der Eintrag für eine der Hexadezimalzahlen im XML:
Ressource 0x7f080000 com.example.android.softkeyboard: id / keyboard: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)
Die wichtigste Datei in der APK ist classes.dex. Dies ist die Datei, die von der Android-Laufzeitumgebung beim Ausführen der App verwendet wird. Es enthält den Dalvik-Bytecode, der während des Erstellungsprozesses generiert wurde.
Durch das Zerlegen dieser Datei erhalten Sie Informationen zu den in der App verwendeten Java-Klassen. Dazu können Sie ein Werkzeug namens verwenden Dexdump. Mit dem folgenden Befehl können Sie die Ausgabe von umleiten Dexdump
in eine Datei, die mit einem beliebigen Texteditor geöffnet werden kann.
dexdump -d /tmp/classes.dex> /tmp/classes.dasm
Wenn du öffnest classes.dasm, Sie werden sehen, dass es hunderte Zeilen niedrigen Codes gibt, die folgendermaßen aussehen:
Es ist unnötig zu sagen, dass es sehr schwer ist, es zu verstehen. Zum Glück können Sie das Ausgabeformat von ändern Dexdump
in XML mit der -l
Möglichkeit. Mit dem folgenden Befehl können Sie die Ausgabe in eine Datei umleiten, die Sie in einem Browser öffnen können.
dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml
Im XML-Format stehen weniger Informationen zur Verfügung, aber Sie erhalten einen guten Eindruck von den Java-Klassen, -Methoden und -Feldern der App.
In diesem Lernprogramm haben Sie erfahren, wie ein APK erstellt wird und was es enthält. Sie haben auch gelernt, wie Sie mit den im Android SDK verfügbaren Tools den Inhalt von APK-Dateien entschlüsseln können. Es gibt nicht viele Dokumentationen zu diesen Tools. Da sie jedoch Open Source sind, können Sie den ausführlich kommentierten Quellcode lesen, um mehr über sie zu erfahren.
Wenn Sie nach etwas suchen, mit dem Sie einfacher arbeiten können, können Sie beliebte Drittanbieter-Tools wie dex2jar verwenden, die besser lesbaren disassemblierten Code erzeugen, oder JADX, einen Decompiler, der Java-Code generieren kann.