ZooPark是一個(gè)針對(duì)中東的APT組織,截至2017年,已經(jīng)發(fā)展到了4.0版本,本次分析是第三個(gè)版本,相比較V1、V2版本的代碼的復(fù)雜性,2016年流出的V3版本的樣本可以說(shuō)有關(guān)于信息竊取這方面的功能比之前有了質(zhì)的飛躍,如果說(shuō)之前兩個(gè)版本讓人感覺(jué)新手練手的作品,那么這個(gè)版本已經(jīng)可以說(shuō)是有開(kāi)發(fā)經(jīng)驗(yàn)的老司機(jī)來(lái)寫(xiě)的了。我們?nèi)腴T(mén)先做靜態(tài)的代碼分析,理順?lè)治隽鞒獭?/span>
工具:JEB1.5、AndroidKiller1.3
樣本運(yùn)行流程圖

V3
分析之前,我們需要理清思路,逐步分析,慢慢行成一套屬于自己的分析流程。
1、 是否加固過(guò),混淆過(guò)未加固、未混淆。
2、看安裝包目錄結(jié)構(gòu),看是否有特別的文件,記錄下來(lái)方便后面的分析。
證書(shū)信息,看樣本大概流出的時(shí)間:

資產(chǎn)目錄assets中全是這些看起來(lái)很火辣的小姐姐,很明顯可能用于誘惑用戶查看點(diǎn)擊之類的:

布局文件夾res的有幾十個(gè)values文件(values-nb等),文件里面有不同國(guó)家的字體,和之前兩個(gè)版本,可以看出,開(kāi)發(fā)人員有了質(zhì)的飛躍:

3、 看清單文件,靜態(tài)注冊(cè)了哪些廣播接收器。
在清單文件AndroidManifest.xml中有這樣靜態(tài)注冊(cè)的廣播,因?yàn)樗鼪](méi)有設(shè)置intent-filter,所以不會(huì)捕獲任何廣播,只能主動(dòng)通過(guò)構(gòu)造顯式intent+發(fā)送廣播sendBroadcast才可以喚醒這個(gè)廣播:
receiver android:name="com.wallpaper.OnGPSReceiver" />
receiver android:name="com.wallpaper.OnAlarmReceiver" />
使用Android Killer工具的全局字符串搜索,只發(fā)現(xiàn)OnAlarmReceiver這個(gè)廣播接收器在OnBootReceiver開(kāi)機(jī)廣播中被啟用,結(jié)合起來(lái)實(shí)現(xiàn)的功能是開(kāi)機(jī)后,設(shè)置一個(gè)重復(fù)的警報(bào),來(lái)啟動(dòng)這個(gè)廣播,用來(lái)喚醒AppService服務(wù)(服務(wù)比較復(fù)雜,在分析完清單文件后,分析):


從廣播接收器的名稱就可以看出他是一個(gè)檢測(cè)網(wǎng)絡(luò)變化然后執(zhí)行某些行為的廣播。從代碼中可以看出他的主要行為就是如果可以聯(lián)網(wǎng),就會(huì)開(kāi)啟AppService服務(wù)(這是第二個(gè)為了開(kāi)啟這個(gè)服務(wù)的廣播了,可以看出極有可能這個(gè)服務(wù)就是惡意行為的主要發(fā)起者)。這里勾選上write方法是建議留個(gè)印象,如果分析多個(gè)樣本,那么其實(shí)可以從代碼編寫(xiě)習(xí)慣中,看出一些端倪:
receiver android:label="NetworkConnection" android:name="com.wallpaper.NetworkChangeReceiver">
intent-filter android:enabled="true" android:exported="false">
action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
intent-filter>
receiver>

這是將這個(gè)樣本APP激活成設(shè)備管理器,在meta-data中知道device_admin_sample.xml文件存放了,激活設(shè)備管理器請(qǐng)求開(kāi)啟的策略,并且一旦策略被觸發(fā)就會(huì)調(diào)用這個(gè)廣播接收器中重寫(xiě)的方法,如圖7.png,都會(huì)打印一條日志:
intent-filter>
action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
action android:name="android.app.action.DEVICE_ADMIN_DISABLED" />
intent-filter>
meta-data android:name="android.app.device_admin" android:resource="@xml/device_admin_sample" />
receiver>
收到短信時(shí),會(huì)將短信內(nèi)容、號(hào)碼、時(shí)間等存入data數(shù)據(jù)庫(kù)中的tbl_SMS表中:
receiver android:enabled="true" android:name="com.wallpaper.SMSReceivers">
intent-filter>
action android:name="android.provider.Telephony.SMS_RECEIVED" />
intent-filter>
receiver>

開(kāi)機(jī)啟動(dòng)廣播,首先會(huì)嘗試開(kāi)啟ScreenStateService服務(wù),然后創(chuàng)建一個(gè)重復(fù)的警報(bào),每隔4分鐘來(lái)啟動(dòng)這個(gè)OnAlarmReceiver,即開(kāi)啟AppService服務(wù)。
receiver android:enabled="true" android:name="com.wallpaper.OnBootReceiver" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
intent-filter>
action android:name="android.intent.action.BOOT_COMPLETED" />
category android:name="android.intent.category.DEFAULT" />
intent-filter>
receiver>
綜上,這些靜態(tài)注冊(cè)的廣播,主要是通過(guò)監(jiān)聽(tīng)網(wǎng)絡(luò)變化、開(kāi)機(jī)自啟動(dòng)來(lái)打開(kāi)AppService、ScreenStateService服務(wù),下面主要分析這兩個(gè)服務(wù)。然后還有一些竊取用戶收到的短信內(nèi)容,寫(xiě)入數(shù)據(jù)庫(kù)、激活設(shè)備管理器
4、分析兩大服務(wù)的功能:AppService、ScreenStateService
ScreenStateService
動(dòng)態(tài)注冊(cè)ScreenReceiver廣播接收器來(lái)監(jiān)聽(tīng)屏幕的解鎖和鎖屏:
ScreenStateService.mReceiver = new ScreenReceiver();
this.getApplicationContext().registerReceiver(ScreenStateService.mReceiver, new IntentFilter(
"android.intent.action.SCREEN_ON"));
this.getApplicationContext().registerReceiver(ScreenStateService.mReceiver, new IntentFilter(
"android.intent.action.SCREEN_OFF"));
(1) 鎖屏?xí)r,開(kāi)啟AppService服務(wù)(不知道第幾次啟動(dòng)它,證明這個(gè)服務(wù)才是真正的惡意功能執(zhí)行者)。執(zhí)行Start_check_mic方法,開(kāi)啟線程來(lái)錄音8分鐘存儲(chǔ)到外部存儲(chǔ)/android/data/AndroidService/時(shí)間.3gpp,然后將~/android/data/AndroidService/目錄下多有錄音文件POST上傳到C2地址的/spyMobile/recordcall_upload.php文件上:

在構(gòu)造C2地址時(shí),如果第一次訪問(wèn)這個(gè)地址MainActivity.Server_Domain,因?yàn)檫沒(méi)有被賦值,所以會(huì)異常,調(diào)用MainActivity.findServer()方法來(lái),獲取C2地址(通過(guò)訪問(wèn)網(wǎng)絡(luò)圖片獲取返回的流數(shù)據(jù),然后正則匹配出C2地址):

(2) 屏幕解鎖時(shí),打印Intent Action: android.intent.action.SCREEN_ON。
AppService
一般來(lái)說(shuō),瀏覽服務(wù)做了哪些事,從onCreate或者onStartCommand(onCreate沒(méi)有重寫(xiě)的情況),但是這個(gè)服務(wù)沒(méi)有這兩個(gè)方法,再仔細(xì)看看,發(fā)現(xiàn)這個(gè)服務(wù)類,繼承一個(gè)自定義類,而這個(gè)自定義類繼承IntentService類,看到這個(gè)類我們就需要從onHandleIntent方法入手了(解決開(kāi)發(fā)這忘記開(kāi)啟線程和忘記調(diào)用 stopSelf()),發(fā)現(xiàn)主要執(zhí)行了doWakefulWork抽象方法,所以再回到AppService類中,檢查他的重寫(xiě)方法即可:
public class AppService extends WakefulIntentService
public abstract class WakefulIntentService extends IntentService
......
abstract void doWakefulWork(Intent arg1);
......
this.doWakefulWork(intent);
WakefulIntentService.getLock(((Context)this)).release(); //鎖屏(沒(méi)有喚醒鎖的前提)
(1) 檢查是否開(kāi)啟ScreenStateService服務(wù)來(lái)偷偷錄音,如果沒(méi)有就打開(kāi)這個(gè)服務(wù):

|