
Outil d'analyse préliminaire automatisé pour applications Android qui désassemble les échantillons, extrait les propriétés via une correspondance de motifs configurable, et organise la sortie pour accélérer le rétro-ingénierie et l'analyse de malwares.
DroidLysis est un outil de pré-analyse pour les applications Android : il effectue les tâches répétitives et fastidieuses que nous ferions généralement au début de tout rétro-ingénierie. Il désassemble l'échantillon Android, organise la sortie dans des répertoires, et recherche les points suspects dans le code à examiner. La sortie aide le rétro-ingénieur à accélérer les premières étapes de l'analyse.
DroidLysis peut être utilisé sur des packages Android (apk), des exécutables Dalvik (dex), des fichiers Zip (zip), des fichiers Rar (rar) ou des répertoires de fichiers.
sudo apt-get install default-jre git python3 python3-pip unzip wget libmagic-dev libxml2-dev libxslt-dev
$ mkdir -p ~/softs
$ cd ~/softs
$ wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.9.3.jar
$ wget https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.5.2.jar
$ wget https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip
$ unzip dex-tools-v2.4.zip
$ rm -f dex-tools-v2.4.zip
Installer depuis Git dans un environnement virtuel Python (python3 -m venv, ou environnements virtuels pyenv etc).
$ python3 -m venv venv
$ source ./venv/bin/activate
(venv) $ pip3 install git+https://github.com/cryptax/droidlysis
Alternativement, vous pouvez installer DroidLysis directement depuis PyPi (pip3 install droidlysis).
conf/general.conf. Assurez-vous notamment de changer /home/axelle par vos propres répertoires appropriés.[tools]
apktool = /home/axelle/softs/apktool_2.9.3.jar
baksmali = /home/axelle/softs/baksmali-2.5.2.jar
dex2jar = /home/axelle/softs/dex-tools-v2.4/d2j-dex2jar.sh
keytool = /usr/bin/keytool
...
python3 ./droidlysis3.py --help
Le fichier de configuration est ./conf/general.conf (vous pouvez passer à un autre fichier avec l'option --config).
C'est ici que vous configurez l'emplacement des divers outils externes (par ex. Apktool), le nom des fichiers de motifs
(par défaut ./conf/smali.conf, ./conf/wide.conf, ./conf/arm.conf, ./conf/kit.conf) et le nom du
fichier de base de données (uniquement utilisé si vous spécifiez --enable-sql)
Assurez-vous de spécifier les chemins corrects pour les outils de désassemblage, sinon DroidLysis ne les trouvera pas.
DroidLysis utilise Python 3. Pour le lancer et obtenir les options :
droidlysis --help
Par exemple, testez-le sur l'APK de Signal :
droidlysis --input Signal-website-universal-release-6.26.3.apk --output /tmp --config /PATH/TO/DROIDLYSIS/conf/general.conf

DroidLysis produit :
--output /tmp, l'analyse sera écrite dans /tmp/Signalwebsiteuniversalrelease4.52.4.apk-f3c7d5e38df23925dd0b2fe1f44bfa12bac935a6bc8fe3a485a4436d4487a290.droidlysis.db) contenant les propriétés qu'il a remarquées.Obtenez l'utilisation avec droidlysis --help
L'entrée peut être un fichier ou un répertoire de fichiers à analyser récursivement. DroidLysis sait traiter les packages Android, les exécutables DEX, ODEX et ARM, ZIP, RAR. DroidLysis ne plantera pas sur d'autres types de fichiers (sauf s'il y a un bug...) mais ne pourra pas comprendre le contenu.
Lors du traitement de répertoires de fichiers, il est généralement très utile de déplacer les échantillons traités vers un autre emplacement pour savoir ce qui a été traité. Cela est géré par l'option --movein. De plus, si vous êtes seulement intéressé par les statistiques, vous devriez probablement vider le répertoire de sortie qui contient des informations détaillées pour chaque échantillon : c'est l'option --clearoutput. Si vous souhaitez stocker toutes les statistiques dans une base de données SQL, utilisez --enable-sql (voir ici)
L'analyse de DroidLysis n'inspecte pas les SDK tiers connus par défaut, c'est-à-dire par exemple qu'il ne signalera aucune activité suspecte de leur part. Si vous souhaitez qu'ils soient inspectés, utilisez l'option --no-kit-exception. Cela crée généralement beaucoup plus de propriétés détectées pour l'échantillon, car les SDK (par ex. publicitaires) utilisent beaucoup d'API signalées (obtenir la position GPS, obtenir l'IMEI, obtenir l'IMSI, HTTP POST...).
--output DIR)Ce répertoire contient (le cas échéant) :
AndroidManifest.xml lisiblereslib, ressources assetssmali (et autres)META-INF./unzippedclasses.dex (et autres), et converti en jar : classes-dex2jar.jar, et décompressé dans ./unjarredLes fichiers suivants sont générés par DroidLysis :
autoanalysis.md : liste chaque motif détecté par DroidLysis et où.report.md : identique à ce qui a été affiché sur la consoleSi vous n'avez pas besoin que le répertoire de sortie de l'échantillon soit généré, utilisez l'option --clearoutput.
--import-exodus)$ python3 ./droidlysis3.py --import-exodus --verbose
Processing file: ./droidurl.pyc ...
DEBUG:droidconfig.py:Reading configuration file: './conf/./smali.conf'
DEBUG:droidconfig.py:Reading configuration file: './conf/./wide.conf'
DEBUG:droidconfig.py:Reading configuration file: './conf/./arm.conf'
DEBUG:droidconfig.py:Reading configuration file: '/home/axelle/.cache/droidlysis/./kit.conf'
DEBUG:droidproperties.py:Importing ETIP Exodus trackers from https://etip.exodus-privacy.eu.org/api/trackers/?format=json
DEBUG:connectionpool.py:Starting new HTTPS connection (1): etip.exodus-privacy.eu.org:443
DEBUG:connectionpool.py:https://etip.exodus-privacy.eu.org:443 "GET /api/trackers/?format=json HTTP/1.1" 200 None
DEBUG:droidproperties.py:Appending imported trackers to /home/axelle/.cache/droidlysis/./kit.conf
Les traqueurs d'Exodus qui ne sont pas présents dans votre kit.conf initial sont ajoutés à ~/.cache/droidlysis/kit.conf. Comparez les 2 fichiers et vérifiez quels traqueurs vous souhaitez ajouter.
Si vous souhaitez traiter un répertoire d'échantillons, vous voudrez probablement stocker les propriétés trouvées par DroidLysis dans une base de données, pour analyser et interroger facilement les résultats. Dans ce cas, utilisez l'option --enable-sql. Cela déversera automatiquement tous les résultats dans une base de données nommée droidlysis.db, dans une table nommée samples. Chaque entrée de la table correspond à un échantillon donné. Chaque colonne correspond aux propriétés que DroidLysis suit.
Par exemple, pour récupérer tous les noms de fichier, sommes SHA256 et propriétés smali de la base de données :
sqlite> select sha256, sanitized_basename, smali_properties from samples;
f3c7d5e38df23925dd0b2fe1f44bfa12bac935a6bc8fe3a485a4436d4487a290|Signalwebsiteuniversalrelease4.52.4.apk|{"send_sms": true, "receive_sms": true, "abort_broadcast": true, "call": false, "email": false, "answer_call": false, "end_call": true, "phone_number": false, "intent_chooser": true, "get_accounts": true, "contacts": false, "get_imei": true, "get_external_storage_stage": false, "get_imsi": false, "get_network_operator": false, "get_active_network_info": false, "get_line_number": true, "get_sim_country_iso": true,
...
Ce que DroidLysis détecte peut être configuré et étendu dans les fichiers du répertoire ./conf.
Un motif se compose de :
send_sms. Cela permet de nommer la propriété. Doit être unique dans le fichier .conf.;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage. Dans le fichier smali.conf, cette regexp est appliquée sur le code Smali. Dans ce cas particulier, il y a 3 façons différentes d'envoyer des messages SMS depuis le code : sendTextMessage, sendMultipartTextMessage et sendDataMessage.[send_sms]
pattern=;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage
description=Sending SMS messages
Exodus Privacy maintient une liste de divers SDK qu'il est intéressant d'exclure de notre analyse via conf/kit.conf.
Ajoutez l'option --import_exodus à la ligne de commande droidlysis : cela analysera les traqueurs existants qu'Exodus Privacy connaît et qui ne sont pas encore dans votre kit.conf. Enfin, il ajoutera tous les nouveaux traqueurs à ~/.cache/droidlysis/kit.conf.
Ensuite, vous voudrez peut-être trier votre fichier kit.conf :
import configparser
import collections
import os
config = configparser.ConfigParser({}, collections.OrderedDict)
config.read(os.path.expanduser('~/.cache/droidlysis/kit.conf'))
# Order all sections alphabetically
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0] ))
with open('sorted.conf','w') as f:
config.write(f)
Ce script vous aide à rechercher des méthodes dans l'interface JEB qui contiennent du code correspondant au motif smali et à naviguer facilement vers ces fonctions. Lorsque vous chargez le script et sélectionnez le fichier details.md parmi les fichiers d'analyse droidlysis, une boîte de recherche apparaîtra. Une fois déplacée, vous pouvez facilement rappeler les fenêtres de recherche en utilisant le raccourci d'exécution de script récent.
script/DroidlysisSearch.py