陳冬 王太成
摘 要:為解決傳統(tǒng)反外掛技術(shù)難以有效防御基于Accessibility Service的Android應(yīng)用程序外掛問題,通過反編譯已知的基于Accessibility Service的移動(dòng)外掛插件,從AccessibilityService源碼剖析入手,分析其實(shí)現(xiàn)原理和外掛模式,從而有針對性地提出通過AccessibilityManager有效檢測外掛插件,實(shí)現(xiàn)Android應(yīng)用程序有意識(shí)屏蔽關(guān)鍵UI節(jié)點(diǎn)的獲取和點(diǎn)擊事件這兩種有效防御措施。實(shí)驗(yàn)結(jié)果表明,綜合采用這兩種防御措施,對已知外掛插件及通過簽名變種的外掛插件識(shí)別準(zhǔn)確率分別達(dá)到100%和92%。綜合應(yīng)用AccessibilityManager檢測外掛插件及屏蔽關(guān)鍵UI節(jié)點(diǎn)和點(diǎn)擊事件這兩種防御措施能有效防御基于Accessibility Service的Android應(yīng)用程序外掛。
關(guān)鍵詞:Accessibility Service;Android外掛;外掛分析;外掛防御;反外掛
Abstract: For solving the problem that traditional anti-cheat technology is difficult to defend against Android application cheater based on Accessibility Service, by decompoiling mobile cheaters based on Accessibility Service,we view the Accessibility Service source code to analyze its implementation principle and cheat mode. Finally two targeted defense measures are proposed that we can use Accessibility Manager to effectively detect cheaters and consciously block access and click for key UI nodes when implementing Android applications. Experiment results have shown that using these two defenses, the recognition accuracy of cheater and variation cheater by change signature is 100% and 92%. Using these two defenses can effectively protect Android application cheater based on Accessibility Service.
Key Words: Accessibility Service; Android cheater; cheater analysis; cheater detection; anti-cheat
0 引言
外掛程序在計(jì)算機(jī)界由來已久,上世紀(jì)90年代初就有程序員利用Windows操作系統(tǒng)的Hook函數(shù)監(jiān)控操作系統(tǒng)消息進(jìn)行軟件破解或木馬后門編寫[1]。到后來,在巨大的利益驅(qū)使下網(wǎng)絡(luò)游戲外掛盛行,程序員利用鼠標(biāo)鍵盤模擬、修改客戶端程序、截取調(diào)換封包和全自動(dòng)脫機(jī)等方法制作各種游戲外掛,給游戲公司造成巨額損失[2]。鑒于此,反外掛技術(shù)研究得到重視。大部分反外掛技術(shù)在客戶端使用Windows驅(qū)動(dòng)掃描進(jìn)程特征[3],在服務(wù)端基于交換機(jī)鏡像分光截獲通信協(xié)議匹配外掛行為[4]。隨著大數(shù)據(jù)應(yīng)用和機(jī)器學(xué)習(xí)技術(shù)的發(fā)展,出現(xiàn)了基于用戶的基礎(chǔ)數(shù)據(jù)和行為數(shù)據(jù)分析[5],以及將SVM、KNN、極限學(xué)習(xí)機(jī)等機(jī)器學(xué)習(xí)算法用于游戲外掛檢測等[6]研究,網(wǎng)絡(luò)游戲領(lǐng)域反外掛技術(shù)日漸成熟。
隨著移動(dòng)互聯(lián)網(wǎng)的蓬勃發(fā)展,移動(dòng)端的惡意程序和外掛插件逐漸增多,特別是在Android移動(dòng)端存在很多外掛插件,例如搶紅包、搶票、自動(dòng)打卡等,嚴(yán)重影響了互聯(lián)網(wǎng)企業(yè)正常運(yùn)營活動(dòng),給企業(yè)和用戶帶來了巨大損失。因此,移動(dòng)端安全成為移動(dòng)應(yīng)用開發(fā)領(lǐng)域急需解決的核心問題之一。移動(dòng)平臺(tái)安全研究很多,但大部分是針對平臺(tái)安全的,如借鑒傳統(tǒng)反木馬技術(shù)研究移動(dòng)端應(yīng)用程序框架層的Hook API方法和內(nèi)核層的系統(tǒng)調(diào)用攔截方法[7],或是基于Android簽名機(jī)制使用簡單的黑名單過濾[8],或是結(jié)合機(jī)器學(xué)習(xí)算法構(gòu)建檢測模型,實(shí)現(xiàn)對惡意行為的檢測理論研究[9]。移動(dòng)平臺(tái)上外掛程序,特別是近兩年出現(xiàn)在Android平臺(tái)上利用Accessibility Service實(shí)現(xiàn)的外掛插件,其實(shí)現(xiàn)思路完全有別于傳統(tǒng)外掛程序?qū)崿F(xiàn)思路,所以生搬傳統(tǒng)反外掛技術(shù)研究在實(shí)際應(yīng)用中很難有效防御移動(dòng)端外掛插件。本文通過對當(dāng)前流行的基于Accessibility Service實(shí)現(xiàn)的移動(dòng)端外掛插件進(jìn)行反編譯,深入分析其實(shí)現(xiàn)原理和外掛行為模式,有針對性地提出防御措施,彌補(bǔ)了Accessibility Service類移動(dòng)端外掛插件研究的缺失。
1 Accessibility Service剖析
Accessibility Service本來是Android提供給程序員實(shí)現(xiàn)無障礙輔助功能的一種系統(tǒng)服務(wù),通過Accessibility Service,應(yīng)用程序可以增強(qiáng)用戶界面以幫助殘障人士及暫時(shí)無法與設(shè)備充分交互的人[10]。Accessibility Service之所以被外掛插件利用,需要從Accessibility Service內(nèi)部工作機(jī)制及其監(jiān)控其它應(yīng)用程序的原理兩個(gè)方面分析。
1.1 Accessibility Service內(nèi)部工作機(jī)制
從Google的官方文檔和Android相關(guān)源代碼分析,得到AccessibilityService類和相關(guān)類及其關(guān)系如圖1所示。
其中:AccessibilityService是Service的子類,并重寫了onBind方法。在onBind方法中創(chuàng)建并返回了一個(gè)IAccessibilityServiceClientWrapper實(shí)例對象。另外,在AccessibilityService中還預(yù)留了onAccessibilityEvent接口,提供給程序員在自己的AccessibilityService子類中實(shí)現(xiàn)針對AccessibilityEvent事件的邏輯處理。
IAccessibilityServiceClientWrapper繼承自IAccessibilityServiceClient類,該類是一個(gè)AIDL接口,同時(shí)IAccessibilityServiceClientWrapper還繼承了IAccessibilityServiceClient.Stub類,并且實(shí)現(xiàn)了HandlerCaller.Callback接口。由此可以確定AccessibilityService是一個(gè)遠(yuǎn)程服務(wù),使用Android的跨進(jìn)程通信技術(shù)[11]。
Android系統(tǒng)編譯器在IAccessibilityServiceClient.aidl保存后會(huì)自動(dòng)在相同的包目錄下生成對應(yīng)的Java接口類,并在該類自動(dòng)生成一個(gè)內(nèi)部靜態(tài)抽象類Stub[12]。Stub類繼承android.os.Binder,該類向上又實(shí)現(xiàn)了IBinder接口,并且實(shí)現(xiàn)了IAccessibilityServiceClient接口。編譯器在Stub類內(nèi)部生成一個(gè)靜態(tài)類Proxy,該類實(shí)現(xiàn)IAccessibilityServiceClient接口,所以最終AIDL執(zhí)行結(jié)果是Stub中的Proxy代理執(zhí)行結(jié)果[13]。
在IAccessibilityServiceClientWrapper的構(gòu)造方法中有兩個(gè)較重要的參數(shù),一個(gè)是looper,在Accessibility Service的實(shí)現(xiàn)中就是主線程,可使應(yīng)用程序從binder線程回到主線程;另一個(gè)是Callbacks類型的回調(diào)對象callback。callback參數(shù)初始化一個(gè)HandlerCaller對象。HandlerCaller的主要作用是通過持有Context所在線程的Handler實(shí)例對象,不斷往Context所在線程的消息隊(duì)列發(fā)送消息,然后在Handler實(shí)例對象的回調(diào)方法handleMessage中調(diào)用回調(diào)對象的executeMessage方法,而回調(diào)對象正是IAccessibilityServiceClientWrapper,所以最終調(diào)用的是IAccessibilityServiceClientWrapper的executeMessage方法,具體流程如圖2所示。
1.2 綁定和監(jiān)控其它APP原理
Android使用Accessibility Service監(jiān)控其它應(yīng)用程序并獲得UI更改方法如下:
從Google的官方文檔和Android相關(guān)源代碼分析得到相關(guān)類及其關(guān)系如圖3所示。當(dāng)用戶在設(shè)置頁面開啟某個(gè)Accessibility Service的無障礙應(yīng)用程序后,Android系統(tǒng)會(huì)發(fā)送一條廣播到AccessibilityManager Service系統(tǒng)服務(wù)[14]。收到該廣播后,AccessibilityManager Service會(huì)綁定開啟的Accessibility Service,即調(diào)用上文提到的繼承自Service的AccessibilityService子類的onBind方法。根據(jù)上文分析流程,在AccessibilityService內(nèi)部,onBind方法會(huì)創(chuàng)建并返回一個(gè)IAccessibilityServiceClientWrapper對象,開啟AIDL跨進(jìn)程通信。
當(dāng)某個(gè)受到監(jiān)控的應(yīng)用程序UI發(fā)生改變時(shí),Android會(huì)通過View類中的ViewRootImpl對象調(diào)用其中的AccessibilityManager對象發(fā)送AccessibilityEvent事件。發(fā)出的AccessibilityEvent事件會(huì)通過Binder類調(diào)用AccessibilityService的onAccessibilityEvent接口[15],并將AccessibilityEvent事件作為參數(shù)傳遞給AccessibilityService的具體實(shí)現(xiàn)類,即最終調(diào)用重寫的onAccessibilityEvent方法。
在Android的Accessibility Service實(shí)現(xiàn)框架中還有很重要的一點(diǎn):UI中的每一個(gè)View對象都會(huì)存儲(chǔ)為一個(gè)AccessibilityNodeInfo對象。通過這個(gè)對象在UI節(jié)點(diǎn)樹中可以查找到對應(yīng)的View對象,并像操作原View對象一樣對AccessibilityNodeInfo對象進(jìn)行操作,例如執(zhí)行點(diǎn)擊操作[16],其本質(zhì)是對應(yīng)用中的元數(shù)據(jù)使用反序列技術(shù),通過AccessibilityInteractionClient類實(shí)現(xiàn) [17],流程如圖4所示。
2 外掛插件實(shí)現(xiàn)思路
了解Accessibility Service的內(nèi)部實(shí)現(xiàn)原理和它如何監(jiān)控APP后,要實(shí)現(xiàn)一個(gè)基于Accessibility Service的Android外掛插件就變得容易了,其實(shí)現(xiàn)思路如下:
當(dāng)手機(jī)用戶在設(shè)置界面為某個(gè)APP開啟無障礙服務(wù)后,Accessibility Service會(huì)一直在后臺(tái)運(yùn)行。當(dāng)手機(jī)屏幕界面狀態(tài)發(fā)生變化時(shí),如狀態(tài)欄出現(xiàn)新通知、窗口中焦點(diǎn)被移動(dòng)等,就會(huì)發(fā)生AccessibilityEvent事件,這樣Accessibility Service將可接收到界面的所有變化。而在Accessibility Service中,Android將手機(jī)屏幕中的所有UI組件信息存儲(chǔ)在AccessibilityNodeInfo類中,因此可通過這些信息在UI節(jié)點(diǎn)樹中獲得相應(yīng)的組件View對象,并執(zhí)行期望的操作,例如點(diǎn)擊操作。
以微信搶紅包外掛插件為例,插件在后臺(tái)啟動(dòng)Accessibility Service后,當(dāng)手機(jī)收到微信紅包的推送信息后,會(huì)發(fā)生AccessibilityEvent事件,從而調(diào)用AccessibilityService中重寫的onAccessibilityEvent方法,插件代碼通過判斷推送信息中是否包含“[微信紅包]”的消息提示進(jìn)入聊天界面。通過AccessibilityNodeInfo遍歷窗口UI節(jié)點(diǎn)樹各個(gè)節(jié)點(diǎn),發(fā)現(xiàn)帶有”領(lǐng)取紅包”字樣的節(jié)點(diǎn),則點(diǎn)擊進(jìn)入搶紅包界面。在搶紅包界面,插件代碼再通過UI節(jié)點(diǎn)的ID獲取含有“開”按鈕的UI節(jié)點(diǎn),打開紅包詳情頁面。在紅包詳情頁面,通過UI節(jié)點(diǎn)ID獲取返回鍵按鈕對應(yīng)的節(jié)點(diǎn),點(diǎn)擊該節(jié)點(diǎn)并返回微信聊天界面。
3 外掛插件防御
在了解基于Accessibility Service實(shí)現(xiàn)外掛插件原理和Accessibility Service的工作機(jī)制后,制定防御措施就變得更有針對性,主要從兩個(gè)方面入手:①既然Accessibility Service需要通過AccessibilityManager Service注冊,就可以在AccessibilityManager Service處尋求方法進(jìn)行相關(guān)插件的檢測和禁止;②既然最終操作View的是AccessibilityInteractionClient對象,那么就在此處想辦法,讓其無法獲得對應(yīng)的View對象或無法操作該View對象,以達(dá)到防御插件的目的。
3.1 外掛插件檢測
Accessibility Service需要通過AccessibilityManager Service注冊,而在AccessibilityManager Service類中Android提供了一個(gè)getInstalledAccessibilityServiceList方法[18],該方法可通過用戶ID獲得所有AccessibilityService的服務(wù)信息。這些信息是通過AccessibilityServiceInfo類型提供的,其中PackageNames是防御代碼處理的關(guān)鍵。在具體實(shí)現(xiàn)時(shí)需注意:由于AccessibilityManager Service是系統(tǒng)類,并未提供重寫接口,除非重新編譯Android系統(tǒng)源代碼,否則無法實(shí)現(xiàn)代碼邏輯。但是上文提及的AccessibilityManager類,其內(nèi)部利用Binder可以間接調(diào)用AccessibilityManager Service[19]。除此之外,AccessibilityManager Service還有一個(gè)getEnabledAccessibilityServiceList方法[18],可以取得所有已經(jīng)開啟的AccessibilityService,所以防御的實(shí)現(xiàn)思路也是一樣的。通過比較正在監(jiān)控目標(biāo)的Accessibility Service應(yīng)用程序的包名,檢測或禁止外掛插件啟動(dòng)。
3.2 屏蔽View獲取和點(diǎn)擊事件
Accessibility Service最終是通過AccessibilityInteractionClient對象操作View對象。其中,通過調(diào)用findAccessibilityNodeInfosByText方法獲得期望的被監(jiān)控應(yīng)用程序UI的關(guān)鍵View對象,再通過調(diào)用performAccessibilityAction方法在該View對象上執(zhí)行點(diǎn)擊操作。針對此原理采取以下兩個(gè)措施:①在實(shí)現(xiàn)APP時(shí)實(shí)現(xiàn)自己的TextView實(shí)現(xiàn)類,使其重寫TextView的findViewsWithText方法[20],在該方法中將控件移出UI節(jié)點(diǎn)樹,使Accessibility Service反序列查找UI節(jié)點(diǎn)樹時(shí)無法找到這個(gè)View對象;②performAccessibilityAction方法執(zhí)行點(diǎn)擊事件最終會(huì)調(diào)用查找到的View的OnClickListener,所以可將OnClick替換為OnTouch事件。因?yàn)锳ndroid控件一般的操作都是執(zhí)行點(diǎn)擊操作,外掛插件編寫者一般也會(huì)有這個(gè)固定思維。
4 結(jié)語
移動(dòng)平臺(tái)的反外掛技術(shù)研究越來越重要,但將傳統(tǒng)的反外掛技術(shù)直接應(yīng)用于移動(dòng)應(yīng)用平臺(tái)難以有效防御外掛,特別是基于Accessibility Service的移動(dòng)外掛插件。本文通過反編譯已知的基于Accessibility Service的移動(dòng)外掛插件,分析其實(shí)現(xiàn)原理和外掛行為模式,有針對性地提出通過AccessibilityManager有效檢測外掛插件,以及實(shí)現(xiàn)Android應(yīng)用程序時(shí)有意識(shí)屏蔽關(guān)鍵View的獲取和點(diǎn)擊事件這兩種有效防御措施。實(shí)驗(yàn)驗(yàn)證表明,綜合采用這兩種措施,對已知外掛插件的識(shí)別準(zhǔn)確率可達(dá)100%,對通過簽名變種的外掛插件識(shí)別準(zhǔn)確率也達(dá)到92%。未來在外掛插件樣本數(shù)據(jù)充足的情況下,可以結(jié)合本文研究成果,應(yīng)用機(jī)器學(xué)習(xí)算法,對移動(dòng)外掛插件進(jìn)行外掛行為模式的自動(dòng)識(shí)別研究,以提高對其它形式變種外掛的識(shí)別準(zhǔn)確率。
參考文獻(xiàn):
[1] 甘迪文. Windows黑客編程技術(shù)詳解[M]. 北京:人民郵電出版社,2018.
[2] 蘭曉,尹杰. 中國網(wǎng)絡(luò)游戲外掛問題現(xiàn)狀分析[J]. 軟件,2010,31(10):71-77.
[3] 胡和君,范明鈺. 基于內(nèi)存搜索的隱藏進(jìn)程檢測技術(shù)[J]. 計(jì)算機(jī)應(yīng)用,2008,29(1):124-129.
[4] 李延會(huì),岳彩祥,徐金艷,等. 基于Winpcap的數(shù)據(jù)包捕獲和協(xié)議分析系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 中國科技信息,2009(10):66-71.
[5] 楊丹,高員,顧欣,等. 基于用戶數(shù)據(jù)分析的網(wǎng)頁游戲反外掛方法[J]. 電子產(chǎn)品可靠性與環(huán)境試驗(yàn),2015,33(4):25-31.
[6] 黃旭,曾孟佳,范婧,等. 一種基于ELM的在線游戲外掛檢測方法[J]. 微型電腦應(yīng)用,2018,34(4): 1-4.
[7] 王倩文,沈蘇彬,吳振宇. 基于安卓平臺(tái)的惡意軟件動(dòng)態(tài)監(jiān)測的研究[J]. 計(jì)算機(jī)技術(shù)與發(fā)展,2018,28(8):124-128.
[8] NIKOLAY ELENKOV. Android security internals: an in-depth guide to android's security architecture[M]. No Starch Press,2014.
[9] 王明生. 基于機(jī)器學(xué)習(xí)的Android惡意應(yīng)用檢測系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 蘭州:蘭州大學(xué),2017.
[10] GOOGLE ANDROID TEAM. Build accessibility services[EB/OL]. https://developer.android.google.cn/guide/topics/ui/accessibility/services.
[11] BLAKE MEIKE G. Inside the Android Os: building, customizing, managing and operating Android system services[M]. Addison-Wesley Professional, 2018.
[12] 胡安明. Android平臺(tái)中AIDL語言的研究與分析[J]. 廣東技術(shù)師范學(xué)院學(xué)報(bào):自然科學(xué)版,2014, 35(3):29-31.
[13] GOOGLE ANDROID TEAM. Android interface definition language[EB/OL]. https://developer.android.com/guide/components/aidl.
[14] GOOGLE ANDROID TEAM. Broadcasts overview[EB/OL]. https://developer.android.google.cn/guide/components/broadcasts.
[15] 林學(xué)森. 深入理解Android內(nèi)核設(shè)計(jì)思想[M].北京: 人民郵電出版社,2017.
[16] GOOGLE ANDROID TEAM. Use node tree debugging[EB/OL]. https://developer.android.com/guide/topics/ui/accessibility/node- tree-debugging.
[17] GOOGLE ANDROID TEAM. Build more accessible custom views[EB/OL]. https://developer.android.com/guide/topics/ui/accessibility/custom-views.
[18] GOOGLE ANDROID TEAM. Accessibility manager[EB/OL]. https://developer.android.com/reference/android/view/accessibility/AccessibilityManager.
[19] PATIL N,BHOLE D,SHETE P. Enhanced UI automator viewer with improved android accessibility evaluation features[C]. International Conference on Automatic Control & Dynamic Optimization Techniques. IEEE, 2016.
[20] GOOGLE ANDROID TEAM. TextView [EB/OL]. https://developer.android.com/reference/android/widget/TextView.
(責(zé)任編輯:杜能鋼)