
Le framework d'instrumentation binaire Redexer pour le bytecode Dalvik
Redexer est un outil de réingénierie qui manipule les binaires d'applications Android. Cet outil peut analyser un fichier DEX en une structure de données en mémoire ; identifier avec quels paramètres l'application utilise certaines permissions (nous appelons cette fonctionnalité RefineDroid) ; modifier et désanalyser cette structure de données pour produire un fichier DEX de sortie (nous appelons ces fonctionnalités Dr. Android, pour Dalvik Rewriting for Android).
Cet outil est testé sous OCaml 4.09.0 et Ruby 1.8.6(7), vous devez donc les installer (ou des versions supérieures).
Pour manipuler une signature SHA-1 (hash) au format DEX, nous utilisons la bibliothèque OCaml SHA via ocamlfind/findlib, un gestionnaire de bibliothèques OCaml. Le moyen le plus simple d'installer les deux est d'utiliser OPAM, un gestionnaire de paquets OCaml, qui propose les deux paquets---OPAM ocamlfind et OPAM sha.
Vous pouvez également compiler et/ou installer les deux paquets directement. Si vous utilisez une machine Linux, vous pouvez facilement trouver des distributions.
Sinon, par exemple sur Mac, vous devez les compiler vous-même.
Vous trouverez les codes sources originaux ici.
Compilez-les en exécutant make, puis liez le répertoire résultant dans le répertoire racine site-lib d'ocamlfind ; ou sudo make install.
Si vous utilisez un PC, vous devez d'abord installer ocamlfind/findlib et FlexDLL. Assurez-vous que vos variables d'environnement sont correctement définies comme suit :
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
Paquets OPAM :
SDK Android (ou sources)
Pour décompresser et recompresser les fichiers apk, nous utilisons apktool, un outil open source de
réingénierie APK. Comme il utilise aapt, l'outil de packaging des ressources Android,
vous devez installer le SDK Android ou les sources. De plus, nous utilisons
zipalign, qui vient également du SDK Android, pour optimiser les applications réécrites.
Vous pouvez définir les chemins vers les outils Android de base en ajoutant les éléments suivants à votre profil :
ANDROID_HOME=$HOME/android-sdk # votre propre chemin ici !
export ANDROID_HOME
PATH=$PATH:$ANDROID_HOME/tools
PATH=$PATH:$ANDROID_HOME/platform-tools
PATH=$PATH:$ANDROID_HOME/build-tools/19.0.0 # numéro de version installée
export PATH
Les scripts principaux sont écrits en Ruby et nécessitent RubyGems, un gestionnaire de paquets Ruby, et Nokogiri, une bibliothèque XML pour manipuler les fichiers manifestes.
Si vous souhaitez voir des graphes (graphe d'appels, graphe de flot de contrôle, arbre de dominance, etc.), vous devez installer graphviz dot.
Pour compiler redexer, faites simplement make ! Vous pouvez voir le binaire redexer à la racine.
$ make (clean)
Avant d'utiliser l'outil, l'installation du fichier de plateforme le plus récent pour apktool incombe à l'utilisateur. Par exemple, vous devez faire
$ java -jar tools/apktool.jar if [fichier de plateforme approprié]
Vous pouvez également générer des documents API au format html.
$ make api
Vous pouvez voir toutes les options offertes par l'outil :
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
Comme dexdump dans le SDK Android, redexer vous permet de visualiser l'intérieur du fichier dex donné au format YAML.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
Cette option affiche les instructions pour une méthode spécifiée.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
Cette fonctionnalité permet de tester les modules d'analyse et de désanalyse de redexer. Elle génère probablement un fichier dex identique.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
Vous pouvez également voir des statistiques de base sur le fichier dex, par ex. # instr.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
Cette option affiche tous les noms de classes définis dans le fichier dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
Cela peut être utile pour rechercher des bibliothèques tierces spécifiques, par ex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
Cette option affiche l'utilisation de l'API dans le fichier dex.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
N'êtes-vous pas curieux de savoir à quel point certains opcodes sont rarement utilisés dans les bytecodes Dalvik ? Cela vous montrera l'histogramme de tous les opcodes, ou vous pouvez consulter la fréquence d'utilisation d'un opcode précis dans l'application donnée.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
Par exemple,
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat --op div-int/lit16,nop
Cette option effectue une analyse de résolution d'intent basée sur la propagation, et affiche les transitions entre les classes Activity.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
Cette option génère un fichier pdf représentant un graphe d'appels du fichier donné. Si vous ne spécifiez pas le nom pdf, cg.pdf sera utilisé.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
Cette option génère un fichier pdf qui montre un graphe de flot de contrôle de la méthode donnée. Ajoutez un nom de méthode à un nom de classe avec un point : class_name.method_name
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Cette option est similaire à la fonctionnalité ci-dessus, sauf qu'elle représente l'arbre de dominance (post).
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Cette option effectue une analyse classique de flux de données arrière.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
Cette option effectue une analyse classique de flux de données avant.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd