Android APK 靜態分析與動態分析

Android沙盤原理與實現

作者:riusksk(泉哥)[ TSRC ]公佈時間:2012-10-15閱讀次數:17496評論:1

分享

【作者】:riusksk(泉哥)
【團隊】:騰訊安全應急響應中心
【微博】:http://t.qq.com/riusksk
【博客】:http://riusksk.blogbus.com
【日期】:2012年10月2日

 

一、前言

 

    據網秦發佈的《2012年上半年全球手機安全報告》,2012年上半年Android病毒感染量增長迅猛,尤以5、6月最爲突出,上半年感染手機1283萬部,比2011年下半年增長62%。在全球範圍內,中國大陸地區被感染率佔居首位。面對增長如此迅速的Android軟件,安全研究人員常常需要逆向分析樣本,分析出其惡意行爲,但手工分析較費時間。在DEX文件反混淆技術的不遍推廣和普及下,比如今年的BlackHat就有DEX反混淆的專題及相應工具公佈,現在已有很多惡意軟件使用到這些反混淆技術,這就加大了樣本分析的難度及所花費的時間。本文主要講述如何利用Android沙盤實現自動化分析惡意軟件的方法,其中介紹了Android沙盤的原理,以及由筆者編寫的Android沙盤——MalDroidAnalyzer,後面會提供由MalDroidAnalyzer分析真實病毒時自動生成的分析報告。


二、Android常見惡意軟件行爲

 

1、惡意扣費

 

    病毒在後臺發送扣費短信、拔打電話進行惡意扣費,同時會對服務商發回的服務短信進行屏蔽,破壞系統的正常功能,同時對用戶造成資費損失。

 

2、隱私竊取


    病毒通過後臺服務竊取用戶隱私信息,包括通話錄音、短信內容、IMEI、IMSI、地理位置、通訊錄、瀏覽器歷史記錄等信息,然後上傳到黑客控制的遠程服務器。

 

3、遠程控制

 

    病毒在後臺開機自動,並與C&C服務器進行通訊,並從中獲取加密的指令,解密後執行相應的惡意操作,也有通過SMS進行控制,構造出botnet,從而大規模地遠程控制用戶的手機。比如之前著名的AnserverBot病毒,就是通過新浪博客進行遠程控制,也是首個利用第三方站點作爲C&C服務器的Android病毒。

 

4、系統破壞

 

    病毒通過系統漏洞進行ROOT提權,並執行高權限操作,在後臺靜默安裝子程序包,或者通過僞造成殺毒軟件、提示更新等方式欺騙用戶安裝第三方惡意程序。病毒可能會更改網絡狀態、APN,或者替換系統文件、添加惡意書籤、屏蔽運營商短信、中止殺軟進程等方式進行系統破壞。

 

5、其它

 

    病毒在後臺聯網下載大量軟件,消耗用戶手機流量,或者執行一些比較耗電的操作來消耗手機電量,進而影響正常的手機通信。也有些一些病毒通過釣魚欺騙等方式,誘騙用戶下載僞裝軟件,導致帳戶密碼失竊。

 

三、Android沙盤原理

 

    本文主要介紹一款Android惡意軟件行爲自動分析平臺——MalDroidAnalyzer,其主要結合靜態分析和動態分析技術來實現惡意軟件行爲自動化分析。MalDroidAnalyzer是筆者使用Perl語言編寫的,用於輔助分析Android軟件行爲,提高惡意軟件的分析效率。
    首先,MalDroidAnalyzer直接以apk文件作爲輸入,整個分析過程主要分析兩部分:靜態分析和動態分析。靜態分析會通過反編譯apk文件,分析其中的權限、組件、敏感函數等信息,這些可以彌補動態分析中因未觸發惡意行爲而漏掉的行爲。動態分析主要通過在模擬器運行Android軟件,然後再對軟件進行一些操作以觸發儘可能多的惡意行爲,接着輸出到log中,再通過腳本對日誌進行分析。由於Android系統默認情況下,一些輸出日誌裏面缺乏我們所需的信息,比如發送短信時,只在log中記錄手機號,而沒有短信內容,此時就需要通過修改Android源碼或者反彙編system.img中的相關類或者庫進行修改,可以在短信發送函數sendTextMessage(位於system.img中的framework/framework.jar)裏面添加短信內容的日誌輸出:




下面是可能需要修改的相關文件,包括源碼位置和編譯後所對應的相關文件,可根據自身需要進行修改:


 

發送短信:android.telephony.SmsManager(system.img中的framework/framework.jar)
文件操作:org.apache.harmony.luni.platform.OSFileSystem(system.img中的framework/core.jar)
網絡操作:org.apache.harmony.luni.platform.OSNetworkSystem(system.img中的framework/core.jar)
拔打電話:android.app.Activity(system.img中的framework/framework.jar)
啓動服務:android.content.ContextWrapper(system.img中的framework/framework.jar)
數據加解密:javax.crypto.Cipher(system.img中的framework/core.jar)
核心庫:dalvik/vm/native(system.img中的lib/libdvm.so)


 


關於apk文件及MalDroidAnalyzer的工作流程如下圖所示:



 

1、靜態分析

 

    沙盤MalDroidAnalyzer主要在電腦端對APK進行靜態分析,通過apktool先進行反編譯處理。正常的APK文件主要是以zip格式進行壓縮捆綁的文檔,裏面主要包含AndroidManifest.xml、Classes.dex和res等文件。在反編譯後會得到明文的AndroidManifest.xml,裏面定義各組件、組件權限和啓動位置、軟件基本信息等,通過對該xml文件的分析,可以獲取到軟件名稱、包名等基本信息,同時對包含的各個組件進行分析,特別是Broadcast Receiver組件的觸發條件,可能就包含有開機自啓動項用於啓動後臺服務,這些在報告中都會被高亮顯示出來。


    在動態分析過程中,可能由於惡意行爲的時間限制,或者模擬器的功能限制(比如藍牙、Wifi),導致病毒的一些惡意行爲無法觸發。此時,我們通過檢測Android軟件調用的API函數可彌補這裏的不足,比如發送扣費短信通常會調用sendTextMessage()函數,執行外部命令可能會調用java.lang.Runtime.exec()。下面是筆者收集整理的一些敏感API函數列表,歡迎各位讀者補充和改進:


 

my %apis = (
	"IActivityManager\$Stub\$Proxy\;\-\>shutdown" => '關機',
	"ActivityManager\;\-\>killBackgroundProcesses" => '中斷進程,可用於關閉殺軟',
	'ActivityManagerNative;->killBackgroundProcesses' => '中斷進程,可用於關閉殺軟',
	'ActivityManagerNative;->restartPackage' => ' 中斷進程,可用於關閉殺軟',
	'ActivityManager;->restartPackage' => ' 中斷進程,可用於關閉殺軟',
	#"BluetoothAdapter\;\-\>enable" => '開啓藍牙',
	#"BluetoothSocket\;\-\>connect" => '連接藍牙',
	#"IBluetoothPbap\$Stub\$Proxy\;\-\>connect" => '連接藍牙',
	"ContentResolver\;\-\>query" => '讀取聯繫人、短信等數據庫',
	"ContentService\;\-\>dump" => '轉儲聯繫人、短信等信息',
	"PackageManager\;\-\>installPackage" => '安裝apk包',
	"Camera\;\-\>open" => '開啓相機',
	"MediaRecorder\;\-\>setAudioSource" => '開啓錄音功能',
	"MediaRecorder\;\-\>setVideoSource" => '開啓視頻錄製',
	"LocationManager\;\-\>getLastKnownLocation" => '獲取地址位置',
	"Downloads\$ByUri\;\-\>startDownloadByUri" => '下載文件',
	"Downloads\$DownloadBase\;\-\>startDownloadByUri" => '下載文件',
	"PowerManager\;\-\>reboot" => '重啓手機',
	"Settings\$Bookmarks\;\-\>add" => '添加瀏覽器書籤',
	"TelephonyManager\;\-\>getDeviceId" => '蒐集用戶手機IMEI碼、電話號碼、系統版本號等信息',
	"TelephonyManager\;\-\>getSimSerialNumber()" => '獲取SIM序列號',
	"Telephony\$Mms\;\-\>query" => '讀取短信',
	"TelephonyManager\;\-\>getLine1Number" => '獲取手機號',
	"SpeechRecognizer\;\-\>startListening" => '開啓麥克風',
	"WifiManager\;\-\>setWifiEnabled" => '開啓WIFI',
	"SmsManager\;\-\>getAllMessagesFromSim" => '獲取sim卡上的短信',
	"SmsManager\;\-\>sendDataMessage" => '發送二進制消息',
	"SmsManager\;\-\>sendMultipartTextMessage" => '發送彩信',
	"SmsManager\;\-\>sendTextMessage" => '發送普通短信',
	#"http/multipart/FilePart;->sendData" => '發送http請求',
	#"http/multipart/Part\;\-\>send" => '發送http請求',
	#"http/multipart/Part\;\-\>sendParts" => '發送http請求',
	#"http/multipart/StringPart\;\-\>sendData" => '發送http請求',
	"internal/telephony/ISms\$Stub\$Proxy\;\-\>sendData" => '發送短信',
	"internal/telephony/ISms\$Stub\$Proxy\;\-\>sendMultipartText" => '發送短信',
	"internal/telephony/ISms\$Stub\$Proxy\;\-\>sendText" => '發送短信',
	"internal/telephony/ITelephony\$Stub\$Proxy\;\-\>call" => '拔打電話',
	"java/lang/Runtime\;\-\>exec" => '執行字符串命令',
	"java/net/HttpURLConnection\;\-\>connect" => '連接URL',
	#"java/net/URL\;\-\>getContent" => '獲取網頁內容',
	"java/net/URL\;\-\>openConnection" => '連接URL',
	"java/net/URLConnection\;\-\>connect" => '連接URL',
	"DefaultHttpClient\;\-\>execute" => '發送HTTP請求',
	"HttpClient\;\-\>execute" => '請求遠程服務器',
         'android/app/NotificationManager;->notify' => '信息通知欄',
	"SmsReceiver\;\-\>abortBroadcast" => '攔截短信接收',
	"ContentResolver\;\-\>delete" => '刪除短信、聯繫人',
	"chmod " => '更改文件權限',
	"getRuntime" => '獲取命令行環境',
	#'content://telephony/carriers' => '獲取所有的APN(網絡接入點)配置信息',
	'content://telephony/carriers/preferapn' => '可能用於篡改APN(網絡接入點)以調用應用市場M-Market扣費接口並驗證',
	'content://sms' => '獲取短信數據庫',
	'content://browser/bookmarks' => '獲取瀏覽器書籤',
	'mount -o remount' => '重新掛載檔案系統',
	'/system/bin/sh' => '執行shell',
	'/proc/mounts' => '加載文件系統',
	'/system/bin/cp' => '複製文件',
	'/root/su' => '切換用戶',
         '/system/bin/rm ' => '刪除文件',
);


 

2、動態分析

 

    動態分析是Android沙盤的主要功能,主要使用Google Android模擬器作爲沙盤環境,同時以前面修改過的system.img來啓動模擬器,以在操作過程中生成我們所需的日誌信息:


 

system('start emulator -avd MalDroidAnalyzer -scale 0.8  -system images/root-system.img -ramdisk images/ramdisk.img -kernel images/zImage  -prop dalvik.vm.execution-mode=int:portable &');


 


    這裏的root-system.img是經過root的,默認情況下,Android模擬器是沒有root權限的,需要自己手工修改。這樣在一些需要root權限的病毒才能正常地模擬器運行,以觸發更多的惡意行爲。


    啓動模擬器後,利用adb安裝APK到模擬器上。業界多數沙盤是通過monkey去自動操作軟件以觸發惡意行爲,但這種做法過於盲目,不容易觸發惡意行爲,同時當操作過於頻繁時容易導致程序崩潰,因此在MalDroidAnalyzer中選擇由用戶自主手工操作,操作時間由用戶自己把握。手工操作可能更有利於觸發惡意行爲,因爲病毒作者通常會更多地依賴用戶的操作習慣來觸發惡意行爲,比如點擊、拔打電話等行爲。


  爲了避免生成過多的無用日誌,因此在使用logcat命令時可提前過濾下,並輸出到log.txt文件:


 

system("adb logcat -v time ActivityManager:I camera:V AudioHardware:D Telephony:V CallNotifier:D su:D MediaProvider:V videocamera:V BluetoothEnabler:V BluetoothHIDService:I dalvikvm:W *:S  > log.txt");


 


最後對生成的日誌log.txt進行分析,由於修改過system.img,它會按照json格式輸出我們所需的信息,而有些原本Android系統輸出的日誌可直接拿來作行爲檢測,就未作修改。日誌格式如下:


 

09-16 10:18:04.583 W/dalvikvm(  299): MalDroid: { "DexClassLoader": { "path": "/data/data/com.test/files/anserverb.db" } }
09-16 10:17:27.963 W/dalvikvm(  281): MalDroid: { "SendNet": { "desthost": "www.google.com", "destport": "80", "data": "7b2263656c6c5f746f77657273223a5b7b226d6f62696c655f6e6574776f726b5f636f6465223a32362c226c6f636174696f6e5f617265615f636f6465223a2d312c226d6f62696c655f636f756e7472795f636f6465223a3331302c2263656c6c5f6964223a2d317d5d2c22726571756573745f61646472657373223a747275652c22686f7374223a226d6170732e676f6f676c652e636f6d222c2276657273696f6e223a22312e312e30227d" } }
09-09 08:37:10.371 W/dalvikvm(  191): MalDroid: { "CryptoUsage": { "operation": "keyalgo", "key": "53, 52, 67, 68, 65, 48, 54, 51, 67, 68, 53, 56, 68, 56, 53, 70", "algorithm": "AES" } }
09-09 08:37:12.560 W/dalvikvm(  191): MalDroid: { "CryptoUsage": { "operation": "encryption", "algorithm": "AES/CBC/PKCS5Padding", "data": "ylmftg6" } }
09-17 20:17:14.302 W/dalvikvm(  274): MalDroid: { "ServiceStart": { "name": "com.android.md5.Settings" } }
09-17 20:24:24.944 W/dalvikvm(  126): MalDroid: { "FdAccess": { "path": "2f646174612f646174612f636f6d2e616e64726f69642e6c61756e636865722f66696c65732f6c61756e636865722e707265666572656e636573", "id": "588716465" } }
09-17 20:24:24.965 W/dalvikvm(  126): MalDroid: { "FileRW": { "operation": "read", "data": "0005", "id": "588716465" } }


 


生成日誌後,MalDroidAnalyzer會去分析日誌,生成統計圖數據,然後生成報告。下面是一些真實病毒樣本的惡意行爲記錄:


1、竊取通訊錄:




2、通話錄音:




3、發送收費短信:




4、動態加載類文件:




5、Root提權:



 

四、真實案例


    在Google Android官方市場上,曾出現過多起應用程序嵌入惡意代碼的事件,比如“功夫病毒”,可進行root提權,並破壞文件系統,同時竊取用戶隱私信息,感染了上百萬用戶,危害甚廣。病毒作者通過對知名軟件進行修改,嵌入惡意代碼然後重打包,然後誘騙用戶下載這些僞造軟件。除“功夫病毒”外,還有DroidDream、AnserverBot、PhoneSpy等惡意軟件。下面是MalDroidAnalyzer針對PhoneSpy病毒Gmail.apk給出的分析報告,該病毒會竊取用戶隱私信息、通話錄音等惡意行爲。由於該病毒無GUI界面,而是以後臺服務在運行,因此報告中的截圖是主頁界面:






五、總結

 

    當前手機用戶量增長越來越快,尤其是中國,手機用戶量已超10億,即大約75%的中國人擁有自己的手機。正因爲手機越來越智能化,攜帶也方便,因此許多人將隱私信息存儲在手機上,且在多處場景下無形地公開化,而這些信息正是許多病毒作者所熱衷的。在移動終端上的安全也將比電腦終端越來越重要,移動安全也已成爲安全領域的另一新戰場。

 

六、鳴謝


    感謝Dflower同學(0day2作者之一)在筆者編寫MalDroidAnalyzer過程中給予的幫助。

 

七、參考資料


1、DroidBox:http://code.google.com/p/droidbox
2、SandDroid:http://sanddroid.xjtu.edu.cn
3、apktool:http://code.google.com/p/android-apktool
4、網秦《2012年上半年全球手機安全報告》:http:// cn.nq.com/neirong/2012shang.pdf
5、Android權限中文描述大全:http://wenku.baidu.com/view/b1f6f9ff0242a8956bece4e7.html
6、Android Permission Map:http://www.android-permissions.org/permissionmap.html

 

【附錄】演示視頻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章