
Uma ferramenta para automatizar interações com dispositivos Android - incluindo interatividade ADB, Androguard e FRIDA.
O AutoDroid é uma ferramenta Python para roteirizar programaticamente interações em massa com um ou mais dispositivos Android. Os usos possíveis incluem:
Para usar o Autodroid, você precisará instalar as dependências, elas são especificadas no arquivo de requisitos e podem ser instaladas seguindo o comando abaixo.
pip install -r REQUIREMENTS.txtO AutoDroid precisa receber um arquivo de configuração JSON válido como um argumento da linha de comando. O abaixo mostra um exemplo simples de arquivo de configuração que recuperará todos os aplicativos de todos os dispositivos conectados, um de cada vez, e extrairá os APKs para Zips usando Androguard.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Depois de criar um arquivo de configuração do Autodroid válido, você pode iniciar a interação do dispositivo executando o arquivo python AutoDroid.py com o arquivo de configuração como o parâmetro da linha de comando.
python AutoDroid.py example_config.json O arquivo de configuração do Autodroid pode ser fornecido com uma série de comandos para executar nos dispositivos de destino, esses comandos são executados localmente em sua máquina e, portanto, os programas e arquivos que estão sendo chamados devem estar presentes. Esses comandos podem estar em um formato de lista (como pode ser visto no exemplo acima) ou como um mapa/ ditado do par de valores -chave. Esses pares de valor -chave são definidos como blocos de comandos, onde a chave é o nome do bloco e o valor é uma lista de comandos. O block:<block name> pode ser usado para executar um bloco e fornece um recurso simples de loop/ chamada. Um exemplo de uso de blocos pode ser visto abaixo.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"test_user_input" :[ " adb -s !device_id shell monkey -v 5 -p !app_id " ],
"retrieve_apk" :[ " adb -s !device_id pull !app_path !app_id.apk " , " sleep:5 " ]
}
} Dois campos adicionais que são instrumentais para o AutoDoid são os campos devices e apps . Esses campos definem o ID do dispositivo ADB para o (s) dispositivo (s) que está sendo direcionado (uma lista de strings) e o nome da notação de domínio reverso do aplicativo (ou seja, com.example.application ) para os aplicativos que estão sendo direcionados no dispositivo (uma lista de strings). Ambos os campos podem estar vazios, uma lista de strings ou definidos como * onde todos os dispositivos e aplicativos disponíveis serão direcionados. No back -end da maneira como isso funciona é quando um valor é fornecido nesses campos, o programa percorre todos os comandos para cada aplicativo em cada dispositivo. Um exemplo de especificação de um dispositivo e aplicativo específico pode ser visto abaixo:
{
"devices" : [ " 09261JEC216934 " ],
"apps" : [ " com.google.android.networkstack.tethering " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " ]
} Quando o campo de dispositivos não está vazio (ou seja, "devices":[], ) uma variável (veja abaixo) de !device_id é criada. Essa variável pode ser usada em seus comandos para denotar o ID do dispositivo ADB para o dispositivo direcionado atual. Da mesma forma, as variáveis !app_id e !app_path são adicionadas quando o campo do aplicativo não está vazio e pode ser usado nos comandos para definir o nome da notação de domínio reverso do aplicativo e o caminho para o arquivo APK desse aplicativo.
Para economizar tempo, o Autodroid permite que uma quantidade infinita de variáveis seja definida em um script. Essas variáveis são construídas em um formato de par de valores -chave. Quando a chave de uma variável estiver localizada em um comando, ela será substituída pelo valor. monkey exemplo de configuração que utiliza variáveis pode ser visto abaixo, neste arquivo de configuração O !test !app_id
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"variables" : { "!test" : " adb -s !device_id shell monkey -v 500 -p " },
"commands" : [ " !test !app_id " ]
} O padrão preferido para usar variáveis é precedi -las com um ! e usar _ em vez de espaços.
As variáveis podem ser definidas em tempo de execução usando o ? operador. Onde o operador seguido por um nome de variável é definido como qual é a saída dos seguintes comandos ou se o comando não tiver saída o próprio comando. Um exemplo pode ser visto abaixo:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}A abaixo é uma lista de variáveis reservadas que já são usadas no AutoDOid e devem ser evitadas de adicionar ao seu arquivo de configuração. Se essas variáveis forem adicionadas, elas serão substituídas em tempo de execução.
!device_id - Quando um ou mais dispositivos são fornecidos na configuração, essa variável é preenchida em tempo de execução. E é definido como o ID do dispositivo ADB para o dispositivo atual. Cada dispositivo é realizado por sua vez, com os comandos configurados sendo executados para cada dispositivo.!adb_connect -Esta é uma variável abreviada que se traduz em adb -s !device_id , usando isso em vez de adb garantirá que todos os comandos do ADB sejam executados no dispositivo correto.!app_id - Quando um ou mais aplicativos são fornecidos na configuração, essa variável é preenchida em tempo de execução. E é definido como o nome da notação do domínio reverso do aplicativo (ou seja, com.example.myapplication ) para o aplicativo atual. Cada aplicativo é realizado por sua vez, com os comandos configurados sendo executados para cada aplicativo.!app_path - semelhante ao acima. Quando um ou mais aplicativos são fornecidos na configuração, essa variável é preenchida em tempo de execução. E é definido como o caminho para o arquivo APK do aplicativo atual no dispositivo de destino. Cada aplicativo é realizado por sua vez, com os comandos configurados sendo executados para cada aplicativo. As constantes são comandos específicos para o AutoDroid e relacionam -se a funcionalidade específica. Normalmente dividido em uma palavra -chave seguida por a : e, em seguida, um ou mais parâmetros separados por a ; . Essas constantes devem ser usadas no início de um comando e devem sempre estar em minúsculas. Exemplos serão dados nas seções individuais.
O Autodroid construiu funcionalidade para executar arquivos JavaScript Frida como parte de uma execução do AutoDODROid. Essa constante é definida como frida: e deve ser fornecida o caminho para o arquivo JavaScript que está sendo usado, seguido por A ; e então o nome da notação reversa do aplicativo do aplicativo está sendo direcionada. Além de aplicar variáveis ao comando, as variáveis também são aplicadas ao conteúdo do arquivo fornecido.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}Nota , embora a integração do FRIDA seja implementada, ela não é testada.
O AutoDroid suporta APKs de engenharia reversa via Androguard. Essa constante é estruturada como reverse: e segue um caminho para um apk armazenado localmente. Usando isso, salvará uma versão sem sucção do APK como um zip com o nome <application name>.apk .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Ao usar a constante reversa, o caminho da APK pode ser seguido por qualquer manifest de parâmetros (separados por A ; ), incluindo info (que salvarão um arquivo zip de informações sobre o aplicativo, decompile (que no Linux salvará um resumo do TXT do que o Sav. Usando estes parâmetros pode ser visto abaixo:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"get_app" : [ " adb -s !device_id pull !app_path !app_id.apk " ],
"reverse_app" :[ " reverse: !app_id.apk;info " ,
" reverse: !app_id.apk;manifest;decompile " ]
}
} Essa constante fornece funcionalidade simples para fazer a execução da ferramenta por um período específico de tempo. Essa constante é estruturada como sleep: seguida pela quantidade de segundos para esperar.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " sleep:5 " ]
} A constante de bloco fornece uma funcionalidade simples de loop e retorno de chamada. Essa constante é estruturada como block: seguido pelo nome do bloco de comandos para executar. Se nenhum bloco foi fornecido (os comandos ou seja, foram fornecidos em um formato de lista), os comandos serão adicionados a um bloco chamado main .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"test_user_input" :[ " adb shell monkey -v 5 -p !app_id " ],
"retrieve_apk" :[ " adb pull !app_path !app_id.apk " ],
"test_again" : [ " block: test_user_input " , " sleep:5 " ]
}
}A palavra -chave 'Find' seguida por um caminho para um apk e uma string regex a ser encontrada serão impressas no console no caminho para o apk e a string encontrada se estiverem presentes em um apk. Isso pode ser usado em conjunto com outros comandos para executar as strings de localização em todos os aplicativos processados. Um exemplo disso pode ser visto abaixo:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " find: !app_id.apk;my_string " ]
} Outra constante simples. A print: constante pode ser usada para imprimir uma mensagem no console. Um exemplo de uso disso pode ser visto abaixo:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " print: device id !device_id, app id !app_id, app path !app_path " ]
} A constante de gravação permite que uma variável ou comando seja gravada em um arquivo. Usado com a write: string seguida pelo arquivo para gravar, seguido por um ; , e depois o comando ou variável para gravar no arquivo.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : {
"get_stats" : [ " ?!stats device id !device_id, app id !app_id, app path !app_path " ],
"write_stats" : [ " write: !device_id-!app_id-stats.txt;!stats " ]
}
} A read: Constant recebe um caminho para um arquivo para ler, seguido por A ; e, em seguida, a variável para salvar a saída para. Essa variável pode ser uma variável recém -declarada ou existente.
{
"devices" : [],
"apps" : [],
"commands" : [ " read:test.txt;!data " , " print: !data " ]
} Semelhante a escrever. A constante de apêndice permite que uma variável ou comando seja gravada em um arquivo. Usado com o append: String seguida pelo arquivo para gravar, seguido por A ; , e depois o comando ou variável para gravar no arquivo. Ao contrário da gravação que criará ou gravará um arquivo existente, o Append adicionará apenas a um arquivo existente. Se o arquivo não existir, o AutoDroid errará.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " append:test.txt;!app_id !app_path " ]
}O abaixo é um exemplo de uso do Autodroid para testar potenciais malware em dispositivos Android. Esta configuração instala o malware em potencial, registra a tela, recupera a captura da tela e desinstala o aplicativo.
{
"devices" : [ " * " ],
"apps" : [],
"commands" : {
"record_screen" : [ " adb shell screenrecord /data/local/tmp/test.mp4 --time-limit 120 " ],
"install_eicar" :[ " adb install com.fsecure.eicar.antivirus.test.apk " ],
"user_input" :[ " adb shell monkey -p com.fsecure.eicar.antivirus.test -v 1 " , " sleep: 20 " ],
"uninstall" : [ " adb uninstall com.fsecure.eicar.antivirus.test " ],
"get_video" : [ " adb pull /data/local/tmp/test.mp4 " , " sleep: 20 " , " adb shell rm /data/local/tmp/test.mp4 " ]
}
}O abaixo é um exemplo de uso da implementação do Androguard pela AutoDOid para reverter a engenharia de um apk de um dispositivo e recuperar um JSON de informações sobre o aplicativo, um resumo descompilado dos métodos, o arquivo de manifesto XML e um arquivo ZIP não suco do APK.
{
"devices" : [ " * " ],
"apps" : [ " me.jamesstevenson.onelist " ],
"commands" : {
"get_app" : [ " adb pull !app_path !app_id.apk " ],
"reverse_app" :[ " reverse: !app_id.apk;info;decompile;manifest;zip " ]
}
}GNU Licença pública em geral v3.0