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
在 Python 虚拟环境(python3 -m venv 或 pyenv 虚拟环境等)中从 Git 安装。
$ python3 -m venv venv
$ source ./venv/bin/activate
(venv) $ pip3 install git+https://github.com/cryptax/droidlysis
另外,你也可以直接从 PyPi 安装 DroidLysis(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
例如,在 Signal 的 APK 上测试:
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 不会失败(除非存在 bug...),但无法理解其内容。
处理文件目录时,通常将已处理的样本移动到其他位置以了解哪些已被处理,这很有用。此功能由 --movein 选项处理。此外,如果你只关心统计信息,你可能希望清除包含每个样本详细信息的输出目录:这是 --clearoutput 选项。如果希望将所有统计信息存储在 SQL 数据库中,请使用 --enable-sql(参见此处)
默认情况下,DroidLysis 的分析不会检查已知的第三方 SDK,例如不会报告这些 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 代码。在这个例子中,代码中有三种发送 SMS 消息的方式:sendTextMessage、sendMultipartTextMessage 和 sendDataMessage。[send_sms]
pattern=;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage
description=Sending SMS messages
Exodus Privacy 维护了一个各种 SDK 的列表,这些 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'))
# 所有节按字母顺序排序
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0] ))
with open('sorted.conf','w') as f:
config.write(f)
此脚本帮助你在 JEB UI 中搜索包含与 smali 模式匹配的代码的方法,并轻松导航到这些函数。当你加载脚本并选择 DroidLysis 分析文件中的 details.md 文件时,会出现一个搜索框。移动后,你可以通过使用最近脚本执行快捷键再次调出搜索窗口。
script/DroidlysisSearch.py