Comment disséquer une application Android

Il est de notoriété publique que les applications Android sont distribuées sous forme de Paquet d'application Android fichiers, ou fichiers APK pour faire court. Cependant, la plupart des gens considèrent un APK comme une boîte noire et n'ont aucune idée de la façon dont il est créé ou de ce qu'il contient. Même la plupart des développeurs d'applications n'ont qu'une compréhension superficielle de l'anatomie d'un APK. Dans les environnements de développement intégrés, tels qu'Android Studio, il suffit d'un simple clic pour transformer un projet Android en APK..

Dans ce tutoriel, nous allons disséquer une application Android. En d'autres termes, nous allons ouvrir son APK et jeter un coup d'œil sur son contenu. De plus, comme l'APK est un fichier binaire destiné uniquement à être lu par des machines, je vais également vous présenter quelques outils que vous pouvez utiliser pour traduire son contenu en un format plus lisible par l'homme..

Conditions préalables

Pour suivre, il vous faut:

  • la dernière version du SDK Android
  • un appareil ou un émulateur Android fonctionnant sous Android 4.4 ou supérieur

1. Pourquoi regarder à l'intérieur d'un APK?

Beaucoup de gens le font par pure curiosité. D'autres ont la possibilité d'accéder directement aux images, aux sons et aux autres éléments de leurs jeux ou applications préférés. Il y a cependant des raisons plus importantes pour lesquelles vous voudriez regarder à l'intérieur d'un APK.

Apprentissage

Si vous venez tout juste d'apprendre le développement d'applications Android, vous pouvez en apprendre beaucoup en consultant à l'intérieur des fichiers APK des applications populaires ou des applications créées par des professionnels. Par exemple, en examinant les fichiers de présentation XML d'une application qui convient à plusieurs tailles d'écran, vous pouvez améliorer vos compétences en matière de création de présentation..

Sécurité

Les applications téléchargées à partir de sources non fiables peuvent contenir du code malveillant. Si vous êtes déjà un développeur d'applications expérimenté, en désassemblant de telles applications, vous pouvez consulter leur code pour mieux comprendre ce qu'elles font vraiment sous le capot..

2. Comment est créé un APK?

Vous ne pouvez pas apprendre grand chose d’un APK sans une compréhension de base de la façon dont il est créé. En fait, les outils les plus importants utilisés pour disséquer un APK sont également les outils utilisés pour créer un.

Les projets Android sont principalement composés de code source Java, de dispositions XML, de métadonnées XML et d'actifs, tels que des images, des vidéos et des sons. Avant que le système d'exploitation Android puisse utiliser tous ces fichiers, ils doivent être convertis en une forme qu'il comprend. Cette conversion implique de nombreuses tâches intermédiaires, généralement appelées processus de construction Android. Le résultat final du processus de construction est un APK ou Paquet d'application Android.

Dans les projets Android Studio, le plug-in Android pour Gradle gère toutes les tâches intermédiaires du processus de construction..

L’une des premières tâches importantes est la création d’un fichier appelé R.java. C'est le fichier qui permet aux développeurs d'accéder facilement à la présentation du projet et aux ressources pouvant être dessinées dans leur code Java à l'aide de constantes numériques. Pour générer le fichier, un outil appelé aapt, qui est court pour Outil Android Asset Packaging, est utilisé. L'outil convertit également toutes les ressources XML, ainsi que le fichier manifeste du projet, au format binaire..

Tous les fichiers Java, y compris R.java, sont ensuite convertis en fichiers de classe à l’aide du compilateur Java. Comme vous le savez peut-être déjà, les fichiers de classe sont constitués de bytecode, qui peut être interprété par un moteur d'exécution Java. Cependant, Android utilise un type d’exécution spécial appelé Android runtime (ART), optimisé pour les appareils mobiles. Par conséquent, une fois que tous les fichiers de classe ont été générés, un outil appelé dx est utilisé pour traduire le bytecode en Dalvik, un format que l'ART comprend.

Une fois les ressources et les fichiers Java traités, ils sont placés dans un fichier d’archive très similaire à un fichier JAR. Le fichier d'archive est ensuite signé, à l'aide d'une clé privée appartenant au développeur de l'application. Ces deux opérations sont effectuées par le plugin Gradle sans utiliser d’outils externes. Cependant, la clé du développeur est obtenue à partir d'un magasin de clés géré par keytool..

Enfin, quelques optimisations sont apportées au fichier d’archive à l’aide de la zipalign outil pour vous assurer que la mémoire que l'application consomme lors de l'exécution est réduite au minimum. À ce stade, le fichier archive est un fichier APK valide, qui peut être utilisé par le système d'exploitation Android..

3. Analyse du contenu d'un APK

Maintenant que vous comprenez comment les fichiers APK sont créés et utilisés, ouvrons-en un et examinons son contenu. Dans ce tutoriel, nous utilisons l'APK d'une application appelée Exemple de clavier logiciel, qui vient pré-installé sur l'émulateur Android. Toutefois, si vous préférez utiliser un périphérique physique, vous pouvez tout aussi facilement utiliser l'APK de n'importe quelle application que vous avez installée sur celui-ci..

Étape 1: Transférer le fichier APK sur un ordinateur

Pour examiner le contenu de l'APK, vous devez d'abord le transférer de l'émulateur vers votre ordinateur. Avant de le faire, vous devez connaître le nom du package et le chemin absolu de l'APK. Utilisation adb ouvrir une session shell sur votre émulateur.

coquille adb

Une fois que vous voyez l'invite du shell, utilisez le liste de pm commande pour lister les noms de paquet de toutes les applications installées.

liste de colis

Le nom du package de l'application qui nous intéresse est com.example.android.softkeyboard. Vous devriez pouvoir le voir dans la liste. En passant le nom du paquet à la chemin pm commande, vous pouvez déterminer le chemin absolu de l'APK.

pm path com.example.android.softkeyboard

La sortie de la commande ci-dessus ressemble à ceci:

package: /data/app/SoftKeyboard/SoftKeyboard.apk

Maintenant que vous connaissez son chemin, vous pouvez quitter le shell et transférer le fichier APK sur votre ordinateur à l’aide de la touche adb pull commander. La commande ci-dessous le transfère à votre ordinateur. / tmp annuaire:

adb pull /data/app/SoftKeyboard/SoftKeyboard.apk / tmp

Étape 2: Extraction du contenu de l'APK

Plus tôt dans ce didacticiel, vous avez appris qu'un APK n'est rien qu'un fichier d'archive compressé. Cela signifie que vous pouvez utiliser le gestionnaire d'archives par défaut de votre système d'exploitation pour extraire son contenu. Si vous utilisez Windows, vous devrez d’abord modifier l’extension du fichier à partir de .apk à .Zip *: français. Après avoir extrait le contenu de l'APK, vous devriez pouvoir voir les fichiers à l'intérieur de l'APK..

Si vous êtes développeur d'applications, de nombreux fichiers de l'APK devraient vous paraître familiers. Cependant, mis à part les images du res dossier, les fichiers sont dans un format que vous ne pouvez pas travailler sans l'aide de quelques outils.

Étape 3: déchiffrement des fichiers XML binaires

Le SDK Android comprend tous les outils nécessaires pour analyser le contenu d'un APK. Vous avez appris plus tôt que aapt est utilisé pour empaqueter les ressources XML pendant le processus de construction. Il peut également être utilisé pour lire beaucoup d'informations d'un APK.

Par exemple, vous pouvez utiliser ses vider xmltree option pour lire le contenu de n'importe quel fichier XML binaire dans l'APK. Voici comment vous pouvez lire un fichier de mise en page appelé res / layout / input.xml:

aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml

La sortie devrait ressembler à ceci:

N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (ligne = 21) A: android: id (0x010100d0) = @ 0x7f080000 A: android: layout_width (0x010100f4) = (type 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (type 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (type 0x12) 0xffffffff

Ce n'est pas du XML, mais, grâce à l'indentation et aux étiquettes comme N pour l'espace de noms, E pour élément, et UNE pour attribut, vous devriez pouvoir le lire.

Étape 4: déchiffrer des chaînes

Dans l'étape précédente, vous avez vu que le XML déchiffré avait des nombres hexadécimaux au lieu de chaînes. Ces nombres sont des références à des chaînes dans un fichier appelé resources.arsc, qui représente la table de ressources de l'application.

Vous pouvez utiliser le vider les ressources option de aapt pour afficher la table des ressources. Voici comment:

aapt dump --values ​​resources /tmp/SoftKeyboard.apk

À partir du résultat de la commande, vous pouvez déterminer les valeurs exactes des chaînes utilisées dans l'application. Voici l'entrée pour l'un des nombres hexadécimaux dans le XML:

ressource 0x7f080000 com.example.android.softkeyboard: id / clavier: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)

Étape 5: Désassemblage du bytecode de Dalvik

Le fichier le plus important de l'APK est classes.dex. C'est le fichier utilisé par le moteur d'exécution Android lors de l'exécution de l'application. Il contient le bytecode Dalvik généré pendant le processus de construction..

En désassemblant ce fichier, vous pouvez obtenir des informations sur les classes Java utilisées dans l'application. Pour ce faire, vous pouvez utiliser un outil appelé Dexdump. Avec la commande suivante, vous pouvez rediriger la sortie de Dexdump dans un fichier pouvant être ouvert par n'importe quel éditeur de texte.

dexdump -d /tmp/classes.dex> /tmp/classes.dasm

Si vous ouvrez classes.dasm, vous allez voir qu'il a des centaines de lignes de code de bas niveau qui ressemble à ceci:

Inutile de dire qu'il est très difficile de comprendre. Heureusement, vous pouvez changer le format de sortie de Dexdump en XML en utilisant le -l option. Avec la commande suivante, vous pouvez rediriger sa sortie vers un fichier que vous pouvez ouvrir dans un navigateur..

dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml

La quantité d'informations disponibles dans le format XML est moindre, mais cela vous donne une bonne idée des classes, méthodes et champs Java présents dans l'application..

Conclusion

Dans ce tutoriel, vous avez appris comment un fichier APK est créé et ce qu'il contient. Vous avez également appris à utiliser les outils disponibles dans le SDK Android pour déchiffrer le contenu des fichiers APK. Il n’ya pas beaucoup de documentation sur ces outils, mais, comme ils sont open source, vous pouvez essayer de lire leur code source commenté de manière exhaustive pour en savoir plus..

Si vous recherchez quelque chose de plus facile à utiliser, vous pouvez essayer d'utiliser des outils tiers populaires tels que dex2jar, qui génère un code désassemblé plus lisible, ou JADX, un décompilateur pouvant générer du code Java..