Author:360移動安全團隊
2015年末爆發了感染量過百萬的“百腦蟲”手機病毒,經過360移動安全團隊深入的跟蹤和分析,我們又發現了病毒的另一核心模塊,此模塊包括3個ELF系統文件configpppm、configpppi、configpppl和一個偽裝成系統應用的核心apk文件以及一個configpppl.jar文件。我們發現這些模塊都使用之前發現的conbb(configopb)執行命令。在新發現的模塊中,病毒使用了更高超的技術,可以在用戶毫無察覺的情況下修改短信內容惡意扣費,從而非法獲益。
此病毒母體一般都是寄生在色情應用或者手機預裝,這類色情應用都是沒有什么實質上的內容,只是圖標和名字很誘人而已,誘導下載安裝病毒。一旦安裝,病毒也就找到了宿主,即使卸載這類應用,病毒母體也不會被卸載。每次手機開機,病毒都會啟動,即使手機恢復出廠設置病毒也不會被清除。
一、惡意扣費(針對移動應用商城,APP應用廠商背黑鍋)
病毒注入所有APP應用,在APP應用進行短信訂購支付時,病毒判斷是否是包含移動應用商城模塊,然后替換支付內容,導致用戶支付后也沒有得到應有的功能,APP應用廠商也沒有充值記錄,導致用戶認為APP應用廠商的程序有問題。這樣,病毒偷了錢還嫁禍給應用廠商而且用戶也無法察覺已中毒。
二、云端服務器加載惡意代碼
核心功能classes.dex文件存放在云端服務器,這樣做對幕后黑手的好處有以下幾點:
1、隨時更新功能:可能今天執行扣費指令,明天執行盜取銀行密碼、支付寶密碼指令,后天安裝各種APK應用等等,潛在危險巨大。
2、難以取證:幕后黑手發現被盯上,隨時可以關閉服務器或改為正規功能,不會留下惡意扣費的相關證據。
三、修改系統核心文件
手機系統易死機,應用啟動遲緩。
四、技術手段高超
注入zygote修改framework需要對安卓手機底層了解非常透徹才能有如此大作,推測是分工明確的團隊產品。
病毒框架大體流程如下:
圖【1】:框架流程
圖【2】:注入zygote
圖【3】:病毒jar模塊功能
1.誘惑應用釋放病毒母體文件或手機預裝就存在病毒,病毒下載運行云端核心DEX文件,執行核心功能函數crackZygoteProcess()。
2.木馬加載libconfigpppm.so動態庫,調用導出函數configPPP()測試修改framework內容是否可行;
圖【4】:調用configPPP()
3.root權限運行configpppi.so,參數為Zygote進程的PID,修改Zygote進程;
圖【5】:運行configpppi
4.創建一條線程檢測"com.android.phone"進程并結束,此進程為系統核心進程,被結束后會自動啟動,重新啟動后的“com.android.phone”就被注入了病毒模塊;
圖【6】:重啟"com.android.phone"注入病毒jar模塊
5.殺死360、金山等殺毒軟件,永久刪除。
圖【7】:結束各種殺毒軟件并刪除.
6.病毒JAR注入所有APK,等待時機惡意扣費。
以上操作完成之后,以后啟動的每個APK應用都會加載病毒模塊,從QQ、支付寶、微信、銀行app到各種手機游戲,病毒可以隨意操控程序流程。
舉個栗子-中毒后最終效果:
我的移動手機已經中毒并且在“移動應用商城”官網下載了“捕魚達人”,暢玩游戲時想花點錢升級VIP或者買個道具(此時病毒注入游戲),進行消費支付提示后,游戲幣卻沒有充值成功,然而卻被扣費,此時我一口咬定游戲廠商應用出了問題,明明扣費卻不給道具。而實際上,病毒在支付的時候就把支付內容修改,最終導致用戶和APP應用廠商相互誤解。
圖【8】:病毒導致應用廠
商背黑鍋
詳細分析核心模塊:
我們詳細分析一下libconfigpppm、configpppi、configpppl是怎么注入安卓進程并HOOK Android世界的。
圖【9】:修改zygote方法
1.首先,病毒加載libconfigpppm.so,調用configppp()導出函數。
2.木馬從"/proc/self/maps"加載地址中,通過名稱和路徑從系統中遍歷尋找有后綴的文件,保存文件的地址范圍和路徑。圖
【10】
(maps是安卓進程的內存鏡像):
圖【10】:maps信息
圖【11】:保存文件的地址范圍和路徑
3.在maps中定位到[email protected]@[email protected]
或者framework.odex
4.從系統中讀取framework文件并且和已經加載的framework進行比較,定位framework在內存中的位置。比較內容如下:
1. 讀取framework大小,將文件分成16個塊
2. 讀取每個塊的前8個字節
3. 將這8個字節的二進制與加載到內存中的framework對應位置的二進制進行比較
圖【12】:對比內存和系統中的framework
5.如果比較失敗,configppp中止執行并返回一個103錯誤代碼。如果比較成功,木馬開始在內存中修改framework。病毒通過dexFindClass和dexGetClassData函數得到"android/app/ActivityThread"的結構。通過遍歷這個結構找到main,再通過dexGetCode函數獲得字節碼,然后與系統中文件相應的字節碼進行比較,從而檢查framework是否已被修改。如果已被修改,病毒會終止運行返回103錯誤代碼;否則定位到main函數位置寫入system.load("/system/bin/configpppl.so")進行修改如下:
1A 00 [strID, 2 bytes]????????????????????//const-string v0, “/system/lib/libconfigpppl.so”?
71 10 [methID, 2 bytes] 00 00??????//invoke-static {v0}, Ljava/lang/System;->load(Ljava/lang/String;)V?
0E 00?????????????????????????????????????????????//return-void
然后保存修改相關的信息到"/data/configppp/cpppimpt.db
",通過configopb.so去執行root命令。
圖【13】:修改自身framework
configpppi用來修改zygote中的framework,Zygote進程的作用是啟動安卓程序的守護進程。它通過/dev/socket/
zygote來接收調用程序的命令,所有啟動請求都會通過fork()執行。一個進程調用fork()后,系統會把原來的進程的所有值都復制到新的進程中,只有少數值與原來的進程的值不同,相當于克隆了一個自己。如果zygote的framework被修改,那么所有啟動的APP都存在修改的zygote的克隆體。
1.configpppi的main函數如圖,參數為Zygote的PID:
圖【14】:
main()函數入口圖
2.通過ptrace操作zygote進程:
圖【15】:ptrace zygote
3.讀取libconfigpppm保存的cpppimpt.db中的數據:
圖【16】:讀取數據
4.根據cpppimpt.db中的數據修改zygote中framework,完成對zygote的修改。
圖【17】:修改zygote
以上操作完畢后,以后再啟動任何APP,都將被注入病毒模塊。如下圖:
zygote修改前
zygote修改后
圖【18】:zygote修改前后對比
木馬成功注入zygote后,每個新啟動的應用都會先加載名為 configpppl.so的文件。configpppl.so的功能是加載configpppl.jar并修改系統函數。
在configpppl.so的JNI_OnLoad中首先會加載包含修改短信和發送短信的configpppl.jar模塊
1) 加載configpppl.jar后首先調用jar中的pppMain方法
圖【19】:調用pppMain
2) pppMain方法只有一個輸出日志的功能,表示加載成功
圖【20】:輸出日志
dalvik在執行函數時會先調用dvmIsNativeMethod來判斷一個method是否是native方法。如果是native函數的話,那么它所指向的一個Method對象的成員變量nativeFunc就指向該JNI方法的地址,因此只要將java函數修改為native,就可以達到hook的目的。
要把java函數修改為native method需要以下步驟:
(1) 修改method屬性為native
(2) 修改registersSize、insSize、nativeFunc、computeJniArgInfo
圖【21】:修改method屬性
注冊目標method的native函數
圖【22】:注冊目標函數
通過以上的修改程序在調用被修改的這些函數的時候就會調用作者自己在configpppl.so中定義的本地函數,被修改的本地函數以及修改的目的如下表
通過上面的修改之后,在手機接到短信時,木馬就可以根據短信內容和來源選擇性的屏蔽掉,屏蔽的規則也是動態的,在過濾之前木馬會檢測規則的時效性,并且可以自主發送短信訂購移動服務并修改支付短信。
以上被修改的7個函數中有兩個函數特別重要:dispatchPdus和newApplication
1) dispatchPdus——屏蔽短信
當手機收到短信時,會調用接收處理短信的dispatchPdus函數。前面已經將此函數注冊為本地函數,因此會調用configpppl.so中對應的函數如下
圖【23】: 劫持短信
可以看到函數最終調用configpppl.jar中的moduleDispatchPdus函數,在moduleDispatchPdus中會先判斷短信是否需要屏蔽,若不需要屏蔽則按照原始的dispatchPdus函數流程執行
圖【24】:屏蔽短信
2) newApplication之onModuleCreate
跟dispatchPdus一樣,newApplication被調用的時候首先調用configpppl.so中的本地函數。與dispatchPdus不同的是本地函數會先調用原始的newApplication方法,然后在調用configpppl.jar中的onModuleCreate和onModuleInit兩個方法。
因為木馬在之前的代碼中已經修改了zygote進程,因此手機中所有的應用都將被注入configpppl.so模塊。onModuleCreate方法功能就是根據上層應用初始化變量mMainAppType,初始化結果如下:
3) newApplication之onModuleInit——篡改短信,主動發送短信
通過mMainAppType的值,木馬根據上層應用的不同,將執行不同的代碼:
圖【25】:onModuleInit部分代碼
(a) 上層應用為com.android.phone
上層應用為com.android.phone時,程序將注冊兩條廣播:
圖【26】:注冊廣播
當收到com.ops.sms.core.broadcast.back.open.gprs.network時程序將開啟數據網絡
圖【27】:"com.android.phone"收到廣播開啟網絡
(b) 上層應用為com.android.mms或者com.android.settings
程序先注冊三條廣播,然后檢測是否有需要發送的短信,如果有則發送出去。
當收到com.ops.sms.core.broadcast.back.send.sms.address
廣播時程序也會發送短信,短信內容從activelocal.db文件中獲取。
當收到com.ops.sms.core.broadcast.back.open.gprs.network
時程序將開啟數據網絡,從后面的代碼中可以看到,程序會每兩分鐘發送一個開啟網絡的廣播。
圖【28】:"com.android.settings"開啟數據網絡
(c) 上層應用為普通應用時,程序先判斷是否為移動應用商城app
圖【29】:判斷啟動程序是否為移動應用商城
如果是移動應用商城app的話,調用invokeMMMain函數,否則調用invokeotherMain,這兩個函數內容大體相似,只是invokeMMMain函數會檢測移動應用商城app的sdk的版本并且開啟線程檢測網絡連接,每2分鐘發送一個打開網絡的廣播。
圖【30】:發送開啟網絡廣播
無論是不是移動應用商城app程序都會執行一個叫replaceService的函數去替換isms和isms2
圖【31】:替換isms
isms作為發送短信的binder,程序用自己定義的binder替換isms意味著手機發送的短信將被木馬修改,再看木馬自己定義的binder的內容:
修改支付短信,修改的內容是從activelocal.db文件中獲得
圖【32】:修改支付短信
程序先是檢測短信類型是否是移動支付相關的,如果是則修改短信的CodeIMSI、號碼和內容,然后調用原始的isms發送短信。
圖【33】:中毒清理反饋
如果您發現手機異常有中毒跡象,請下載360手機急救箱清理;有用戶反饋急救箱無法清理病毒,請先將手機ROOT后,再使用急救箱才可以完成清理。(推薦使用360root或kingroot等ROOT工具)
隨著360手機急救箱用戶數的增長,被查殺到的木馬越來越多,360手機急救箱獨有的深度完整掃描,可以深度掃描和完美清除底層ELF病毒和APK病毒,目前市場上的主流手機安全產品幾乎沒有支持ELF完整深度掃描的功能,如果您的手機刷過第三方ROM或者手機已經Root,建議您采用360手機急救箱進行一次完整的深度掃描,幫助您安全用機。
1、建議安卓手機用戶不要隨意開放root權限,作為安卓系統的底層權限,一旦開放root權限就意味著手機大門已敞開。為手機軟件使用行方便的同時,也為手機木馬行了方便。
2、日常使用手機過程中,謹慎點擊軟件內的推送廣告。來源不明的手機軟件、安裝包、文件包等不要隨意點擊下載。
3、同時,手機上網時,對于不明鏈接、安全性未知的二維碼等信息,不要隨意點擊或掃描,避免其中存在木馬病毒危害手機安全。
4、養成良好的手機使用習慣,定期查殺手機木馬,避免遭受潛伏在手機中的惡意軟件危害。