
Ein Android-Malware-Analysewerkzeug, das umfassende Laufzeitprofile erstellt, indem es sich in das Anwendungsverhalten in den Bereichen Kryptografie, Dateisysteme, Datenbanken, Netzwerkkommunikation und Prozessoperationen einklinkt.
Android Binary API Tracer
Dexray Intercept ist Teil der dynamischen Sandbox Sandroid. Sein Zweck ist es, Laufzeitprofile zu erstellen, um das Verhalten einer Android-Anwendung zu verfolgen. Dies wird unter Verwendung von frida bewerkstelligt.
Installiere es einfach mit pip:
python3 -m pip install dexray-intercept
Dadurch wird Dexray Intercept als Kommandozeilenwerkzeug ammm oder dexray-intercept installiert.
Darüber hinaus wird ein Paket dexray_intercept bereitgestellt. Mehr zur Verwendung des Pakets weiter unten.
Stelle sicher, dass dein Android-Gerät gerootet ist. Der frida-server wird automatisch in der neuesten Version installiert. Danach kannst du Dexray Intercept verwenden, indem du einfach den folgenden Befehl aufrufst:
dexray-intercept <target app>
# oder unter Verwendung des alten Namens:
ammm <target app>
Alle Hooks sind standardmäßig deaktiviert für optimale Leistung. Aktiviere Hooks basierend auf deinen Analyseanforderungen:
# Bestimmte Hooks aktivieren
dexray-intercept --enable-aes <app_name> # AES-Krypto-Hooks aktivieren
dexray-intercept --enable-web <app_name> # Web/HTTP-Hooks aktivieren
dexray-intercept --enable-aes --enable-web <app_name> # Mehrere Hooks aktivieren
# Hook-Gruppen aktivieren
dexray-intercept --hooks-crypto <app_name> # Alle Krypto-Hooks aktivieren
dexray-intercept --hooks-network <app_name> # Alle Netzwerk-Hooks aktivieren
dexray-intercept --hooks-filesystem <app_name> # Alle Dateisystem-Hooks aktivieren
# Alle Hooks aktivieren (Leistungsauswirkung)
dexray-intercept --hooks-all <app_name> # Alle verfügbaren Hooks aktivieren
# Paketbezeichner anstelle des App-Namens verwenden
dexray-intercept -s com.example.package --hooks-crypto
--hooks-crypto (AES, Kodierungen, Keystore, Zertifikate)--hooks-network (HTTP, Sockets, SSL/TLS)--hooks-filesystem (Dateioperationen, Datenbanken, Shared Preferences)--hooks-ipc (Intents, Broadcasts, Binder, Shared Preferences)--hooks-process (DEX-Unpacking, native Bibliotheken, Laufzeit)--hooks-services (Kamera, Standort, Telefonie, Bluetooth)Hier ein Beispiel zur Überwachung der Chrome-App auf unserem 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
Installiere Dexray Intercept als Paket und verwende die neue modulare Architektur:
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()
Aktiviere bestimmte Hook-Gruppen basierend auf deinen Analyseanforderungen:
# 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
Die alte API ist weiterhin für Abwärtskompatibilität verfügbar:
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
Um es als Paket in Sandroid auszuführen, stelle sicher, dass du auch den JobManager von AndroidFridaManager installiert hast. Dies ermöglicht das Ausführen mehrerer frida-Sitzungen in verschiedenen Threads.
Alles, was du tun musst, ist den folgenden Code auszuführen:
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()
Stelle sicher, dass kein anderer Teil deines Codes versucht, sich mit dem frida-Server zu verbinden (keine andere frida-Sitzung).
Um dies zu testen, kannst du das folgende Beispiel ausprobieren: catelites_2018_01_19.apk. Der Name für das Paket ist net.classwindexampleyear.bookseapiececountry. Stelle sicher, dass dein AVD auf Android 9 läuft, damit das Beispiel seinen gesamten bösartigen Code ausführen kann. Du kannst dieses Beispiel einfach mit adb install samples/unpacking/catelites_2018_01_19.apk installieren.
Um dieses Projekt zu kompilieren, stelle sicher, dass npm und frida-compile auf deinem System laufen und in deinem Pfad installiert sind. Seit frida Version 17.0 wird frida-compile über pip install frida-tools installiert.
Dann rufe einfach den folgenden Befehl auf, um den neuesten frida-Agenten zu kompilieren:
$ 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
Dies stellt sicher, dass die neuesten frida-Skripte/Hooks in dexray-intercept verwendet werden.
Um Anpassungen im Python-Code vorzunehmen, wird empfohlen, dexray-intercept mit pip im editierbaren Modus zu installieren:
python3 -m pip install -e .
Auf diese Weise werden lokale Änderungen im Python-Code übernommen, ohne eine neue Version des Pakets zu erstellen.
Eine umfassende Dokumentation ist verfügbar, die Installation, Verwendung, API-Referenz und Entwicklung abdeckt:
Durch einfaches Aufrufen des folgenden Befehls in diesem Verzeichnis sollte die setup.py verwendet werden, um dexray-intercept als lokales Python-Paket auf deinem System zu installieren:
python3 -m pip install .
Um die TypeScript-frida-Hooks zu kompilieren, benötigen wir das frida-compile-Projekt (Link). Dieses wird mit frida-tools gebündelt.
python3 -m pip install frida-tools
Darüber hinaus benötigen wir auch Unterstützung für frida-java-bridge und die internen frida-Typen:
npm install frida-java-bridge@latest --save
npm install --save-dev @types/frida-gum@latest
Beim Unpacking können Anwendungen DexCode—das zuvor auf verschiedene Speicherblöcke verwies—in eine DexFile laden, die den ausgeführten Code repräsentiert. Beispielsweise können einige Anwendungen Anweisungen unmittelbar vor der Ausführung wiederherstellen. In solchen Fällen ist Sandroid nicht in der Lage, die Anweisungen zurück in die DexFile zu überführen. Weitere Forschung ist erforderlich, um dieses Problem zu lösen.
Dexray Intercept baut auf der hervorragenden Arbeit verschiedener Open-Source-Projekte und Forscher in der Android-Sicherheits- und dynamischen Analyse-Community auf. Wir möchten die folgenden Projekte anerkennen, die unsere Implementierung inspiriert oder dazu beigetragen haben:
Wir danken diesen Projekten und ihren Maintainern für die Weiterentwicklung des Stands der Android-Sicherheitsanalyse und dafür, dass sie ihre Arbeit der Community zur Verfügung stellen.