O IntelliDroid é uma ferramenta de análise para aplicativos Android que extrai os caminhos que chamam de comportamento específico e executa esses caminhos com precisão durante o tempo de execução. Quando recebe um conjunto de comportamentos direcionados , o componente de análise estática atravessa o gráfico de chamadas do aplicativo para encontrar caminhos para esses comportamentos. Ele também extrai restrições de caminho, que são usadas para determinar os valores de entrada que podem desencadear esses caminhos. O componente dinâmico toma os caminhos/restrições extraídos e injeta os valores de entrada no dispositivo Android, desencadeando os comportamentos direcionados.
Para mais detalhes, consulte nosso artigo e slides (NDSS 2016).
A 'estrutura da estrutura' realiza análise estática para gerar restrições para a estrutura do Android. Atualmente, fornecemos as restrições da estrutura de saída para que elas possam ser adicionadas às restrições de aplicativos produzidas pelo componente 'Appanalysis'.
O diretório 'Appanalysis' mantém o código que gera restrições para aplicativos Android.
| Diretório | Descrição |
|---|---|
| Processo | Scripts para extrair e pré -processar o arquivo APK antes de passá -lo para a ferramenta. |
| src | Arquivos de código -fonte. |
| Libs | Dependências, incluindo as bibliotecas de wala necessárias. 1 |
| Android | Arquivos de estrutura Android compilados (a serem analisados), da versão 4.4.2_R2 do AOSP. |
1 Fizemos pequenas alterações na geração de gráficos de chamadas de Wala para melhorar o desempenho do IntelliDroid. O código -fonte modificado pode ser encontrado aqui.
Este projeto usa o sistema de construção gradle. Os arquivos de saída estão localizados no diretório build/ . O Script Gradlew é um invólucro para máquinas que não têm o Gradle já instalado. Se a sua máquina de desenvolvimento já contiver o Gradle, você poderá usar sua própria instalação substituindo ./gradlew pelo gradle nos comandos abaixo. Uma conexão de rede é necessária ao compilar o código pela primeira vez, para que o Gradle possa baixar automaticamente as dependências.
Os arquivos de estrutura Android incluídos no diretório android foram compilados usando o JDK 1.6, mas o apktool usado nos scripts de pré -processamento requerem o JDK 1.7. Recomendamos o uso do JDK 1.7, pois isso parece funcionar melhor. Se necessário, você pode substituir os arquivos no diretório android para tentar diferentes versões do AOSP ou JDK.
O arquivo APK de destino a ser analisado deve primeiro ser pré -processado usando os scripts na pasta preprocess . O diretório resultante (contendo o arquivo APK e os recursos extraídos) pode ser transmitido para a análise estática.
Os scripts de pré -processamento usam ApkTool e ousa para extrair o pacote APK. Você pode usar suas próprias ferramentas de extração, mas pode ser necessário modificar o código de análise de aplicativos para que o IntelliDroid possa encontrar o bytecode e manifestar arquivos para um determinado aplicativo.
./preprocess/PreprocessAPK.sh <APK file>
./preprocess/PreprocessDataset.sh <directory of APK files>
./gradlew build
./IntelliDroidAppAnalysis -o <output directory> <preprocessed app directory>
Para ver outras opções de linha de comando, execute:
./IntelliDroidAppAnalysis --help
O diretório de saída é usado para armazenar o arquivo JSON de informações do aplicativo e os arquivos de restrição Z3. Se não for especificado, esses arquivos serão armazenados em ./pathOutput . Os arquivos de saída são usados pela Ferramenta IntelliDroidDynamicClient para identificar os caminhos de chamada e gerar os dados de entrada para acionar esses caminhos.
Os arquivos appInfo.json e constraintX_X.py produzidos no diretório de saída são necessários para o cliente dinâmico, mas não são muito legíveis. O sinalizador -y pode ser usado para obter uma versão mais legível (mas pesada) dos resultados do caminho/restrição (impresso no stdout).
O diretório 'DynamicClient' contém o programa Python que se comunica com o dispositivo Android e envia as entradas que acionam os eventos desejados.
O programa espera que um dispositivo Android ou emulador esteja conectado ao sistema. Este dispositivo deve estar executando o sistema operacional Android personalizado que contém o IntelliDroidService (que interpreta os comandos que este programa envia e faz a invocação real de eventos). O programa DynamicClient se conectará automaticamente ao dispositivo por meio de um soquete na porta TCP: 12348. A ferramenta adb será usada para configurar a conexão e executar certos comandos, e deve ser acessível a partir PATH (isso pode ser feito adicionando o diretório Android SDK Tools à variável PATH ou configurando o ambiente de construção AOSP antes da execução do DynamicClient.
Além disso, o DynamicClient usa o solucionador de restrição Z3 por meio de sua API Python (Z3-PY). As instruções para construir e instalar Z3 com ligações Python estão disponíveis aqui.
O sistema operacional Android personalizado usado pelo IntelliDroid é fornecido como uma série de arquivos diff que podem ser aplicados à árvore de origem AOSP base. Atualmente, o IntelliDroid é implementado para o Android 4.3 (AOSP Branch android-4.3_r1 ). Consulte a documentação da AOSP para obter instruções sobre como baixar e construir o Android.
Depois de baixar e compilar a versão AOSP correta, você pode aplicar os patches IntelliDroid, localizados no diretório androidPatches . Os arquivos patch.sh e unpatch.sh são fornecidos para ajudar a automatizar esse processo. Após o patch, reconstrua o AOSP (descobrimos que você pode precisar make duas vezes; caso contrário, certos arquivos no emulador se tornam inconsistentes). Você também pode precisar executar make update-api junto com make . Uma vez construído, você pode usar logcat para verificar se a classe IntelliDroidService é iniciada como um serviço de sistema quando o dispositivo inicializa.
cd androidPatches
./patch.sh <path to AOSP directory>
./IntelliDroidDynamicClient.py
HELP (obtenha a descrição dos 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 Esses comandos são apenas para fins de depuração. Você deve usá -los apenas se souber os parâmetros exatos que o IntelliDroidService espera.
A integração com o TaintDroid é bastante direta. Para o componente 'Appanalysis', use o sinalizador -t para especificar uma lista diferente de métodos direcionados (ou seja, o arquivo fornecido taintdroidTargets.txt ).
./IntelliDroidAppAnalysis -t taintdroidTargets.txt <preprocessed app directory>
No lado dinâmico, siga as instruções aqui para baixar e criar o TaintDroid para o Android 4.3. Depois de verificar se a sua construção de obras de TaintDroid, aplique os patches em DynamicClient/androidPatches da mesma maneira que faria para o AOSP não modificado.
O IntelliDroid foi inicialmente desenvolvido como um projeto de tese de mestrado por Michelle Wong na Universidade de Toronto, supervisionado pelo Dr. David Lie.
Para qualquer pergunta, entre em contato com:
Os seguintes contribuíram com o código para o IntelliDroid:
O IntelliDroid é liberado sob a licença do MIT.