陳冬 王太成
摘 要:為解決傳統(tǒng)反外掛技術難以有效防御基于Accessibility Service的Android應用程序外掛問題,通過反編譯已知的基于Accessibility Service的移動外掛插件,從AccessibilityService源碼剖析入手,分析其實現(xiàn)原理和外掛模式,從而有針對性地提出通過AccessibilityManager有效檢測外掛插件,實現(xiàn)Android應用程序有意識屏蔽關鍵UI節(jié)點的獲取和點擊事件這兩種有效防御措施。實驗結果表明,綜合采用這兩種防御措施,對已知外掛插件及通過簽名變種的外掛插件識別準確率分別達到100%和92%。綜合應用AccessibilityManager檢測外掛插件及屏蔽關鍵UI節(jié)點和點擊事件這兩種防御措施能有效防御基于Accessibility Service的Android應用程序外掛。
關鍵詞: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 引言
外掛程序在計算機界由來已久,上世紀90年代初就有程序員利用Windows操作系統(tǒng)的Hook函數(shù)監(jiān)控操作系統(tǒng)消息進行軟件破解或木馬后門編寫[1]。到后來,在巨大的利益驅使下網絡游戲外掛盛行,程序員利用鼠標鍵盤模擬、修改客戶端程序、截取調換封包和全自動脫機等方法制作各種游戲外掛,給游戲公司造成巨額損失[2]。鑒于此,反外掛技術研究得到重視。大部分反外掛技術在客戶端使用Windows驅動掃描進程特征[3],在服務端基于交換機鏡像分光截獲通信協(xié)議匹配外掛行為[4]。隨著大數(shù)據(jù)應用和機器學習技術的發(fā)展,出現(xiàn)了基于用戶的基礎數(shù)據(jù)和行為數(shù)據(jù)分析[5],以及將SVM、KNN、極限學習機等機器學習算法用于游戲外掛檢測等[6]研究,網絡游戲領域反外掛技術日漸成熟。
隨著移動互聯(lián)網的蓬勃發(fā)展,移動端的惡意程序和外掛插件逐漸增多,特別是在Android移動端存在很多外掛插件,例如搶紅包、搶票、自動打卡等,嚴重影響了互聯(lián)網企業(yè)正常運營活動,給企業(yè)和用戶帶來了巨大損失。因此,移動端安全成為移動應用開發(fā)領域急需解決的核心問題之一。移動平臺安全研究很多,但大部分是針對平臺安全的,如借鑒傳統(tǒng)反木馬技術研究移動端應用程序框架層的Hook API方法和內核層的系統(tǒng)調用攔截方法[7],或是基于Android簽名機制使用簡單的黑名單過濾[8],或是結合機器學習算法構建檢測模型,實現(xiàn)對惡意行為的檢測理論研究[9]。移動平臺上外掛程序,特別是近兩年出現(xiàn)在Android平臺上利用Accessibility Service實現(xiàn)的外掛插件,其實現(xiàn)思路完全有別于傳統(tǒng)外掛程序實現(xiàn)思路,所以生搬傳統(tǒng)反外掛技術研究在實際應用中很難有效防御移動端外掛插件。本文通過對當前流行的基于Accessibility Service實現(xiàn)的移動端外掛插件進行反編譯,深入分析其實現(xiàn)原理和外掛行為模式,有針對性地提出防御措施,彌補了Accessibility Service類移動端外掛插件研究的缺失。
1 Accessibility Service剖析
Accessibility Service本來是Android提供給程序員實現(xiàn)無障礙輔助功能的一種系統(tǒng)服務,通過Accessibility Service,應用程序可以增強用戶界面以幫助殘障人士及暫時無法與設備充分交互的人[10]。Accessibility Service之所以被外掛插件利用,需要從Accessibility Service內部工作機制及其監(jiān)控其它應用程序的原理兩個方面分析。
1.1 Accessibility Service內部工作機制
從Google的官方文檔和Android相關源代碼分析,得到AccessibilityService類和相關類及其關系如圖1所示。
其中:AccessibilityService是Service的子類,并重寫了onBind方法。在onBind方法中創(chuàng)建并返回了一個IAccessibilityServiceClientWrapper實例對象。另外,在AccessibilityService中還預留了onAccessibilityEvent接口,提供給程序員在自己的AccessibilityService子類中實現(xiàn)針對AccessibilityEvent事件的邏輯處理。
IAccessibilityServiceClientWrapper繼承自IAccessibilityServiceClient類,該類是一個AIDL接口,同時IAccessibilityServiceClientWrapper還繼承了IAccessibilityServiceClient.Stub類,并且實現(xiàn)了HandlerCaller.Callback接口。由此可以確定AccessibilityService是一個遠程服務,使用Android的跨進程通信技術[11]。
Android系統(tǒng)編譯器在IAccessibilityServiceClient.aidl保存后會自動在相同的包目錄下生成對應的Java接口類,并在該類自動生成一個內部靜態(tài)抽象類Stub[12]。Stub類繼承android.os.Binder,該類向上又實現(xiàn)了IBinder接口,并且實現(xiàn)了IAccessibilityServiceClient接口。編譯器在Stub類內部生成一個靜態(tài)類Proxy,該類實現(xiàn)IAccessibilityServiceClient接口,所以最終AIDL執(zhí)行結果是Stub中的Proxy代理執(zhí)行結果[13]。
在IAccessibilityServiceClientWrapper的構造方法中有兩個較重要的參數(shù),一個是looper,在Accessibility Service的實現(xiàn)中就是主線程,可使應用程序從binder線程回到主線程;另一個是Callbacks類型的回調對象callback。callback參數(shù)初始化一個HandlerCaller對象。HandlerCaller的主要作用是通過持有Context所在線程的Handler實例對象,不斷往Context所在線程的消息隊列發(fā)送消息,然后在Handler實例對象的回調方法handleMessage中調用回調對象的executeMessage方法,而回調對象正是IAccessibilityServiceClientWrapper,所以最終調用的是IAccessibilityServiceClientWrapper的executeMessage方法,具體流程如圖2所示。
1.2 綁定和監(jiān)控其它APP原理
Android使用Accessibility Service監(jiān)控其它應用程序并獲得UI更改方法如下:
從Google的官方文檔和Android相關源代碼分析得到相關類及其關系如圖3所示。當用戶在設置頁面開啟某個Accessibility Service的無障礙應用程序后,Android系統(tǒng)會發(fā)送一條廣播到AccessibilityManager Service系統(tǒng)服務[14]。收到該廣播后,AccessibilityManager Service會綁定開啟的Accessibility Service,即調用上文提到的繼承自Service的AccessibilityService子類的onBind方法。根據(jù)上文分析流程,在AccessibilityService內部,onBind方法會創(chuàng)建并返回一個IAccessibilityServiceClientWrapper對象,開啟AIDL跨進程通信。
當某個受到監(jiān)控的應用程序UI發(fā)生改變時,Android會通過View類中的ViewRootImpl對象調用其中的AccessibilityManager對象發(fā)送AccessibilityEvent事件。發(fā)出的AccessibilityEvent事件會通過Binder類調用AccessibilityService的onAccessibilityEvent接口[15],并將AccessibilityEvent事件作為參數(shù)傳遞給AccessibilityService的具體實現(xiàn)類,即最終調用重寫的onAccessibilityEvent方法。
在Android的Accessibility Service實現(xiàn)框架中還有很重要的一點:UI中的每一個View對象都會存儲為一個AccessibilityNodeInfo對象。通過這個對象在UI節(jié)點樹中可以查找到對應的View對象,并像操作原View對象一樣對AccessibilityNodeInfo對象進行操作,例如執(zhí)行點擊操作[16],其本質是對應用中的元數(shù)據(jù)使用反序列技術,通過AccessibilityInteractionClient類實現(xiàn) [17],流程如圖4所示。
2 外掛插件實現(xiàn)思路
了解Accessibility Service的內部實現(xiàn)原理和它如何監(jiān)控APP后,要實現(xiàn)一個基于Accessibility Service的Android外掛插件就變得容易了,其實現(xiàn)思路如下:
當手機用戶在設置界面為某個APP開啟無障礙服務后,Accessibility Service會一直在后臺運行。當手機屏幕界面狀態(tài)發(fā)生變化時,如狀態(tài)欄出現(xiàn)新通知、窗口中焦點被移動等,就會發(fā)生AccessibilityEvent事件,這樣Accessibility Service將可接收到界面的所有變化。而在Accessibility Service中,Android將手機屏幕中的所有UI組件信息存儲在AccessibilityNodeInfo類中,因此可通過這些信息在UI節(jié)點樹中獲得相應的組件View對象,并執(zhí)行期望的操作,例如點擊操作。
以微信搶紅包外掛插件為例,插件在后臺啟動Accessibility Service后,當手機收到微信紅包的推送信息后,會發(fā)生AccessibilityEvent事件,從而調用AccessibilityService中重寫的onAccessibilityEvent方法,插件代碼通過判斷推送信息中是否包含“[微信紅包]”的消息提示進入聊天界面。通過AccessibilityNodeInfo遍歷窗口UI節(jié)點樹各個節(jié)點,發(fā)現(xiàn)帶有”領取紅包”字樣的節(jié)點,則點擊進入搶紅包界面。在搶紅包界面,插件代碼再通過UI節(jié)點的ID獲取含有“開”按鈕的UI節(jié)點,打開紅包詳情頁面。在紅包詳情頁面,通過UI節(jié)點ID獲取返回鍵按鈕對應的節(jié)點,點擊該節(jié)點并返回微信聊天界面。
3 外掛插件防御
在了解基于Accessibility Service實現(xiàn)外掛插件原理和Accessibility Service的工作機制后,制定防御措施就變得更有針對性,主要從兩個方面入手:①既然Accessibility Service需要通過AccessibilityManager Service注冊,就可以在AccessibilityManager Service處尋求方法進行相關插件的檢測和禁止;②既然最終操作View的是AccessibilityInteractionClient對象,那么就在此處想辦法,讓其無法獲得對應的View對象或無法操作該View對象,以達到防御插件的目的。
3.1 外掛插件檢測
Accessibility Service需要通過AccessibilityManager Service注冊,而在AccessibilityManager Service類中Android提供了一個getInstalledAccessibilityServiceList方法[18],該方法可通過用戶ID獲得所有AccessibilityService的服務信息。這些信息是通過AccessibilityServiceInfo類型提供的,其中PackageNames是防御代碼處理的關鍵。在具體實現(xiàn)時需注意:由于AccessibilityManager Service是系統(tǒng)類,并未提供重寫接口,除非重新編譯Android系統(tǒng)源代碼,否則無法實現(xiàn)代碼邏輯。但是上文提及的AccessibilityManager類,其內部利用Binder可以間接調用AccessibilityManager Service[19]。除此之外,AccessibilityManager Service還有一個getEnabledAccessibilityServiceList方法[18],可以取得所有已經開啟的AccessibilityService,所以防御的實現(xiàn)思路也是一樣的。通過比較正在監(jiān)控目標的Accessibility Service應用程序的包名,檢測或禁止外掛插件啟動。
3.2 屏蔽View獲取和點擊事件
Accessibility Service最終是通過AccessibilityInteractionClient對象操作View對象。其中,通過調用findAccessibilityNodeInfosByText方法獲得期望的被監(jiān)控應用程序UI的關鍵View對象,再通過調用performAccessibilityAction方法在該View對象上執(zhí)行點擊操作。針對此原理采取以下兩個措施:①在實現(xiàn)APP時實現(xiàn)自己的TextView實現(xiàn)類,使其重寫TextView的findViewsWithText方法[20],在該方法中將控件移出UI節(jié)點樹,使Accessibility Service反序列查找UI節(jié)點樹時無法找到這個View對象;②performAccessibilityAction方法執(zhí)行點擊事件最終會調用查找到的View的OnClickListener,所以可將OnClick替換為OnTouch事件。因為Android控件一般的操作都是執(zhí)行點擊操作,外掛插件編寫者一般也會有這個固定思維。
4 結語
移動平臺的反外掛技術研究越來越重要,但將傳統(tǒng)的反外掛技術直接應用于移動應用平臺難以有效防御外掛,特別是基于Accessibility Service的移動外掛插件。本文通過反編譯已知的基于Accessibility Service的移動外掛插件,分析其實現(xiàn)原理和外掛行為模式,有針對性地提出通過AccessibilityManager有效檢測外掛插件,以及實現(xiàn)Android應用程序時有意識屏蔽關鍵View的獲取和點擊事件這兩種有效防御措施。實驗驗證表明,綜合采用這兩種措施,對已知外掛插件的識別準確率可達100%,對通過簽名變種的外掛插件識別準確率也達到92%。未來在外掛插件樣本數(shù)據(jù)充足的情況下,可以結合本文研究成果,應用機器學習算法,對移動外掛插件進行外掛行為模式的自動識別研究,以提高對其它形式變種外掛的識別準確率。
參考文獻:
[1] 甘迪文. Windows黑客編程技術詳解[M]. 北京:人民郵電出版社,2018.
[2] 蘭曉,尹杰. 中國網絡游戲外掛問題現(xiàn)狀分析[J]. 軟件,2010,31(10):71-77.
[3] 胡和君,范明鈺. 基于內存搜索的隱藏進程檢測技術[J]. 計算機應用,2008,29(1):124-129.
[4] 李延會,岳彩祥,徐金艷,等. 基于Winpcap的數(shù)據(jù)包捕獲和協(xié)議分析系統(tǒng)的設計與實現(xiàn)[J]. 中國科技信息,2009(10):66-71.
[5] 楊丹,高員,顧欣,等. 基于用戶數(shù)據(jù)分析的網頁游戲反外掛方法[J]. 電子產品可靠性與環(huán)境試驗,2015,33(4):25-31.
[6] 黃旭,曾孟佳,范婧,等. 一種基于ELM的在線游戲外掛檢測方法[J]. 微型電腦應用,2018,34(4): 1-4.
[7] 王倩文,沈蘇彬,吳振宇. 基于安卓平臺的惡意軟件動態(tài)監(jiān)測的研究[J]. 計算機技術與發(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] 王明生. 基于機器學習的Android惡意應用檢測系統(tǒng)的設計與實現(xiàn)[D]. 蘭州:蘭州大學,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平臺中AIDL語言的研究與分析[J]. 廣東技術師范學院學報:自然科學版,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] 林學森. 深入理解Android內核設計思想[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.
(責任編輯:杜能鋼)