
Un outil d'analyse de logiciels malveillants Android qui crée des profils d'exécution complets en s'accrochant au comportement des applications à travers la cryptographie, les systèmes de fichiers, les bases de données, les communications réseau et les opérations de processus.
Traceur d'API de binaires Android
Dexray Intercept fait partie du bac à sable dynamique Sandroid. Son objectif est de créer des profils d'exécution pour suivre le comportement d'une application Android. Cela est réalisé en utilisant frida.
Il suffit de l'installer avec pip :
python3 -m pip install dexray-intercept
Cela installera Dexray Intercept en tant qu'outil en ligne de commande ammm ou dexray-intercept.
De plus, cela fournira un paquet dexray_intercept. Plus d'informations sur l'utilisation du paquet ci-dessous.
Assurez-vous que votre appareil Android est rooté. Le frida-server sera installé automatiquement dans sa dernière version. Vous pouvez ensuite utiliser Dexray Intercept en invoquant simplement la commande suivante :
dexray-intercept <target app>
# ou en utilisant son ancien nom :
ammm <target app>
Tous les hooks sont désactivés par défaut pour des performances optimales. Activez les hooks en fonction de vos besoins d'analyse :
# Activer des hooks spécifiques
dexray-intercept --enable-aes <app_name> # Activer les hooks de cryptographie AES
dexray-intercept --enable-web <app_name> # Activer les hooks web/HTTP
dexray-intercept --enable-aes --enable-web <app_name> # Activer plusieurs hooks
# Activer des groupes de hooks
dexray-intercept --hooks-crypto <app_name> # Activer tous les hooks de cryptographie
dexray-intercept --hooks-network <app_name> # Activer tous les hooks réseau
dexray-intercept --hooks-filesystem <app_name> # Activer tous les hooks du système de fichiers
# Activer tous les hooks (impact sur les performances)
dexray-intercept --hooks-all <app_name> # Activer tous les hooks disponibles
# Utiliser l'identifiant du paquet au lieu du nom de l'application
dexray-intercept -s com.example.package --hooks-crypto
--hooks-crypto (AES, encodages, keystore, certificats)--hooks-network (HTTP, sockets, SSL/TLS)--hooks-filesystem (opérations sur les fichiers, bases de données, préférences partagées)--hooks-ipc (intents, broadcasts, binder, préférences partagées)--hooks-process (dépaquetage DEX, bibliothèques natives, runtime)--hooks-services (caméra, localisation, téléphonie, bluetooth)Voici un exemple de surveillance de l'application chrome sur notre AVD :
dexray-intercept Chrome
Dexray Intercept
⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠙⢷⣤⣤⣴⣶⣶⣦⣤⣤⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠾⠛⢉⣉⣉⣉⡉⠛⠷⣦⣄⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠋⣠⣴⣿⣿⣿⣿⣿⡿⣿⣶⣌⠹⣷⡀⠀⠀
⠀⠀⠀⠀⣼⣿⣿⣉⣹⣿⣿⣿⣿⣏⣉⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠁⣴⣿⣿⣿⣿⣿⣿⣿⣿⣆⠉⠻⣧⠘⣷⠀⠀
⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⡇⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠈⠀⢹⡇⠀
⣠⣄⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⣠⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⢸⣿⠛⣿⣿⣿⣿⣿⣿⡿⠃⠀⠀⠀⠀⢸⡇⠀
⣿⣿⡇⢸⣿⣿⣿Sandroid⣿⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣷⠀⢿⡆⠈⠛⠻⠟⠛⠉⠀⠀⠀⠀⠀⠀⣾⠃⠀
⣿⣿⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣧⡀⠻⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠃⠀⠀
⣿⣿⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢼⠿⣦⣄⠀⠀⠀⠀⠀⠀⠀⣀⣴⠟⠁⠀⠀⠀
⣿⣿⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣦⠀⠀⠈⠉⠛⠓⠲⠶⠖⠚⠋⠉⠀⠀⠀⠀⠀⠀
⠻⠟⠁⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠈⠻⠟⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠉⠉⣿⣿⣿⡏⠉⠉⢹⣿⣿⣿⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣿⣿⣿⡇⠀⠀⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⢀⣄⠈⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠈⠉⠉⠀⠀⠀⠀⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
[*] starting app profiling
[*] press Ctrl+C to stop the profiling ...
[*] Filesystem profiling informations:
[*] [Libc::read] Read FD (anon_inode:[eventfd],0x7ac6b67540,8)
[*] Filesystem profiling informations:
[*] [Libc::read] Read FD (anon_inode:[eventfd],0x7fcb41c990,8
Installez Dexray Intercept en tant que paquet et utilisez la nouvelle architecture modulaire :
from dexray_intercept import AppProfiler, setup_frida_device
from dexray_intercept.services.hook_manager import HookManager
# Connect to device and get process
device = setup_frida_device()
process = device.attach("com.example.app")
# Configure hooks (all disabled by default for performance)
hook_config = {
'aes_hooks': True,
'web_hooks': True,
'file_system_hooks': True,
'keystore_hooks': True
}
# Create profiler with new architecture
profiler = AppProfiler(
process,
verbose_mode=True,
output_format="JSON",
hook_config=hook_config,
enable_stacktrace=True
)
# Start profiling
script = profiler.start_profiling()
# ... let app run and collect data ...
# Get results
profile_data = profiler.get_profile_data()
json_output = profiler.get_profiling_log_as_json()
# Runtime hook management
profiler.enable_hook('socket_hooks', True) # Enable more hooks at runtime
enabled_hooks = profiler.get_enabled_hooks() # Check what's enabled
# Stop profiling
profiler.stop_profiling()
Activez des groupes de hooks spécifiques en fonction de vos besoins d'analyse :
# Crypto hooks
hook_config = {
'aes_hooks': True,
'encodings_hooks': True,
'keystore_hooks': True
}
# Network hooks
hook_config = {
'web_hooks': True,
'socket_hooks': True
}
# File system hooks
hook_config = {
'file_system_hooks': True,
'database_hooks': True
}
# Enable all hooks (performance impact)
profiler.enable_all_hooks()
# Enable hook groups
profiler.enable_hook_group('crypto') # Enable all crypto-related hooks
L'ancienne API est toujours disponible pour la compatibilité ascendante :
from dexray_intercept import AppProfilerLegacy
# OR use environment variable: DEXRAY_FORCE_OLD_ARCH=true
profiler = AppProfilerLegacy(process_session, verbose=True, output_format="CMD",
base_path=None, deactivate_unlink=False)
profiler.instrument() # Old method name
# ...
profiler.finish_app_profiling() # Old method name
Afin de l'exécuter en tant que paquet dans Sandroid, assurez-vous d'avoir également installé le JobManager depuis AndroidFridaManager. Cela permet d'exécuter plusieurs sessions frida dans différents threads.
Tout ce que vous avez à faire est d'exécuter le code suivant :
from AndroidFridaManager import JobManager
from dexray_intercept import AppProfiler
job_manager = JobManager()
app_package = "net.classwindexampleyear.bookseapiececountry"
profiler = AppProfiler(job_manager.process_session, True, output_format="JSON", base_path=None, deactivate_unlink=False)
frida_script_path = profiler.get_frida_script()
job_manager.setup_frida_session(app_package, profiler.on_appProfiling_message)
job = job_manager.start_job(frida_script_path, custom_hooking_handler_name=profiler.on_appProfiling_message)
# close only the job and the frida session keeps active to run other frida scripts
# job_manager.stop_job_with_id(job.job_id)
job_manager.stop_app_with_closing_frida(app_package) # stops the frida session and the app and all frida jobs
profiler.write_profiling_log() # write the log data to profile.json
# instead of writing it to a file the JSON output will just be returned
# profiler.get_profiling_log_as_JSON()
Assurez-vous qu'aucune autre partie de votre code n'essaie de se connecter au serveur frida (aucune autre session frida).
Pour tester cela, vous pouvez essayer l'échantillon suivant : catelites_2018_01_19.apk. Le nom du paquet est net.classwindexampleyear.bookseapiececountry. Assurez-vous que votre AVD fonctionne sous Android 9, afin que l'échantillon puisse exécuter l'intégralité de son code malveillant. Vous pouvez installer cet échantillon simplement avec adb install samples/unpacking/catelites_2018_01_19.apk.
Afin de compiler ce projet, assurez-vous que npm et frida-compile sont en cours d'exécution sur votre système et installés dans votre PATH. Depuis la version 17.0 de frida, frida-compile s'installe via pip install frida-tools.
Ensuite, invoquez simplement la commande suivante pour obtenir la dernière version compilée de l'agent frida :
$ cd <AppProfiling-Project>
> Dexray [email protected] build
> frida-compile agent/hooking_profile_loader.ts -o src/dexray_intercept/profiling.js
$ npm install frida-java-bridge@latest --save
$ npm install --save-dev @types/frida-gum@latest
> Dexray [email protected] prepare
> npm run build
up to date, audited 75 packages in 6s
19 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
Cela garantit que les derniers scripts/hooks frida sont utilisés dans dexray-intercept.
Afin d'effectuer des ajustements dans le code Python, il est recommandé d'installer dexray-intercept avec pip en utilisant le mode éditable :
python3 -m pip install -e .
De cette façon, les modifications locales dans le code Python sont prises en compte sans créer une nouvelle version du paquet.
Une documentation complète est disponible couvrant l'installation, l'utilisation, la référence API et le développement :
En invoquant simplement la commande suivante dans ce répertoire, le setup.py devrait être utilisé pour installer dexray-intercept en tant que paquet Python local sur votre système :
python3 -m pip install .
Afin de compiler les hooks frida TypeScript, nous avons besoin du projet frida-compile (lien). Celui-ci sera fourni avec frida-tools.
python3 -m pip install frida-tools
En plus de cela, nous avons également besoin du support de frida-java-bridge et des types frida internes :
npm install frida-java-bridge@latest --save
npm install --save-dev @types/frida-gum@latest
Lors du dépaquetage, les applications peuvent charger du DexCode — précédemment pointé vers des blocs mémoire distincts — dans un DexFile, qui représente le code en cours d'exécution. Par exemple, certaines applications peuvent restaurer des instructions immédiatement avant leur exécution. Dans de tels cas, Sandroid est incapable de rétablir les instructions dans le DexFile. Des recherches supplémentaires sont nécessaires pour résoudre ce problème.
Dexray Intercept s'appuie sur l'excellent travail de divers projets open source et chercheurs de la communauté de la sécurité Android et de l'analyse dynamique. Nous souhaitons remercier les projets suivants qui ont inspiré ou contribué à notre implémentation :
Nous exprimons notre gratitude à ces projets et à leurs mainteneurs pour avoir fait progresser l'état de l'analyse de sécurité Android et avoir mis leur travail à la disposition de la communauté.