
Ferramenta automatizada de pré-análise para aplicativos Android que desmonta amostras, extrai propriedades por meio de correspondência de padrões configurável e organiza a saída para engenharia reversa e análise de malware aceleradas.
DroidLysis é uma ferramenta de pré-análise para aplicativos Android: ela executa tarefas repetitivas e tediosas que normalmente faríamos no início de qualquer engenharia reversa. Ela descompila a amostra Android, organiza a saída em diretórios e procura por pontos suspeitos no código para analisar. A saída ajuda o engenheiro reverso a acelerar os primeiros passos da análise.
O DroidLysis pode ser usado em pacotes Android (apk), executáveis Dalvik (dex), arquivos Zip (zip), arquivos Rar (rar) ou diretórios de arquivos.
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
Instale a partir do Git em um ambiente virtual Python (python3 -m venv, ou ambientes virtuais pyenv etc).
$ python3 -m venv venv
$ source ./venv/bin/activate
(venv) $ pip3 install git+https://github.com/cryptax/droidlysis
Alternativamente, você pode instalar o DroidLysis diretamente do PyPi (pip3 install droidlysis).
conf/general.conf. Em particular, certifique-se de alterar /home/axelle pelos diretórios apropriados.[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
O arquivo de configuração é ./conf/general.conf (você pode mudar para outro arquivo com a opção --config).
Aqui você configura a localização de várias ferramentas externas (ex: Apktool), o nome dos arquivos de padrões
(por padrão ./conf/smali.conf, ./conf/wide.conf, ./conf/arm.conf, ./conf/kit.conf) e o nome do
arquivo de banco de dados (usado apenas se você especificar --enable-sql)
Certifique-se de especificar os caminhos corretos para as ferramentas de descompilação, senão o DroidLysis não as encontrará.
O DroidLysis usa Python 3. Para iniciá-lo e obter opções:
droidlysis --help
Por exemplo, teste no APK do Signal:
droidlysis --input Signal-website-universal-release-6.26.3.apk --output /tmp --config /PATH/TO/DROIDLYSIS/conf/general.conf

O DroidLysis gera:
--output /tmp, a análise será escrita em /tmp/Signalwebsiteuniversalrelease4.52.4.apk-f3c7d5e38df23925dd0b2fe1f44bfa12bac935a6bc8fe3a485a4436d4487a290.droidlysis.db) contendo as propriedades que notou.Obtenha o uso com droidlysis --help
A entrada pode ser um arquivo ou um diretório de arquivos para pesquisar recursivamente. O DroidLysis sabe como processar pacotes Android, executáveis DEX, ODEX e ARM, ZIP, RAR. O DroidLysis não falhará em outros tipos de arquivos (a menos que haja um bug...), mas não conseguirá entender o conteúdo.
Ao processar diretórios de arquivos, geralmente é muito útil mover amostras processadas para outro local para saber o que foi processado. Isso é tratado pela opção --movein. Além disso, se você estiver interessado apenas em estatísticas, provavelmente deve limpar o diretório de saída que contém informações detalhadas para cada amostra: esta é a opção --clearoutput. Se você quiser armazenar todas as estatísticas em um banco de dados SQL, use --enable-sql (veja aqui)
A análise do DroidLysis não inspeciona SDKs de terceiros conhecidos por padrão, ou seja, por exemplo, não reportará nenhuma atividade suspeita destes. Se você quiser que eles sejam inspecionados, use a opção --no-kit-exception. Isso geralmente cria muito mais propriedades detectadas para a amostra, pois SDKs (ex: publicidade) usam muitas APIs sinalizadas (obter localização GPS, obter IMEI, obter IMSI, HTTP POST...).
--output DIR)Este diretório contém (quando aplicável):
AndroidManifest.xml legívelreslib, recursos assetssmali (e outros)META-INF./unzippedclasses.dex (e outros), e convertido para jar: classes-dex2jar.jar, e desjarrado em ./unjarredOs seguintes arquivos são gerados pelo DroidLysis:
autoanalysis.md: lista cada padrão que o DroidLysis detectou e onde.report.md: o mesmo que foi impresso no consoleSe você não precisar que o diretório de saída da amostra seja gerado, use a opção --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
Rastreadores do Exodus que não estão presentes no seu kit.conf inicial são adicionados a ~/.cache/droidlysis/kit.conf. Compare os 2 arquivos e verifique quais rastreadores você deseja adicionar.
Se você quiser processar um diretório de amostras, provavelmente vai gostar de armazenar as propriedades que o DroidLysis encontrou em um banco de dados, para analisar e consultar facilmente os resultados. Nesse caso, use a opção --enable-sql. Isso despejará automaticamente todos os resultados em um banco de dados chamado droidlysis.db, em uma tabela chamada samples. Cada entrada na tabela é relativa a uma determinada amostra. Cada coluna são propriedades que o DroidLysis rastreia.
Por exemplo, para recuperar todos os nomes de arquivo, soma SHA256 e propriedades smali do banco de dados:
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_state": false, "get_imsi": false, "get_network_operator": false, "get_active_network_info": false, "get_line_number": true, "get_sim_country_iso": true,
...
O que o DroidLysis detecta pode ser configurado e estendido nos arquivos do diretório ./conf.
Um padrão consiste em:
send_sms. Serve para nomear a propriedade. Deve ser único em todo o arquivo .conf.;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage. No arquivo smali.conf, esta regexp é correspondida no código Smali. Neste caso específico, há 3 maneiras diferentes de enviar mensagens SMS a partir do código: sendTextMessage, sendMultipartTextMessage e sendDataMessage.[send_sms]
pattern=;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage
description=Enviando mensagens SMS
O Exodus Privacy mantém uma lista de vários SDKs que são interessantes de descartar em nossa análise via conf/kit.conf.
Adicione a opção --import_exodus à linha de comando do droidlysis: isso analisará os rastreadores existentes que o Exodus Privacy conhece e que ainda não estão no seu kit.conf. Finalmente, adicionará todos os novos rastreadores a ~/.cache/droidlysis/kit.conf.
Depois, você pode querer ordenar seu arquivo 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 ajuda você a pesquisar métodos na interface JEB que contêm código que corresponde ao padrão smali e navegar facilmente para essas funções. Quando você carrega o script e seleciona o arquivo details.md entre os arquivos de análise do droidlysis, uma caixa de pesquisa aparecerá. Depois de movida, você pode facilmente trazer a janela de pesquisa de volta usando o atalho de execução de script recente.
script/DroidlysisSearch.py