
Automated pre-analysis tool for Android apps that disassembles samples, extracts properties via configurable pattern matching, and organizes output for accelerated reverse engineering and malware analysis.
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을 처리하는 방법을 알고 있습니다. 다른 유형의 파일은 (버그가 없다면) 실패하지 않지만 내용을 이해하지 못할 수 있습니다.
파일 디렉터리를 처리할 때, 처리된 샘플을 다른 위치로 이동하여 처리된 항목을 파악하는 것이 매우 유용합니다. 이는 --movein 옵션으로 처리됩니다. 또한 통계에만 관심이 있다면 각 샘플의 세부 정보가 포함된 출력 디렉터리를 비우는 것이 좋습니다. 이는 --clearoutput 옵션입니다. 모든 통계를 SQL 데이터베이스에 저장하려면 --enable-sql을 사용하십시오 (여기 참조).
DroidLysis의 분석은 기본적으로 알려진 타사 SDK를 검사하지 않습니다. 즉, 이러한 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, 압축 해제된 ./unjarredDroidLysis가 생성하는 파일:
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에 추가됩니다. 두 파일을 비교하여 추가할 추적기를 확인하십시오.
샘플 디렉터리를 처리하는 경우 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=SMS 메시지 전송
Exodus Privacy는 분석에서 제외할 다양한 SDK 목록을 conf/kit.conf를 통해 유지 관리합니다.
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'))
# 모든 섹션을 알파벳순으로 정렬
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