
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
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は他の種類のファイルでも失敗しません(バグがない限り...)が、その内容を理解することはできません。
ファイルのディレクトリを処理する場合、処理済みサンプルを別の場所に移動して何が処理されたかを把握すると非常に便利です。これは--moveinオプションで処理されます。また、統計情報だけに関心がある場合は、各サンプルの詳細情報を含む出力ディレクトリをクリアする必要があります:これは--clearoutputオプションです。すべての統計情報をSQLデータベースに保存したい場合は、--enable-sqlを使用します(こちらを参照)。
DroidLysisの分析は、デフォルトでは既知のサードパーティSDKを検査しません。つまり、それらからの疑わしいアクティビティは報告されません。これらを検査したい場合は、--no-kit-exceptionオプションを使用します。これにより、SDK(例:広告)が多くのフラグ付きAPI(GPS位置情報の取得、IMEIの取得、IMSIの取得、HTTP POSTなど)を使用するため、通常、サンプルに対してより多くの検出プロパティが作成されます。
--output DIR)このディレクトリには(該当する場合)以下が含まれます:
AndroidManifest.xmlres内の読み取り可能なリソースlib、アセット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
初期のkit.confに存在しないExodusのトラッカーは、~/.cache/droidlysis/kit.confに追加されます。2つのファイルを比較して、どのトラッカーを追加するかを確認してください。
サンプルのディレクトリを処理する場合、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メッセージを送信する3つの異なる方法があります:sendTextMessage、sendMultipartTextMessage、sendDataMessage。[send_sms]
pattern=;->sendTextMessage|;->sendMultipartTextMessage|SmsManager;->sendDataMessage
description=Sending SMS messages
Exodus Privacyは、conf/kit.confを介して分析から除外するのに興味深いさまざまなSDKのリストを管理しています。droidlysisコマンドラインに--import_exodusオプションを追加します:これにより、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 UI上でsmaliパターンに一致するコードを含むメソッドを検索し、それらの関数に簡単に移動するのに役立ちます。スクリプトをロードし、droidlysis分析ファイルの中からdetails.mdファイルを選択すると、検索ボックスが表示されます。一度移動すると、最近のスクリプト実行ショートカットを使用して検索ウィンドウを再度簡単に呼び出すことができます。
script/DroidlysisSearch.py