
Un outil pour automatiser les interactions avec les appareils Android - y compris la BAD, Androguard et l'interactivité Frida.
Autodroid est un outil Python pour scripter programmatique des interactions en vrac avec un ou plusieurs appareils Android. Les utilisations possibles incluent:
Pour utiliser Autodroid, vous devrez installer les dépendances, ceux-ci sont spécifiés dans le fichier exigences et peuvent être installés en suivant la commande ci-dessous.
pip install -r REQUIREMENTS.txtAutoDoid doit être fourni un fichier de configuration JSON valide en tant qu'argument de ligne de commande. Ce qui est ci-dessous montre un exemple de fichier de configuration simple qui récupérera toutes les applications de tous les périphériques connectés un à la fois et extraire les APK en ZIP à l'aide d'Androguard.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Une fois que vous avez créé un fichier de configuration Autodroid valide, vous pouvez commencer l'interaction de l'appareil en exécutant le fichier AutoDroid.py Python avec le fichier de configuration comme paramètre de ligne de commande.
python AutoDroid.py example_config.json Le fichier de configuration AutoDoid peut être fourni avec une série de commandes à exécuter sur les périphériques cibles, ces commandes sont exécutées localement sur votre machine et donc les programmes et fichiers appelés doivent être présents. Ces commandes peuvent être dans un format de liste (comme on peut le voir dans l'exemple ci-dessus) ou en tant que carte / dict de la paire de valeurs de clé. Ces paires de valeurs de clé sont définies comme des blocs de commandes, où la clé est le nom du bloc et la valeur est une liste de commandes. Le block:<block name> peut être utilisé pour exécuter un bloc et fournit une fonction de boucle / rappel simple. Un exemple d'utilisation des blocs peut être vu ci-dessous.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"test_user_input" :[ " adb -s !device_id shell monkey -v 5 -p !app_id " ],
"retrieve_apk" :[ " adb -s !device_id pull !app_path !app_id.apk " , " sleep:5 " ]
}
} Deux champs supplémentaires qui contribuent à AutoDoid sont les devices et les champs apps . Ces champs définissent l'ID de périphérique ADB pour le (s) périphérique ciblé (une liste des chaînes) et le nom de notation de domaine inverse de l'application (c'est-à-dire com.example.application ) pour les applications ciblées sur l'appareil (une liste de chaînes). Ces deux champs peuvent être vides, une liste de chaînes, ou définis comme * où tous les appareils et applications disponibles seront ciblés. Dans le backend, la façon dont cela fonctionne est lorsqu'une valeur est fournie dans ces champs, le programme traversera toutes les commandes afin de chaque application sur chaque appareil. Un exemple de spécification d'un appareil et d'une application spécifiques peut être vu ci-dessous:
{
"devices" : [ " 09261JEC216934 " ],
"apps" : [ " com.google.android.networkstack.tethering " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " ]
} Lorsque le champ de périphériques n'est pas vide (c'est-à-dire pas "devices":[], ) Une variable (voir ci-dessous) de !device_id est créée. Cette variable peut être utilisée dans vos commandes pour désigner l'ID de périphérique ADB pour le périphérique ciblé actuel. De même, les variables !app_id , et !app_path sont ajoutées lorsque le champ d'application n'est pas vide et peut être utilisé dans les commandes pour définir le nom de notation du domaine inverse de l'application et le chemin d'accès au fichier APK de cette application.
Pour gagner du temps, AutoDoid permet une quantité infinie de variables à définir dans un script. Ces variables sont construites dans un format de paire de valeur clé. Lorsque la clé d'une variable est située dans une commande, elle sera remplacée pour la valeur. monkey exemple de configuration qui utilise des variables peut être vu ci-dessous, dans ce fichier de configuration, le !test !app_id
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"variables" : { "!test" : " adb -s !device_id shell monkey -v 500 -p " },
"commands" : [ " !test !app_id " ]
} La norme préférée pour l'utilisation de variables est de les précéder avec A ! et d'utiliser _ au lieu d'espaces.
Les variables peuvent être définies au moment de l'exécution en utilisant le ? opérateur. Où l'opérateur suivi d'un nom de variable est défini sur la sortie des commandes suivantes ou si la commande n'a pas de sortie la commande elle-même. Un exemple peut être vu ci-dessous:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}Voici une liste des variables réservées qui sont déjà utilisées dans Autodroid et doivent être évitées en ajoutant à votre fichier de configuration. Si ces variables sont ajoutées, elles seront écrasées au moment de l'exécution.
!device_id - Lorsqu'un ou plusieurs périphériques sont fournis dans la configuration, cette variable est remplie au moment de l'exécution. Et est défini comme ID de périphérique ADB pour le périphérique actuel. Chaque périphérique est en boucle à son tour avec les commandes configurées en cours d'exécution pour chaque périphérique.!adb_connect - Il s'agit d'une variable scolare qui se traduit par adb -s !device_id , en utilisant cela au lieu de adb , assurera que toutes les commandes ADB sont exécutées sur le bon appareil.!app_id - Lorsqu'une ou plusieurs applications sont fournies dans la configuration, cette variable est remplie à l'exécution. Et est défini comme le nom de notation du domaine inverse de l'application (c'est-à-dire com.example.myapplication ) pour l'application actuelle. Chaque application est bouclée à son tour avec les commandes configurées en cours d'exécution pour chaque application.!app_path - similaire à ce qui précède. Lorsqu'une ou plusieurs applications sont fournies dans la configuration, cette variable est remplie à l'exécution. Et est défini comme chemin vers le fichier APK d'application actuel sur le périphérique cible. Chaque application est bouclée à son tour avec les commandes configurées en cours d'exécution pour chaque application. Les constantes sont des commandes spécifiques à Autodroid et se rapportent à des fonctionnalités spécifiques. Normalement décomposé en un mot-clé suivi par A : puis un ou plusieurs paramètres séparés par A ; . Ces constantes doivent être utilisées au début d'une commande et doivent toujours être en minuscules. Des exemples seront donnés dans les sections individuelles.
AutoDRoid a intégré des fonctionnalités pour exécuter les fichiers JavaScript Frida dans le cadre d'une exécution Autodroid. Cette constante est définie comme frida: et doit être fournie le chemin d'accès au fichier JavaScript utilisé, suivi par A ; puis le nom de notation inverse de l'application de l'application est ciblé. En plus d'appliquer des variables à la commande, des variables sont également appliquées au contenu du fichier fourni.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}Remarque Bien que l'intégration de Frida soit mise en œuvre, elle n'est actuellement pas testée.
Autodroïde prend en charge les APK ingénieurs de rétro-ingénierie via Androguard. Cette constante est structurée comme reverse: et prend un chemin vers un APK stocké localement. L'utilisation de cela enregistrera une version non déposée de l'APK comme zip avec le nom <application name>.apk .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Lors de l'utilisation de la constante inverse, le chemin APK peut être suivi par n'importe quel nombre de paramètres (séparés par A ; ), les personnes incluant info (qui enregistreront un fichier JSON des informations de l'application, decompile (qui sauvera le fichier XML manifesté, et le zip décompilé), manifest à l'aide de paramite Ces paramètres peuvent être vus ci-dessous:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"get_app" : [ " adb -s !device_id pull !app_path !app_id.apk " ],
"reverse_app" :[ " reverse: !app_id.apk;info " ,
" reverse: !app_id.apk;manifest;decompile " ]
}
} Cette constante fournit des fonctionnalités simples pour une pause exécution de l'outillage pendant un temps spécifique. Cette constante est structurée comme sleep: suivi de la quantité de secondes à attendre.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " sleep:5 " ]
} La constante de blocs fournit des fonctionnalités de boucle et de rappel simples. Cette constante est structurée en block: suivi du nom du bloc des commandes à exécuter. Si aucun bloc n'a été fourni (des commandes IE ont été fournies dans un format de liste), des commandes sont ajoutées à un bloc appelé main .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"test_user_input" :[ " adb shell monkey -v 5 -p !app_id " ],
"retrieve_apk" :[ " adb pull !app_path !app_id.apk " ],
"test_again" : [ " block: test_user_input " , " sleep:5 " ]
}
}Le mot-clé «Find» suivi d'un chemin vers un APK et une chaîne regex à trouver imprimera à la console le chemin vers l'APK et la chaîne trouvée si elles sont présentes dans un APK. Cela peut être utilisé conjointement avec d'autres commandes pour exécuter les chaînes de recherche dans toutes les applications traitées. Un exemple de cela peut être vu ci-dessous:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " find: !app_id.apk;my_string " ]
} Une autre constante simple. L' print: constante peut être utilisée pour imprimer un message à la console. Un exemple de l'utilisation peut être vu ci-dessous:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " print: device id !device_id, app id !app_id, app path !app_path " ]
} La constante d'écriture permet d'écrire une variable ou une commande dans un fichier. Utilisé avec la chaîne write: suivi du fichier pour écrire, suivi par a ; , puis la commande ou la variable pour écrire dans le fichier.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"get_stats" : [ " ?!stats device id !device_id, app id !app_id, app path !app_path " ],
"write_stats" : [ " write: !device_id-!app_id-stats.txt;!stats " ]
}
} La read: constante reçoit un chemin vers un fichier à lire, suivi par A ; , puis la variable pour enregistrer la sortie. Cette variable peut être une variable nouvellement déclarée ou existante.
{
"devices" : [],
"apps" : [],
"commands" : [ " read:test.txt;!data " , " print: !data " ]
} Similaire à écrire. La constante d'ajout permet à une variable ou à une commande d'être écrite dans un fichier. Utilisé avec l' append: chaîne suivie du fichier pour écrire, suivi par a ; , puis la commande ou la variable pour écrire dans le fichier. Contrairement à l'écriture qui créera ou écrira sur un fichier existant, ajouter ne fera qu'ajouter à un fichier existant. Si le fichier n'existe pas, AutoDRoid se trompera.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " append:test.txt;!app_id !app_path " ]
}Ci-dessous est un exemple d'utilisation d'autodroïde pour tester les logiciels malveillants potentiels sur les appareils Android. Cette configuration installe les logiciels malveillants potentiels, enregistre l'écran, récupère la capture de l'écran et désinstalle l'application.
{
"devices" : [ " * " ],
"apps" : [],
"commands" : {
"record_screen" : [ " adb shell screenrecord /data/local/tmp/test.mp4 --time-limit 120 " ],
"install_eicar" :[ " adb install com.fsecure.eicar.antivirus.test.apk " ],
"user_input" :[ " adb shell monkey -p com.fsecure.eicar.antivirus.test -v 1 " , " sleep: 20 " ],
"uninstall" : [ " adb uninstall com.fsecure.eicar.antivirus.test " ],
"get_video" : [ " adb pull /data/local/tmp/test.mp4 " , " sleep: 20 " , " adb shell rm /data/local/tmp/test.mp4 " ]
}
}Ci-dessous est un exemple de l'utilisation de l'implémentation Autodroïde d'Androguard pour inverser l'ingénierie d'un APK sur un appareil et récupérer un JSON d'informations sur l'application, un résumé décompilé des méthodes, le fichier manifeste XML et un fichier zip non dégraissé de l'APK.
{
"devices" : [ " * " ],
"apps" : [ " me.jamesstevenson.onelist " ],
"commands" : {
"get_app" : [ " adb pull !app_path !app_id.apk " ],
"reverse_app" :[ " reverse: !app_id.apk;info;decompile;manifest;zip " ]
}
}Licence publique générale GNU V3.0