So lösen Sie eine Android-Anwendung

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.

Voraussetzungen

Um mitzumachen, brauchst du:

  • die neueste Version des Android SDK
  • ein Android-Gerät oder -Emulator, auf dem Android 4.4 oder höher ausgeführt wird

1. Warum in einem APK nachschauen??

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.

Lernen

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.

Sicherheit

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.

2. Wie wird eine APK erstellt??

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.

3. Analysieren des Inhalts eines APK

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.

Schritt 1: Übertragen des APK auf einen Computer

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

Schritt 2: Extrahieren des Inhalts des APK

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.

Schritt 3: Entschlüsseln von binären XML-Dateien

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.

Schritt 4: Zeichenketten entschlüsseln

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)

Schritt 5: Demontage des Dalvik-Bytecodes

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.

Fazit

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.