Intellidroid est un outil d'analyse pour les applications Android qui extrait les chemins d'appel menant à un comportement spécifique et exécute ces chemins précisément pendant le temps d'exécution. Lorsqu'on lui donne un ensemble de comportements ciblés , le composant d'analyse statique traverse le graphique d'appel de l'application pour trouver des chemins vers ces comportements. Il extrait également les contraintes de chemin, qui sont utilisées pour déterminer les valeurs d'entrée qui peuvent déclencher ces chemins. Le composant dynamique prend les chemins / contraintes extraits et injecte les valeurs d'entrée dans le périphérique Android, déclenchant les comportements ciblés.
Pour plus de détails, veuillez consulter notre papier et nos diapositives (NDSS 2016).
Le «Frameworkanalysis» effectue une analyse statique pour générer des contraintes pour le framework Android. Nous fournissons actuellement les contraintes du cadre de sortie afin qu'elles puissent être ajoutées aux contraintes d'application produites par le composant «Appanalysis».
Le répertoire «Appanalysis» contient le code qui génère des contraintes pour les applications Android.
| Annuaire | Description |
|---|---|
| prétraitement | Scripts pour extraire et prétraiter le fichier APK avant de le passer à l'outil. |
| SRC | Fichiers de code source. |
| lib | Dépendances, y compris les bibliothèques Wala nécessaires. 1 |
| androïde | Fichiers Android Framework compilés (à analyser), à partir de la version 4.4.2_r2 d'AOSP. |
1 Nous avons apporté de légères modifications à la génération de graphiques d'appels de Wala pour améliorer les performances d'Intellidroid. Le code source modifié peut être trouvé ici.
Ce projet utilise le système Gradle Build. Les fichiers de sortie sont situés dans le répertoire build/ . Le script Gradlew est un wrapper pour les machines qui n'ont pas déjà installé Gradle. Si votre machine de développement contient déjà Gradle, vous pouvez utiliser votre propre installation en remplaçant ./gradlew par gradle dans les commandes ci-dessous. Une connexion réseau est requise lors de la compilation du code pour la première fois afin que Gradle puisse télécharger automatiquement les dépendances.
Les fichiers Android Framework inclus dans le répertoire android ont été compilés à l'aide de JDK 1.6, mais l' apktool utilisé dans les scripts de prétraitement nécessite JDK 1.7. Nous vous recommandons d'utiliser JDK 1.7, car cela semble fonctionner le mieux. Si nécessaire, vous pouvez remplacer les fichiers du répertoire android pour essayer différentes versions d'AOSP ou JDK.
Le fichier APK cible à analyser doit d'abord être prétraité à l'aide des scripts dans le dossier preprocess . Le répertoire résultant (contenant le fichier APK et les ressources extraits) peut ensuite être transmis à l'analyse statique.
Les scripts de prétraitement utilisent APKTool et osent extraire le package APK. Vous pouvez utiliser vos propres outils d'extraction, mais vous devrez peut-être modifier le code d'analyse de l'application afin qu'IntelliDroid puisse trouver les fichiers bytecode et manifester pour une application donnée.
./preprocess/PreprocessAPK.sh <APK file>
./preprocess/PreprocessDataset.sh <directory of APK files>
./gradlew build
./IntelliDroidAppAnalysis -o <output directory> <preprocessed app directory>
Pour voir d'autres options de ligne de commande, exécutez:
./IntelliDroidAppAnalysis --help
Le répertoire de sortie est utilisé pour stocker le fichier JSON des informations de l'application et les fichiers de contrainte Z3. S'il n'est pas spécifié, ces fichiers seront stockés dans ./pathOutput . Les fichiers de sortie sont utilisés par l'outil IntelliDroidDynamicClient pour identifier les chemins d'appel et générer les données d'entrée pour déclencher ces chemins.
Les fichiers appInfo.json et constraintX_X.py produits dans le répertoire de sortie sont nécessaires pour le client dynamique, mais ne sont pas très lisibles. L'indicateur -y peut être utilisé pour obtenir une version plus lisible (mais lourde de sortie) des résultats de chemin / contrainte (imprimés en stdout).
Le répertoire «DynamicClient» contient le programme Python qui communique avec le périphérique Android et envoie les entrées qui déclenchent les événements souhaités.
Le programme s'attend à ce qu'un appareil ou un émulateur Android soit connecté au système. Cet appareil doit exécuter le système d'exploitation Android personnalisé contenant IntellidRoidsService (qui interprète les commandes que ce programme envoie et fait l'invocation réelle de l'événement). Le programme DynamicClient se connectera automatiquement à l'appareil via une prise sur le port TCP: 12348. L'outil adb sera utilisé pour configurer la connexion et exécuter certaines commandes, et il doit être accessible depuis PATH (cela peut être fait en ajoutant le répertoire Android SDK Tools à la variable PATH ou en configurant l'environnement de construction AOSP avant d'exécuter le dynamicClient.
De plus, le DynamicClient utilise le solveur de contrainte Z3 via son API Python (Z3-PY). Les instructions pour construire et installer Z3 avec des liaisons Python sont disponibles ici.
Le système d'exploitation Android personnalisé utilisé par Intellidroid est fourni comme une série de fichiers Diff qui peuvent être appliqués à l'arborescence source AOSP de base. Intellidroid est actuellement implémenté pour Android 4.3 (AOSP Branch android-4.3_r1 ). Veuillez vous référer à la documentation AOSP pour des instructions sur la façon de télécharger et de construire Android.
Une fois que vous avez téléchargé et compilé la version AOSP correcte, vous pouvez appliquer les correctifs Intellidroid, situés dans le répertoire androidPatches . Les fichiers patch.sh et unpatch.sh sont fournis pour aider à automatiser ce processus. Après le correctif, reconstruisez AOSP (nous avons constaté que vous devrez peut-être make Twice; Sinon, certains fichiers sur l'émulateur deviennent incohérents). Vous devrez peut-être également exécuter make update-api avec make . Une fois construit, vous pouvez utiliser logcat pour vérifier que la classe IntelliDroidService est démarrée comme un service système lorsque l'appareil est en bottes.
cd androidPatches
./patch.sh <path to AOSP directory>
./IntelliDroidDynamicClient.py
HELP (obtenez la description des commandes)
INSTALL <APK file>
START <directory to app information, generated by IntelliDroidAppAnalysis>
TRIGGER <call path ID to trigger, as specified in appInfo.json>
EXECUTE <command to send to IntelliDroidService> 1
INFO <info requested from IntelliDroidService> 1
CLOSE
KILL
1 Ces commandes sont à des fins de débogage uniquement. Vous ne devriez les utiliser que si vous connaissez les paramètres exacts que IntellidRoidsService attend.
L'intégration avec TaintDroid est assez simple. Pour le composant «Appanalysis», utilisez l'indicateur -t pour spécifier une liste différente de méthodes ciblées (c'est-à-dire le fichier taintdroidTargets.txt fourni fourni).
./IntelliDroidAppAnalysis -t taintdroidTargets.txt <preprocessed app directory>
Côté dynamique, suivez les instructions ici pour télécharger et construire TaintDroid pour Android 4.3. Une fois que vous avez vérifié que votre génération de TaintDroid fonctionne, appliquez les correctifs dans DynamicClient/androidPatches de la même manière que vous le feriez pour AOSP non modifié.
Intellidroid a été initialement développé en tant que projet de thèse de maîtrise par Michelle Wong à l'Université de Toronto, supervisé par le Dr David Lie.
Pour toute demande, veuillez contacter:
Ce qui suit a contribué au code à Intellidroid:
Intellidroid est publié sous la licence MIT.