Boîte à outils de démystification Android
Objectif
ADT est un ensemble d'outils d'exécution symbolique basé sur Miasm, conçu pour aider à modéliser le comportement d'applications, rechercher et tester des vulnérabilités de sécurité, et faciliter l'ingénierie inverse de code hostile.
Fonctionnalités
- La possibilité de sauvegarder/restaurer tous les contextes de threads et de processus
- Un fichier de configuration centralisé (encodé en JSON) pour imiter un environnement Android
- Un ordonnanceur pour gérer les mutex, le multi-threading et le multi-processus
- fork()
- pthread_create()
- pthread_mutex_lock/unlock()
- Lectures / écritures de fichiers bloquantes
- Implémentation de Java JNI (java native bridge) qui gère
- Les chaînes de caractères
- Les fichiers et répertoires
- Les tableaux
- Les appels de fonctions
- Les champs de classes
- Un certain nombre d'implémentations diverses
- sscanf()
- mktime()
- crc32, imitant la version C
- les flux C++
- pipes
- fstat() et la structure personnalisée d'Android avec padding pour aarch64
- _system_property_get() de la libc Android
- varargs (fonctionne uniquement dans le scénario général)
- prcrl
Mode d'emploi
Installation
- Installez Miasm à partir de ce fork Miasm. Les correctifs de la branche
experimental implémentent les instructions aaarch64 et fournissent les composants jitter et sandboxing correspondants.
git clone https://github.com/nguigo/miasm.git && cd miasm && git checkout experimental
pip install .
git clone https://github.com/nccgroup/android_demystification_toolbox.git
pip install ./android_demystification_toolbox
Utilisation générale
- À partir du modèle
- Renseignez les exigences mémoire nécessaires dans la fonction
one_time_setup()
- Saisissez vos points d'arrêt personnalisés dans la fonction
breakpoints_setup()
- Laissez la boucle principale gérer les multiples contextes
- Utilisez adt.config pour stocker les informations sur l'environnement Android (voir les exemples pour plus de détails)
- L'exemple NDK peut être exécuté comme démo avec
python3 sample.py libhello-jnicallback.so
Sauvegarde / Restauration des contextes
!! AVERTISSEMENT !!
Les contextes sont sauvegardés et restaurés à l'aide du module pickle,
qui n'est pas sûr avec des données non fiables. Assurez-vous de ne restaurer que des contextes de confiance.
Utilisation
- La fonction d'exemple
save_context_and_dump() peut être utilisée comme rappel (callback) jitter :
jitter.add_breakpoint(<my_address>, save_context_and_dump)
- Le code cherche automatiquement un
context.pkl à restaurer, donc la ligne de commande suivante peut être utilisée :
ln -s context_myaddress.pkl context.pkl
- Au démarrage du script, le contexte sera restauré automatiquement