
Herramienta automatizada de preanálisis para aplicaciones Android que desensambla muestras, extrae propiedades mediante coincidencia de patrones configurable y organiza la salida para un análisis inverso y de malware acelerado.
DroidLysis es una herramienta de preanálisis para aplicaciones Android: realiza tareas repetitivas y aburridas que normalmente haríamos al comienzo de cualquier ingeniería inversa. Desensambla la muestra de Android, organiza la salida en directorios y busca puntos sospechosos en el código para examinar. La salida ayuda al ingeniero inverso a acelerar los primeros pasos del análisis.
DroidLysis puede utilizarse sobre paquetes Android (apk), ejecutables Dalvik (dex), archivos Zip (zip), archivos Rar (rar) o directorios de archivos.
sudo apt-get install default-jre git python3 python3-pip unzip wget libmagic-dev libxml2-dev libxslt-dev
$ mkdir -p ~/softs
$ cd ~/softs
$ wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.9.3.jar
$ wget https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.5.2.jar
$ wget https://github.com/pxb1988/dex2jar/releases/download/v2.4/dex-tools-v2.4.zip
$ unzip dex-tools-v2.4.zip
$ rm -f dex-tools-v2.4.zip
Instala desde Git en un entorno virtual de Python (python3 -m venv, o entornos virtuales de pyenv, etc.).
$ python3 -m venv venv
$ source ./venv/bin/activate
(venv) $ pip3 install git+https://github.com/cryptax/droidlysis
Alternativamente, puedes instalar DroidLysis directamente desde PyPi (pip3 install droidlysis).
conf/general.conf. En particular, asegúrate de cambiar /home/axelle por tus directorios adecuados.[tools]
apktool = /home/axelle/softs/apktool_2.9.3.jar
baksmali = /home/axelle/softs/baksmali-2.5.2.jar
dex2jar = /home/axelle/softs/dex-tools-v2.4/d2j-dex2jar.sh
keytool = /usr/bin/keytool
...
python3 ./droidlysis3.py --help
El archivo de configuración es ./conf/general.conf (puedes cambiar a otro archivo con la opción --config).
Aquí es donde configuras la ubicación de varias herramientas externas (ej. Apktool), el nombre de los archivos de patrones
(por defecto ./conf/smali.conf, ./conf/wide.conf, ./conf/arm.conf, ./conf/kit.conf) y el nombre del
archivo de base de datos (solo se usa si especificas --enable-sql)
Asegúrate de especificar las rutas correctas para las herramientas de desensamblado, o DroidLysis no las encontrará.
DroidLysis usa Python 3. Para lanzarlo y obtener opciones:
droidlysis --help
Por ejemplo, pruébalo en la APK de Signal:
droidlysis --input Signal-website-universal-release-6.26.3.apk --output /tmp --config /PATH/TO/DROIDLYSIS/conf/general.conf

DroidLysis produce:
--output /tmp, el análisis se escribirá en /tmp/Signalwebsiteuniversalrelease4.52.4.apk-f3c7d5e38df23925dd0b2fe1f44bfa12bac935a6bc8fe3a485a4436d4487a290.droidlysis.db) que contiene las propiedades que detectó.Obtén ayuda con droidlysis --help
La entrada puede ser un archivo o un directorio de archivos para explorar recursivamente. DroidLysis sabe cómo procesar paquetes Android, ejecutables DEX, ODEX y ARM, ZIP, RAR. DroidLysis no fallará en otros tipos de archivos (a menos que haya un error...) pero no podrá entender el contenido.
Al procesar directorios de archivos, normalmente es muy útil mover las muestras procesadas a otra ubicación para saber qué se ha procesado. Esto se maneja con la opción --movein. Además, si solo te interesan las estadísticas, probablemente deberías limpiar el directorio de salida que contiene información detallada para cada muestra: esto es la opción --clearoutput. Si deseas almacenar todas las estadísticas en una base de datos SQL, usa --enable-sql (ver aquí)
El análisis de DroidLysis no inspecciona SDK de terceros conocidos por defecto, es decir, por ejemplo, no informará ninguna actividad sospechosa de estos. Si deseas que sean inspeccionados, usa la opción --no-kit-exception. Esto generalmente crea muchas más propiedades detectadas para la muestra, ya que los SDK (por ejemplo, publicidad) usan muchas APIs marcadas (obtener ubicación GPS, obtener IMEI, obtener IMSI, HTTP POST...).
--output DIR)Este directorio contiene (cuando corresponda):
AndroidManifest.xml legiblereslib, activos assetssmali (y otros)META-INF./unzippedclasses.dex (y otros), y convertido a jar: classes-dex2jar.jar, y descomprimido en ./unjarredLos siguientes archivos son generados por DroidLysis:
autoanalysis.md: lista cada patrón que DroidLysis detectó y dónde.report.md: igual a lo que se imprimió en la consolaSi no necesitas que se genere el directorio de salida de la muestra, usa la opción --clearoutput.
--import-exodus)$ python3 ./droidlysis3.py --import-exodus --verbose
Processing file: ./droidurl.pyc ...
DEBUG:droidconfig.py:Reading configuration file: './conf/./smali.conf'
DEBUG:droidconfig.py:Reading configuration file: './conf/./wide.conf'
DEBUG:droidconfig.py:Reading configuration file: './conf/./arm.conf'
DEBUG:droidconfig.py:Reading configuration file: '/home/axelle/.cache/droidlysis/./kit.conf'
DEBUG:droidproperties.py:Importing ETIP Exodus trackers from https://etip.exodus-privacy.eu.org/api/trackers/?format=json
DEBUG:connectionpool.py:Starting new HTTPS connection (1): etip.exodus-privacy.eu.org:443
DEBUG:connectionpool.py:https://etip.exodus-privacy.eu.org:443 "GET /api/trackers/?format=json HTTP/1.1" 200 None
DEBUG:droidproperties.py:Appending imported trackers to /home/axelle/.cache/droidlysis/./kit.conf
Los rastreadores de Exodus que no están presentes en tu kit.conf inicial se añaden a ~/.cache/droidlysis/kit.conf. Haz un diff de los 2 archivos y revisa qué rastreadores deseas agregar.
Si deseas procesar un directorio de muestras, probablemente te gustará almacenar las propiedades que DroidLysis encontró en una base de datos, para analizar y consultar fácilmente los hallazgos. En ese caso, usa la opción --enable-sql. Esto volcará automáticamente todos los resultados en una base de datos llamada droidlysis.db, en una tabla llamada samples. Cada entrada en la tabla corresponde a una muestra determinada. Cada columna son propiedades que DroidLysis rastrea.
Por ejemplo, para recuperar todos los nombres de archivo, suma SHA256 y propiedades smali de la base de datos:
sqlite> select sha256, sanitized_basename, smali_properties from samples;
f3c7d5e38df23925dd0b2fe1f44bfa12bac935a6bc8fe3a485a4436d4487a290|Signalwebsiteuniversalrelease4.52.4.apk|{"send_sms": true, "receive_sms": true, "abort_broadcast": true, "call": false, "email": false, "answer_call": false, "end_call": true, "phone_number": false, "intent_chooser": true, "get_accounts": true, "contacts": false, "get_imei": true, "get_external_storage_stage": false, "get_imsi": false, "get_network_operator": false, "get_active_network_info": false, "get_line_number": true, "get_sim_country_iso": true,
...
Lo que DroidLysis detecta se puede configurar y extender en los archivos del directorio ./conf.
Un patrón consiste en:
send_sms. Esto es para nombrar la propiedad. Debe ser único en el archivo .conf.;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage. En el archivo smali.conf, esta expresión regular se compara con el código Smali. En este caso particular, hay 3 formas diferentes de enviar mensajes SMS desde el código: sendTextMessage, sendMultipartTextMessage y sendDataMessage.[send_sms]
pattern=;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage
description=Enviando mensajes SMS
Exodus Privacy mantiene una lista de varios SDK que es interesante descartar en nuestro análisis mediante conf/kit.conf.
Añade la opción --import_exodus a la línea de comandos de droidlysis: esto analizará los rastreadores existentes que Exodus Privacy conoce y que aún no están en tu kit.conf. Finalmente, añadirá todos los nuevos rastreadores a ~/.cache/droidlysis/kit.conf.
Después, es posible que desees ordenar tu archivo kit.conf:
import configparser
import collections
import os
config = configparser.ConfigParser({}, collections.OrderedDict)
config.read(os.path.expanduser('~/.cache/droidlysis/kit.conf'))
# Order all sections alphabetically
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0] ))
with open('sorted.conf','w') as f:
config.write(f)
Este script te ayuda a buscar métodos en la interfaz de JEB que contengan código que coincida con el patrón smali y navegar fácilmente a esas funciones. Cuando cargas el script y seleccionas el archivo details.md entre los archivos de análisis de droidlysis, aparecerá un cuadro de búsqueda. Una vez movido, puedes volver a abrir fácilmente las ventanas de búsqueda usando el atajo de ejecución de script reciente.
script/DroidlysisSearch.py