apk-hacking-en
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédente | |||
apk-hacking-en [2014/10/27 12:16] – [Step 2 : Extract decompilated java sources] sebsauvage | apk-hacking-en [2022/02/02 10:14] (Version actuelle) – supprimée sebsauvage | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Hacking Android applications ====== | ||
- | |||
- | <note important> | ||
- | |||
- | ===== Introduction ===== | ||
- | |||
- | I use the term " | ||
- | |||
- | In this page I will explain how to inspect and alter an Android application (.apk files). | ||
- | |||
- | * Have fun understanding how Android applications work and how to alter them (including Dalvik machine code). | ||
- | * Protect our privacy by disabled some features (GPS, etc.) | ||
- | |||
- | //Side note//: English is not my primary language and I apologize in advance for mistakes and clumsiness. | ||
- | ===== Reverse-engineering APK files ===== | ||
- | |||
- | APK is the standard Android application packaging format. Any APK file can be installed on an Android system as long as you have authorized third party application installation in system configuration. APK files are simple ZIP files which contain a certain set of files (descriptive XML files, resources such as images and other files, .dex files containing executable code...) | ||
- | |||
- | Android applications are developed in Java, but compiled for a different virtual machine than the standard JVM. Android uses its own virtual machine named **Dalvik**. Its bytecode is different than the JVM. | ||
- | |||
- | * In standard Java, a **.java** source code is compiled in **.class** file (containing Java bytecode). Class files and other resources are packed into **.jar** files. | ||
- | * With Android, a **.java** source code is compiled in **.dex** file (containing Dalvik bytecode). Dex files and other resources are packed into **.apk** files. | ||
- | |||
- | A specific java code giving //usually// the same bytecode, you can use some tools (like [[https:// | ||
- | |||
- | The same goes for dex files: You cannot recompile resulting java sources. This is not an interesting path to alter Android applications. | ||
- | |||
- | The right way to do it is to directly alter the Dalvik bytecode. | ||
- | |||
- | < | ||
- | |||
- | **PS**: I performed this hack with no preliminary knowledge of Dalvik bytecode. | ||
- | ===== Tools ===== | ||
- | |||
- | Here are the tools we are going to use: | ||
- | |||
- | * [[https:// | ||
- | * [[http:// | ||
- | * [[https:// | ||
- | |||
- | Why: | ||
- | |||
- | * Converting .apk in .jar and running them into JD-GUI will help us to inspect the code: We will get (for most .dex files) the corresponding java source code. This will make code inspection much easier than reading raw Dalvik code. | ||
- | * Once we have spotted the code we want to change, we will use APK-Studio to directly alter the corresponding Dalvik bytecode. | ||
- | |||
- | APK-Studio permet de montrer le code machine Dalvik sous forme de source Smali. Smali est une sorte de langage assembleur qui donne du bytecode Dalvik. Le code Smali n'est pas très difficile à comprendre et se compare facilement au source Java. | ||
- | |||
- | ===== Practical case ===== | ||
- | |||
- | Download the APK file of the application you want to alter, either by copy-pasting the GooglePlay URL in [[http:// | ||
- | |||
- | As an example, we will remove the geolocation of the application [[https:// | ||
- | ==== Step 1 : Convert APK into JAR ==== | ||
- | |||
- | |||
- | < | ||
- | or | ||
- | < | ||
- | |||
- | This will create the file **com.cavo.MonCAAlsace-dex2jar.jar**. | ||
- | |||
- | ==== Step 2 : Extract decompilated java sources ==== | ||
- | |||
- | Run JD-GUI, open the .jar file created in previous step, then go to menu " | ||
- | |||
- | This will create **com.cavo.MonCAAlsace-dex2jar.src.zip**. This files contains all decompiled java sources from the application. | ||
- | |||
- | Notes: | ||
- | |||
- | * Pas de miracle: Ces sources java ne sont pas recompilables. | ||
- | * Certaines classes ou méthodes ne seront pas décompilées (parce-que JAD n'y sera pas parvenu). Dans ce cas, JD-GUI affiche directement le code Dalvik. | ||
- | |||
- | Nous n' | ||
- | |||
- | Dézippez le fichier, ce qui vous permettra ensuite rechercher dans les sources (Je n' | ||
- | |||
- | ==== Étape 3 : Rechercher ce que nous voulons modifier ==== | ||
- | |||
- | Note importante: Un certain pourcentage d' | ||
- | |||
- | Dans notre cas, vous voulons empêcher l' | ||
- | |||
- | Dans le SDK Android, les fonctions GPS sont gérées par le // | ||
- | |||
- | * \com\cavo\MonCAAlsace\Accueil\accueil.java | ||
- | * \com\cavo\MonCAAlsace\Bibliotheques\ARLayout.java | ||
- | * \com\cavo\MonCAAlsace\Quotidien\agences.java | ||
- | * \com\cavo\MonCAAlsace\Quotidien\geoloc_agence.java | ||
- | * \com\cavo\MonCAAlsace\Quotidien\ra_agences.java | ||
- | * \com\flurry\android\monolithic\sdk\impl\in.java | ||
- | |||
- | Prenons en exemple la première, **accueil.java**: | ||
- | |||
- | On trouve l' | ||
- | |||
- | <code java> | ||
- | Global.Tablette = isTablet(this); | ||
- | AppRater.app_launched(getParent()); | ||
- | ((LocationManager)getSystemService(" | ||
- | this.progressDialog = new ProgressDialog(getParent()); | ||
- | this.progressDialog.setCancelable(false); | ||
- | ...</ | ||
- | |||
- | Ils instancient un LocationManager, | ||
- | |||
- | Pour cette classe, il suffit donc de neutraliser cette ligne. Allons-voir dans le source Dalvik. Accrochez-vous à votre caleçon, on plonge. | ||
- | |||
- | ==== Étape 4 : Modifier le code Smali/ | ||
- | |||
- | Lancez **APK-Studio**, | ||
- | * Project name: Entrez ce que vous voulez. Par exemple ' | ||
- | * APK Path: indiquez-lui votre fichier APK. | ||
- | * Project location: Créez un répertoire vide et indiquez-le là. APK-Studio y placera ses fichiers de travail. | ||
- | |||
- | Cliquez sur le bouton " | ||
- | |||
- | Dans APK-Studio, ouvrez '' | ||
- | |||
- | < | ||
- | .super Landroid/ | ||
- | .source " | ||
- | |||
- | # interfaces | ||
- | .implements Landroid/ | ||
- | |||
- | |||
- | # static fields | ||
- | .field private static final ALERT_DIALOG: | ||
- | |||
- | .field public static Actus: | ||
- | |||
- | .field public static Agences: | ||
- | |||
- | ...</ | ||
- | |||
- | Il s'agit de la classe Accueil.java que nous voulons modifier. | ||
- | |||
- | Que fait La ligne qui nous intéresse ? | ||
- | <code java> | ||
- | |||
- | * Elle appelle la fonction getSystemService (en passant la valeur " | ||
- | * Elle caste le résultat en LocationManager. | ||
- | * Elle appelle la méthode requestLocationUpdates en passant les paramètres " | ||
- | |||
- | Voyons si vous vous y retrouvez dans le code Dalvik correspondant: | ||
- | < | ||
- | const-string v5, " | ||
- | move-object/ | ||
- | invoke-virtual {v0, v5}, Lcom/ | ||
- | move-result-object v2 | ||
- | check-cast v2, Landroid/ | ||
- | | ||
- | .line 147 | ||
- | .local v2, " | ||
- | const-string v3, " | ||
- | const-wide/ | ||
- | const/4 v6, 0x0 | ||
- | move-object/ | ||
- | invoke-virtual/ | ||
- | </ | ||
- | |||
- | Pas si compliqué, hein ? | ||
- | |||
- | Vous pouvez voir, dans la section '' | ||
- | |||
- | * Dalvik utilise des registres (v0, | ||
- | * p1,p2,p3... sont les paramètres passés à la méthode. | ||
- | * Les constantes sont signalées simplement avec leur type et leur valeur. | ||
- | * Les appels de méthode sont invoke-* | ||
- | * Les variables locales déclarées avec .local | ||
- | * etc. | ||
- | * Je ne vais pas rappeler ici l' | ||
- | |||
- | Note: Vous ne devez pas supprimer les directives '' | ||
- | |||
- | Pour annuler complètement la ligne, on va effectuer une opération classique: la ' | ||
- | |||
- | Le code devient: | ||
- | < | ||
- | nop | ||
- | |||
- | .line 147 | ||
- | nop</ | ||
- | | ||
- | (Ne touchez pas ce qu'il y a avant '' | ||
- | |||
- | Il va nous falloir trouver tous les autres appels au LocationManager et les neutraliser. | ||
- | |||
- | Voici les autres fichiers modifiés: | ||
- | |||
- | * **\CA\smali\com\cavo\MonCAAlsace\Bibliotheques\ARLayout.smali**: | ||
- | |||
- | < | ||
- | iget-object v0, p0, Lcom/ | ||
- | const-string v1, " | ||
- | const-wide/ | ||
- | const/ | ||
- | move-object v5, p0 | ||
- | invoke-virtual/ | ||
- | |||
- | < | ||
- | nop</ | ||
- | |||
- | |||
- | * **\CA\smali\com\cavo\MonCAAlsace\Quotidien\geoloc_agence.smali**: | ||
- | |||
- | < | ||
- | iget-object v0, p0, Lcom/ | ||
- | const-string v1, " | ||
- | const-wide/ | ||
- | const/4 v4, 0x0 | ||
- | move-object v5, p0 | ||
- | invoke-virtual/ | ||
- | </ | ||
- | |||
- | < | ||
- | nop | ||
- | </ | ||
- | |||
- | * **\CA\smali\com\cavo\MonCAAlsace\Quotidien\ra_agences.smali**: | ||
- | |||
- | < | ||
- | sget-object v1, Lcom/ | ||
- | const-string v2, " | ||
- | invoke-virtual {v1, v2}, Landroid/ | ||
- | move-result-object v0 | ||
- | check-cast v0, Landroid/ | ||
- | |||
- | .line 196 | ||
- | .local v0, " | ||
- | const-string v1, " | ||
- | const-wide/ | ||
- | const/4 v4, 0x0 | ||
- | iget-object v5, p0, Lcom/ | ||
- | invoke-virtual/ | ||
- | </ | ||
- | |||
- | < | ||
- | nop | ||
- | |||
- | .line 196 | ||
- | .local v0, " | ||
- | nop | ||
- | </ | ||
- | |||
- | * **\CA\smali\com\flurry\android\monolithic\sdk\impl\in.smali**: | ||
- | |||
- | < | ||
- | invoke-static {p1}, Landroid/ | ||
- | move-result v0 | ||
- | if-nez v0, :cond_0 | ||
- | |||
- | .line 162 | ||
- | iget-object v0, p0, Lcom/ | ||
- | const-wide/ | ||
- | const/4 v4, 0x0 | ||
- | iget-object v5, p0, Lcom/ | ||
- | invoke-static {}, Landroid/ | ||
- | move-result-object v6 | ||
- | move-object v1, p1 | ||
- | invoke-virtual/ | ||
- | </ | ||
- | |||
- | < | ||
- | nop | ||
- | |||
- | .line 162 | ||
- | nop | ||
- | </ | ||
- | |||
- | |||
- | ==== Étape 5: Re-packager l'APK ==== | ||
- | |||
- | Une fois les modifications apportées aux différentes classes dans APK-Studio, rien de plus simple pour générer l'APK correspondant: | ||
- | * Sauvegardez vos modifications: | ||
- | * Re-générez l'APK: Menu Project > Build. | ||
- | |||
- | L' | ||
- | |||
- | Regardez ensuite dans votre répertoire projet / | ||
- | |||
- | Dé-installez l' | ||
- | |||
- | Dans notre cas, le lancement de l' | ||
- | |||
- | ===== Notes ===== | ||
- | |||
- | * Là nous avons neutralisé les appels aux fonctions de géolocalisation car l' | ||
- | * Cette méthode vous obligera à re-faire votre hack à chaque mise à jour de l' | ||
- | * Les choses peuvent être plus compliquées pour les applications qui chargent dynamiquement du code. | ||
- | * L' | ||
- | * Dans notre exemple nous avons juste NOPé le code qui nous embêtait, mais dans certains cas il vous faudra faire des choses plus complexes (renvoyer null directement ('' |
apk-hacking-en.1414412182.txt.gz · Dernière modification : 2014/10/27 12:16 de sebsauvage