
Автоматизированный инструмент предварительного анализа Android-приложений, который дизассемблирует образцы, извлекает свойства с помощью настраиваемого сопоставления шаблонов и организует вывод для ускоренного реверс-инжиниринга и анализа вредоносных программ.
DroidLysis — это инструмент предварительного анализа Android-приложений: он выполняет повторяющиеся и скучные задачи, которые мы обычно делаем в начале любого реверс-инжиниринга. Он дизассемблирует Android-образец, организует вывод в каталоги и ищет подозрительные места в коде, на которые стоит обратить внимание. Результат помогает реверс-инженеру ускорить первые шаги анализа.
DroidLysis можно использовать для Android-пакетов (apk), исполняемых файлов Dalvik (dex), Zip-файлов (zip), Rar-файлов (rar) или каталогов с файлами.
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
Установка из Git в виртуальном окружении Python (python3 -m venv или pyenv virtual environments и т.д.).
$ python3 -m venv venv
$ source ./venv/bin/activate
(venv) $ pip3 install git+https://github.com/cryptax/droidlysis
Кроме того, вы можете установить DroidLysis напрямую из PyPi (pip3 install droidlysis).
conf/general.conf. В частности, замените /home/axelle на ваши соответствующие каталоги.[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
Файл конфигурации — ./conf/general.conf (вы можете переключиться на другой файл с помощью опции --config).
Здесь вы настраиваете расположение различных внешних инструментов (например, Apktool), имена файлов с шаблонами
(по умолчанию ./conf/smali.conf, ./conf/wide.conf, ./conf/arm.conf, ./conf/kit.conf) и имя
файла базы данных (используется только если указано --enable-sql)
Убедитесь, что указаны правильные пути к инструментам дизассемблирования, иначе DroidLysis их не найдёт.
DroidLysis использует Python 3. Чтобы запустить его и получить опции:
droidlysis --help
Например, протестируйте на APK Signal:
droidlysis --input Signal-website-universal-release-6.26.3.apk --output /tmp --config /PATH/TO/DROIDLYSIS/conf/general.conf

DroidLysis выводит:
--output /tmp, анализ будет записан в /tmp/Signalwebsiteuniversalrelease4.52.4.apk-f3c7d5e38df23925dd0b2fe1f44bfa12bac935a6bc8fe3a485a4436d4487a290.droidlysis.db), содержащую замеченные свойства.Получить справку по использованию: droidlysis --help
На вход может подаваться файл или каталог с файлами для рекурсивного просмотра. DroidLysis умеет обрабатывать Android-пакеты, DEX, ODEX и ARM-исполняемые файлы, ZIP, RAR. DroidLysis не упадёт на файлах других типов (если только нет бага...), но не сможет понять их содержимое.
При обработке каталогов файлов обычно очень полезно перемещать обработанные образцы в другое место, чтобы знать, что уже обработано. Это реализуется опцией --movein. Также, если вас интересует только статистика, стоит очистить выходной каталог, содержащий подробную информацию по каждому образцу — для этого есть опция --clearoutput. Если вы хотите сохранить всю статистику в SQL-базу данных, используйте --enable-sql (см. здесь)
Анализ DroidLysis по умолчанию не проверяет известные сторонние SDK, т.е. не сообщает о подозрительной активности от них. Если вы хотите, чтобы они проверялись, используйте опцию --no-kit-exception. Обычно это приводит к обнаружению гораздо большего количества свойств для образца, так как SDK (например, рекламные) используют множество помеченных API (получение GPS-координат, IMEI, IMSI, HTTP POST...).
--output DIR)Этот каталог содержит (если применимо):
AndroidManifest.xmlreslib, ассеты assetssmali (и другие)META-INF./unzippedclasses.dex (и другие), конвертированный в jar: classes-dex2jar.jar, и распакованный в ./unjarredСледующие файлы создаются DroidLysis:
autoanalysis.md: перечисляет каждый обнаруженный DroidLysis шаблон и его местоположение.report.md: то же, что было выведено на консольЕсли вам не нужно создавать выходной каталог образца, используйте опцию --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
Трекеры из Exodus, которых нет в вашем исходном kit.conf, добавляются в ~/.cache/droidlysis/kit.conf. Сравните два файла и проверьте, какие трекеры вы хотите добавить.
Если вы хотите обработать каталог образцов, вам, вероятно, понравится сохранять свойства, найденные DroidLysis, в базе данных, чтобы легко анализировать и запрашивать результаты. В этом случае используйте опцию --enable-sql. Это автоматически выгрузит все результаты в базу данных с именем droidlysis.db, в таблицу с именем samples. Каждая запись в таблице относится к конкретному образцу. Каждый столбец — это свойства, которые отслеживает DroidLysis.
Например, чтобы получить все имена файлов, SHA256-суммы и smali-свойства из базы данных:
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,
...
То, что обнаруживает DroidLysis, можно настроить и расширить в файлах каталога ./conf.
Шаблон состоит из:
send_sms. Это имя свойства. Должно быть уникальным в файле .conf.;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage. В файле smali.conf это регулярное выражение применяется к коду Smali. В данном случае есть 3 разных способа отправки SMS-сообщений из кода: sendTextMessage, sendMultipartTextMessage и sendDataMessage.[send_sms]
pattern=;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage
description=Sending SMS messages
Exodus Privacy поддерживает список различных SDK, которые полезно исключить из нашего анализа через conf/kit.conf.
Добавьте опцию --import_exodus в командную строку droidlysis: это проанализирует существующие трекеры, известные Exodus Privacy и ещё не присутствующие в вашем kit.conf. Наконец, он добавит все новые трекеры в ~/.cache/droidlysis/kit.conf.
После этого вы можете отсортировать ваш файл 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)
Этот скрипт помогает искать методы в интерфейсе JEB, содержащие код, соответствующий smali-шаблону, и легко переходить к этим функциям. Когда вы загружаете скрипт и выбираете файл details.md среди файлов анализа droidlysis, появляется окно поиска. После перемещения вы можете легко снова вызвать окно поиска, используя ярлык последнего выполненного скрипта.
script/DroidlysisSearch.py