
Una herramienta para automatizar las interacciones con dispositivos Android, incluidos ADB, Androguard y Frida Interactivity.
Autodroid es una herramienta de Python para secuencias de comandos medias programáticas con uno o más dispositivos Android. Los posibles usos incluyen:
Para usar Autodroid, deberá instalar las dependencias, se especifican en el archivo de requisitos y se pueden instalar siguiendo el siguiente comando.
pip install -r REQUIREMENTS.txtSe debe proporcionar a Autodroid un archivo de configuración JSON válido como argumento de línea de comandos. El siguiente muestra un ejemplo de archivo de configuración simple que recuperará todas las aplicaciones de todos los dispositivos conectados uno a la vez y extraerá los APK a ZIPS usando Androguard.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Una vez que haya creado un archivo de configuración de AutoDoid válido, puede comenzar la interacción del dispositivo ejecutando el archivo de python AutoDroid.py con el archivo de configuración como es su parámetro de línea de comando.
python AutoDroid.py example_config.json El archivo de configuración de Autodroid se puede proporcionar con una serie de comandos para ejecutar en los dispositivos de destino, estos comandos se ejecutan localmente en su máquina y, por lo tanto, los programas y archivos que se llaman deben estar presentes. Estos comandos pueden estar en un formato de lista (como se puede ver en el ejemplo anterior) o como un mapa/ dict de pares de valor clave. Estos pares de valor clave se definen como bloques de comandos, donde la clave es el nombre del bloque y el valor es una lista de comandos. El block:<block name> se puede usar para ejecutar un bloque y proporciona una función simple de bucle/ devolución de llamada. Un ejemplo de uso de bloques se puede ver a continuación.
{
"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 " ]
}
} Dos campos adicionales que son fundamentales para Autodroid son los campos devices y apps . Estos campos definen la ID de dispositivo ADB para que los dispositivos sean dirigidos (una lista de cadenas) y el nombre de notación de dominio inverso de la aplicación (es decir, com.example.application ) para las aplicaciones que se dirigen al dispositivo (una lista de cadenas). Ambos campos pueden estar vacíos, una lista de cadenas o definidas como * donde se dirigirán todos los dispositivos y aplicaciones disponibles. En el backend, la forma en que esto funciona es cuando se proporciona un valor en estos campos, el programa recorrerá todos los comandos para cada aplicación en cada dispositivo. A continuación se puede ver un ejemplo de especificación de un dispositivo y aplicación específico:
{
"devices" : [ " 09261JEC216934 " ],
"apps" : [ " com.google.android.networkstack.tethering " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " ]
} Cuando el campo de los dispositivos no está vacío (es decir, no se crea "devices":[], ) una variable (ver más abajo) de !device_id . Esta variable se puede usar en sus comandos para denotar la ID del dispositivo ADB para el dispositivo dirigido actual. Del mismo modo, las variables !app_id , y !app_path se agregan cuando el campo de la aplicación no está vacío y se puede usar en los comandos para definir el nombre de notación de dominio inverso de la aplicación y la ruta al archivo APK de esa aplicación.
Para ahorrar tiempo, Autodroid permite establecer una cantidad infinita de variables en un script. Estas variables se construyen en un formato de par de valor clave. Cuando la clave de una variable se encuentra en un comando, se reemplazará para el valor. A continuación se puede ver una configuración de ejemplo que utiliza monkey , en este archivo de configuración, la !test de variable !app_id
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"variables" : { "!test" : " adb -s !device_id shell monkey -v 500 -p " },
"commands" : [ " !test !app_id " ]
} El estándar preferido para usar variables es precederlas con un ! y para usar _ en lugar de espacios.
Las variables se pueden configurar en tiempo de ejecución usando el ? operador. Donde el operador seguido de un nombre de variable se establece en lo que es la siguiente salida de comandos o si el comando no tiene salida el comando en sí. Un ejemplo se puede ver a continuación:
{
"devices" : [],
"apps" : [],
"commands" : [ " ?!files dir " , " print: !files " ]
}La siguiente es una lista de variables reservadas que ya se usan en Autodroid y se debe evitar que agregue su archivo de configuración. Si se agregan estas variables, se sobrescribirán en tiempo de ejecución.
!device_id : cuando se proporcionan uno o más dispositivos en la configuración, esta variable está poblada en tiempo de ejecución. Y está configurado como la ID del dispositivo ADB para el dispositivo actual. Cada dispositivo se realiza a su vez con los comandos configurados que se ejecutan para cada dispositivo.!adb_connect : esta es una variable abreviada que se traduce en adb -s !device_id , usando esto en lugar de adb asegurará que todos los comandos ADB se ejecuten en el dispositivo correcto.!app_id : cuando se proporcionan una o más aplicaciones en la configuración, esta variable está poblada en tiempo de ejecución. Y se establece como el nombre de notación de dominio inverso de la aplicación (es decir, com.example.myapplication ) para la aplicación actual. Cada aplicación se realiza a su vez con los comandos configurados que se ejecutan para cada aplicación.!app_path - Similar a lo anterior. Cuando se proporcionan una o más aplicaciones en la configuración, esta variable está poblada en tiempo de ejecución. Y se establece como la ruta al archivo APK de la aplicación actual en el dispositivo de destino. Cada aplicación se realiza a su vez con los comandos configurados que se ejecutan para cada aplicación. Las constantes son comandos específicos de Autodroid y se relacionan con una funcionalidad específica. Normalmente descompuesto en una palabra clave seguida de A : y luego uno o más parámetros separados por A ; . Estas constantes deben usarse al comienzo de un comando y siempre deben estar en minúsculas. Se darán ejemplos en las secciones individuales.
Autodroid ha incorporado la funcionalidad para ejecutar archivos JavaScript Frida como parte de una ejecución de Autodroid. Esta constante se define como frida: y debe proporcionar la ruta al archivo JavaScript que se usa, seguido de A ; y luego el nombre de notación inversa de la aplicación de la aplicación está dirigida. Además de aplicar variables al comando, las variables también se aplican al contenido del archivo proporcionado.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " frida:myJavascript.js;!app_id " ]
}Nota Si bien se implementa la integración de Frida, actualmente no se ha probado.
Autodroid admite APK de ingeniería inversa a través de Androguard. Esta constante está estructurada como reverse: y toma un camino hacia un APK almacenado localmente. El uso de esto guardará una versión desagregada del APK como una zip con el nombre <application name>.apk .
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb -s !device_id pull !app_path !app_id.apk " , " reverse: !app_id.apk " ]
} Al usar la constante inversa, la ruta APK puede ser seguida por cualquier número de parámetros (separados por A ; ), estos, incluida info (que guardará un archivo JSON de información de la aplicación, decompile (que en Linux guardará un resumen de TXT de los métodos descompilados), manifest (que guardará el archivo de manifiesto XML y el zip . El uso de estos parámetros se puede ver a continuación:
{
"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 " ]
}
} Esta constante proporciona una funcionalidad simple para detener la ejecución de las herramientas durante un período de tiempo específico. Esta constante está estructurada como sleep: seguido por la cantidad de segundos para esperar.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " sleep:5 " ]
} La constante de bloque proporciona funcionalidad de bucle simple y devolución de llamada. Esta constante está estructurada como block: seguido por el nombre del bloque de comandos para ejecutar. Si no se han proporcionado bloques (es decir, se han proporcionado comandos en un formato de lista), entonces los comandos se agregan a un bloque llamado 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 " ]
}
}La palabra clave 'encontrar' seguida de una ruta a un APK y una cadena regex para encontrar se imprimirá en la consola la ruta al APK y la cadena encontrada si están presentes en un APK. Esto se puede usar junto con otros comandos para ejecutar las cadenas de búsqueda en todas las aplicaciones procesadas. Un ejemplo de esto se puede ver a continuación:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " adb pull !app_path !app_id.apk " , " find: !app_id.apk;my_string " ]
} Otra constante simple. La print: constante se puede usar para imprimir un mensaje en la consola. Un ejemplo de uso de esto se puede ver a continuación:
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " print: device id !device_id, app id !app_id, app path !app_path " ]
} La constante de escritura permite que se escriba una variable o comando en un archivo. Usado con la write: String seguido del archivo para escribir, seguido de A ; , y luego el comando o variable para escribir en el archivo.
{
"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 " ]
}
} La read: Constant se proporciona una ruta a un archivo para leer, seguido de A ; y luego la variable para guardar la salida para. Esta variable puede ser una variable recién declarada o existente.
{
"devices" : [],
"apps" : [],
"commands" : [ " read:test.txt;!data " , " print: !data " ]
} Similar a la escritura. La constante de append permite que se escriba una variable o comando en un archivo. Usado con la cadena append: seguido del archivo para escribir, seguido de A ; , y luego el comando o variable para escribir en el archivo. A diferencia de la escritura que creará o escribirá en un archivo existente, Append solo se agregará a un archivo existente. Si el archivo no existe, entonces Autodroid se equivocará.
{
"devices" : [ " * " ],
"apps" : [ " * " ],
"commands" : [ " append:test.txt;!app_id !app_path " ]
}El siguiente es un ejemplo de uso de Autodroid para probar el potencial malware en los dispositivos Android. Esta configuración instala el potencial malware, registra la pantalla, recupera la captura de la pantalla y desinstala la aplicación.
{
"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 " ]
}
}El siguiente es un ejemplo de uso de la implementación de Autodroid de Androguard para revertir la ingeniería de un APK de un dispositivo y recuperar un JSON de información sobre la aplicación, un resumen descompilado de métodos, el archivo manifiesto XML y un archivo zip desagregado del 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 Licencia pública general v3.0