Intellidroid es una herramienta de análisis para aplicaciones de Android que extrae rutas de llamadas que conducen a un comportamiento específico y ejecuta estas rutas con precisión durante el tiempo de ejecución. Cuando se les da un conjunto de comportamientos específicos , el componente de análisis estático atraviesa el gráfico de llamadas de la aplicación para encontrar rutas a estos comportamientos. También extrae restricciones de ruta, que se utilizan para determinar los valores de entrada que pueden activar estas rutas. El componente dinámico toma las rutas/restricciones extraídas e inyecta los valores de entrada en el dispositivo Android, activando los comportamientos específicos.
Para obtener más detalles, consulte nuestro artículo y diapositivas (NDSS 2016).
El 'FrameWorkanálisis' realiza un análisis estático para generar restricciones para el marco de Android. Actualmente proporcionamos las restricciones del marco de salida para que puedan agregarse a las restricciones de aplicación producidas por el componente 'Appanalysis'.
El directorio 'Appanalysis' contiene el código que genera restricciones para las aplicaciones de Android.
| Directorio | Descripción |
|---|---|
| preproceso | Scripts para extraer y preprocesar el archivo APK antes de pasarlo a la herramienta. |
| SRC | Archivos de código fuente. |
| libraciones | Dependencias, incluidas las bibliotecas Wala necesarias. 1 |
| androide | Los archivos de Android Framework compilados (para ser analizados), a partir de la versión 4.4.2_r2 de AOSP. |
1 Hemos realizado ligeros cambios en la generación de gráficos de llamadas de Wala para mejorar el rendimiento de Intellidroid. El código fuente modificado se puede encontrar aquí.
Este proyecto utiliza el sistema de construcción de Gradle. Los archivos de salida se encuentran en la build/ directorio. El script Gradlew es un envoltorio para máquinas que no tienen Gradle ya instalado. Si su máquina de desarrollo ya contiene Gradle, puede usar su propia instalación reemplazando ./gradlew con gradle en los comandos a continuación. Se requiere una conexión de red al compilar el código por primera vez para que Gradle pueda descargar automáticamente las dependencias.
Los archivos de Android Framework incluidos en el directorio android se compilaron utilizando JDK 1.6, pero el apktool utilizado en los scripts de preprocesamiento requiere JDK 1.7. Recomendamos usar JDK 1.7, ya que parece funcionar mejor. Si es necesario, puede reemplazar los archivos en el directorio android para probar diferentes versiones de AOSP o JDK.
El archivo APK de destino que se analizará primero debe preprocesarse utilizando los scripts en la carpeta preprocess . El directorio resultante (que contiene el archivo APK y los recursos extraídos) se puede pasar al análisis estático.
Los scripts de preprocesamiento usan APKTool y se atreven a extraer el paquete APK. Puede usar sus propias herramientas de extracción, pero es posible que deba modificar el código de análisis de la aplicación para que Intellidroid pueda encontrar los archivos ByTecode y Manifest para una aplicación determinada.
./preprocess/PreprocessAPK.sh <APK file>
./preprocess/PreprocessDataset.sh <directory of APK files>
./gradlew build
./IntelliDroidAppAnalysis -o <output directory> <preprocessed app directory>
Para ver otras opciones de línea de comandos, ejecute:
./IntelliDroidAppAnalysis --help
El directorio de salida se utiliza para almacenar el archivo JSON de información de la aplicación y los archivos de restricción Z3. Si no se especifica, estos archivos se almacenarán en ./pathOutput . Los archivos de salida son utilizados por la herramienta IntelliDroidDynamicClient para identificar las rutas de llamadas y generar los datos de entrada para activar estas rutas.
Los archivos appInfo.json y constraintX_X.py producidos en el directorio de salida son necesarios para el cliente dinámico, pero no son muy legibles. La bandera -y se puede usar para obtener una versión más legible (pero pesada de salida) de los resultados de ruta/restricción (impreso en stdout).
El directorio 'DynamicClient' contiene el programa Python que se comunica con el dispositivo Android y envía las entradas que activan los eventos deseados.
El programa espera que un dispositivo o emulador de Android esté conectado al sistema. Este dispositivo debe estar ejecutando el sistema operativo Android personalizado que contiene IntellidroidService (que interpreta los comandos que este programa envía y realiza la invocación real del evento). El programa DynamicClient se conectará automáticamente al dispositivo a través de un socket en el puerto TCP: 12348. La herramienta adb se utilizará para configurar la conexión y ejecutar ciertos comandos, y debe ser accesible desde PATH (esto se puede hacer agregando el directorio de herramientas SDK de Android a la variable PATH o configurando el entorno de compilación de AOSP antes de ejecutar DynamicClient.
Además, el DynamicClient utiliza el solucionador de restricciones Z3 a través de su API Python (Z3-PY). Las instrucciones para construir e instalar Z3 con enlaces de Python están disponibles aquí.
El sistema operativo Android personalizado utilizado por Intellidroid se proporciona como una serie de archivos DIFF que se pueden aplicar al árbol de origen base de AOSP. Intellidroid se implementa actualmente para Android 4.3 (ASP Branch android-4.3_r1 ). Consulte la documentación de AOSP para obtener instrucciones sobre cómo descargar y crear Android.
Una vez que haya descargado y compilado la versión correcta de AOSP, puede aplicar los parches Intellidroid, que se encuentran en el directorio de androidPatches . Los archivos patch.sh y unpatch.sh se proporcionan para ayudar a automatizar este proceso. Después de parchear, reconstruya el AOSP (hemos descubierto que es posible que tengas que ejecutar make dos veces; de lo contrario, ciertos archivos en el emulador se vuelven inconsistentes). También es posible que deba ejecutar make update-api junto con make . Una vez construido, puede usar logcat para verificar que la clase IntelliDroidService se inicie como un servicio del sistema cuando el dispositivo arranca.
cd androidPatches
./patch.sh <path to AOSP directory>
./IntelliDroidDynamicClient.py
HELP (obtener una descripción de los comandos)
INSTALL <APK file>
START <directory to app information, generated by IntelliDroidAppAnalysis>
TRIGGER <call path ID to trigger, as specified in appInfo.json>
EXECUTE <command to send to IntelliDroidService> 1
INFO <info requested from IntelliDroidService> 1
CLOSE
KILL
1 Estos comandos son solo para fines de depuración. Solo debe usarlos si conoce los parámetros exactos que IntellidroidService espera.
La integración con Taintdroid es bastante sencilla. Para el componente 'Appanalysis', use el indicador -t para especificar una lista diferente de métodos específicos (es decir, el archivo taintdroidTargets.txt proporcionado).
./IntelliDroidAppAnalysis -t taintdroidTargets.txt <preprocessed app directory>
En el lado dinámico, siga las instrucciones aquí para descargar y construir Taintdroid para Android 4.3. Una vez que haya verificado que su construcción de Taintdroid funcione, aplique los parches en DynamicClient/androidPatches de la misma manera que lo haría para AOSP no modificado.
Intellidroid fue inicialmente desarrollado como un proyecto de tesis de maestría por Michelle Wong en la Universidad de Toronto, supervisado por el Dr. David Lie.
Para cualquier consulta, comuníquese con:
Los siguientes han contribuido con el código a Intellidroid:
Intellidroid se lanza bajo la licencia MIT.