Androidアプリケーションの解析ツールについて,導入手順と使い方をメモする.
Smaliとは,apktoolをはじめとした多くの解析ツールで用いられる擬似コードのフォーマット.
Javaとのセマンティックギャップはあるものの,可逆性を備えており,apkファイルに変換することができる.
apktoolはAndroidアプリケーションの解析において最も汎用的なツール.
apkからSmaliを生成するには,以下のコマンドを実行する.
$ apktool -d [file]
apkをリビルドするには,以下のコマンドを実行する.
$ apktool -b [files] [rebuild].apk
Smali-CFGsは,SmaliからControl Flow Graphを作成する.
Smali2PsuedoJavaは,SmaliからJavaのコードを擬似的に生成することができる.
$ java -jar Smali2PsuedoJava.jar [files]
APKInspector is a powerful GUI tool for analysts to analyze the Android applications.
Androguardは,Androidアプリケーションの解析ツール.
パーミッションに対応している箇所のコードを表示したり,Control Flow Graphを描画したりといった機能を備えている.
Python2.6のもとで動作し,以下のフォーマットを対象としている.
- Dex/Odex (Dalvik virtual machine) (.dex) (disassemble, decompilation),
- APK (Android application) (.apk),
- Android's binary xml (.xml),
- Android Resources (.arsc).
VirusTotalの中でも動いているらしい.
DockerHubのリポジトリhoneynet / androguardをもとに導入する.
$ sudo apt-get install docker.io
$ sudo update-rc.d docker.io defaults
$ sudo docker.io infosudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo docker run -it -v ~/samples/:/root/samples/ honeynet/androguard
androlyze.pyがAndroguardの本体.コンテナからそのまま実行できる.
root@e33c364e00ef:~# androlyze.py -s
Androlyze version 2.0
In [1]: ls
samples/
ファイルを指定してやる.
In [2]: apk = APK('samples/filename.apk')
In [3]: apk.get_files()
Out[3]:
[u'assets/bin/Data/Managed/Assembly-CSharp-firstpass.dll',
u'assets/bin/Data/Managed/Assembly-CSharp.dll',
u'assets/bin/Data/Managed/Assembly-UnityScript.dll',
u'assets/bin/Data/Managed/Boo.Lang.dll',
u'assets/bin/Data/Managed/Mono.Security.dll',
u'assets/bin/Data/Managed/System.Core.dll',
u'assets/bin/Data/Managed/System.dll',
u'assets/bin/Data/Managed/UnityEngine.dll',
u'assets/bin/Data/Managed/mscorlib.dll',
u'assets/bin/Data/Resources/unity_builtin_extra',
u'assets/bin/Data/1682092270f88d04bb434756a984ea87',
~
略
~
u'assets/bin/Data/f4f0faf73e6bf89419cf29b611f29ade',
u'assets/bin/Data/level0',
u'assets/bin/Data/level1',
u'assets/bin/Data/level2',
u'assets/bin/Data/level3',
u'assets/bin/Data/level4',
u'assets/bin/Data/mainData',
u'assets/bin/Data/settings.xml',
u'assets/bin/Data/sharedassets0.assets',
u'assets/bin/Data/sharedassets1.assets',
u'assets/bin/Data/sharedassets2.assets',
u'assets/bin/Data/sharedassets3.assets.split0',
~
略
~
u'assets/bin/Data/sharedassets5.assets.split9',
u'assets/bin/Data/splash.png',
u'assets/bin/Data/unity default resources',
u'classes.dex',
u'res/drawable/app_icon.png',
u'res/drawable/app_omotenashi_close_button.png',
u'AndroidManifest.xml',
u'resources.arsc',
u'res/drawable-hdpi/app_icon.png',
u'res/drawable-ldpi/app_icon.png',
u'res/drawable-xhdpi/app_icon.png',
u'res/drawable-xxhdpi/app_icon.png',
u'lib/armeabi-v7a/libmain.so',
u'lib/armeabi-v7a/libmono.so',
u'lib/armeabi-v7a/libunity.so',
u'META-INF/MANIFEST.MF',
u'META-INF/CERT.SF',
u'META-INF/CERT.RSA']
In [4]: analysis = AnalyzeAPK('samples/filename.apk')
In [5]: analysis
Out[5]:
(<androguard.core.bytecodes.apk.APK instance at 0x7f24fd397dd0>,
<androguard.core.bytecodes.dvm.DalvikVMFormat at 0x7f24fd395490>,
<androguard.core.analysis.analysis.uVMAnalysis instance at 0x7f2500e47878>)
In [6]: apk.get_main_activity()
Out[6]: u'com.bfsgooglegames.GoogleGamesUnityPlayerProxyActivity'
In [10]: d = DalvikVMFormat( apk.get_dex() )
In [11]:
これはCTagsみたいなものかな.
analysis = AnalyzeAPK('samples/filename.apk')
show_Paths(analysis[1], analysis[2].tainted_packages.search_packages('gangrene'))
DroidBoxは,Honeynet Projectによって開発されているAndroidアプリケーションを対象としたサンドボックス.
DockerHubのリポジトリhoneynet / droidbox
$ sudo apt-get install docker.io
$ sudo update-rc.d docker.io defaults
$ sudo docker.io infosudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo docker run -it --rm -v ~/samples:/samples honeynet/droidbox /samples/filename.apk [duration in seconds]
実行すると内部でEmulatorが実行され,解析対象の挙動ログが作成される.ログは,解析対象と同じ階層に展開される.
droidbox@ubuntu:~$ sudo docker run -it --rm -v ~/samples:/samples honeynet/droidbox /samples/filename.apk
Unable to find image 'honeynet/droidbox' locally
Pulling repository honeynet/droidbox
~
(略)
~
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
Droidbox Docker starting
Waiting for the emulator to startup...
* Starting OpenBSD Secure Shell server sshd [ OK ]
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
Waiting for the device...
Waiting for the device...
Installing the application /samples/filename.apk...
Running the component jp.co.cygames.daihugou/com.bfsgooglegames.GoogleGamesUnityPlayerProxyActivity...
____ __ ____
/\ _`\ __ /\ \/\ _`\
\ \ \/\ \ _ __ ___ /\_\ \_\ \ \ \L\ \ ___ __ _
\ \ \ \ \/\`'__\ __`\/\ \ /'_` \ \ _ <' / __`\/\ \/'\
\ \ \_\ \ \ \/\ \L\ \ \ \/\ \L\ \ \ \L\ \ \L\ \/> </
\ \____/\ \_\ \____/\ \_\ \___,_\ \____/ \____//\_/\_\
\/___/ \/_/\/___/ \/_/\/__,_ /\/___/ \/___/ \//\/_/
Starting the activity com.bfsgooglegames.GoogleGamesUnityPlayerProxyActivity...
Application started
Analyzing the application during infinite time seconds...
[-] Collected 6 sandbox logs (Ctrl-C to view logs)
アプリケーションを単に実行しただけでは,意味のあるログを取得することができない.
マルウェアであれば実行してすぐにExploitによるsuなどを確認できるかもしれないが,通常のアプリケーションはユーザーからの操作を待ち受けるからである.
そこで,DroidBoxはVNCを通じて外部からエミュレータ上のアプリケーションを操作する機能を備えている.
ssh -L 5900:localhost:5900 root@$(cat ~/samples/ip.txt)
matplotで画像を生成してくれるらしいが,未確認.
Santokuは,モバイル機器におけるフォレンジック,マルウェア解析,セキュリティ診断のためのLinuxディストリビューション.
Kali LinuxやSANS Investigate Forensic Toolkit(SIFT)のように生き残ることができるのかは未知数.
イメージのほか,Lubuntu 12.04向けのインストールスクリプトが用意されている.
Santokuには,上で挙げたAndroguardや,hogeがインストールされている.
ruby_apkは,SecureBrainが開発したAndroidアプリケーションを解析するためのライブラリ.
SDKのインストールを要求しないメリット(?)がある.