APP下载

基于Accessibility Service的Android外挂插件实现原理及防御措施

2019-12-12陈冬王太成

软件导刊 2019年11期
关键词:外挂插件调用

陈冬 王太成

摘 要:为解决传统反外挂技术难以有效防御基于Accessibility Service的Android应用程序外挂问题,通过反编译已知的基于Accessibility Service的移动外挂插件,从AccessibilityService源码剖析入手,分析其实现原理和外挂模式,从而有针对性地提出通过AccessibilityManager有效检测外挂插件,实现Android应用程序有意识屏蔽关键UI节点的获取和点击事件这两种有效防御措施。实验结果表明,综合采用这两种防御措施,对已知外挂插件及通过签名变种的外挂插件识别准确率分别达到100%和92%。综合应用AccessibilityManager检测外挂插件及屏蔽关键UI节点和点击事件这两种防御措施能有效防御基于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操作系统的Hook函数监控操作系统消息进行软件破解或木马后门编写[1]。到后来,在巨大的利益驱使下网络游戏外挂盛行,程序员利用鼠标键盘模拟、修改客户端程序、截取调换封包和全自动脱机等方法制作各种游戏外挂,给游戏公司造成巨额损失[2]。鉴于此,反外挂技术研究得到重视。大部分反外挂技术在客户端使用Windows驱动扫描进程特征[3],在服务端基于交换机镜像分光截获通信协议匹配外挂行为[4]。随着大数据应用和机器学习技术的发展,出现了基于用户的基础数据和行为数据分析[5],以及将SVM、KNN、极限学习机等机器学习算法用于游戏外挂检测等[6]研究,网络游戏领域反外挂技术日渐成熟。

随着移动互联网的蓬勃发展,移动端的恶意程序和外挂插件逐渐增多,特别是在Android移动端存在很多外挂插件,例如抢红包、抢票、自动打卡等,严重影响了互联网企业正常运营活动,给企业和用户带来了巨大损失。因此,移动端安全成为移动应用开发领域急需解决的核心问题之一。移动平台安全研究很多,但大部分是针对平台安全的,如借鉴传统反木马技术研究移动端应用程序框架层的Hook API方法和内核层的系统调用拦截方法[7],或是基于Android签名机制使用简单的黑名单过滤[8],或是结合机器学习算法构建检测模型,实现对恶意行为的检测理论研究[9]。移动平台上外挂程序,特别是近两年出现在Android平台上利用Accessibility Service实现的外挂插件,其实现思路完全有别于传统外挂程序实现思路,所以生搬传统反外挂技术研究在实际应用中很难有效防御移动端外挂插件。本文通过对当前流行的基于Accessibility Service实现的移动端外挂插件进行反编译,深入分析其实现原理和外挂行为模式,有针对性地提出防御措施,弥补了Accessibility Service类移动端外挂插件研究的缺失。

1 Accessibility Service剖析

Accessibility Service本来是Android提供給程序员实现无障碍辅助功能的一种系统服务,通过Accessibility Service,应用程序可以增强用户界面以帮助残障人士及暂时无法与设备充分交互的人[10]。Accessibility Service之所以被外挂插件利用,需要从Accessibility Service内部工作机制及其监控其它应用程序的原理两个方面分析。

1.1 Accessibility Service内部工作机制

从Google的官方文档和Android相关源代码分析,得到AccessibilityService类和相关类及其关系如图1所示。

其中:AccessibilityService是Service的子类,并重写了onBind方法。在onBind方法中创建并返回了一个IAccessibilityServiceClientWrapper实例对象。另外,在AccessibilityService中还预留了onAccessibilityEvent接口,提供给程序员在自己的AccessibilityService子类中实现针对AccessibilityEvent事件的逻辑处理。

IAccessibilityServiceClientWrapper继承自IAccessibilityServiceClient类,该类是一个AIDL接口,同时IAccessibilityServiceClientWrapper还继承了IAccessibilityServiceClient.Stub类,并且实现了HandlerCaller.Callback接口。由此可以确定AccessibilityService是一个远程服务,使用Android的跨进程通信技术[11]。

Android系统编译器在IAccessibilityServiceClient.aidl保存后会自动在相同的包目录下生成对应的Java接口类,并在该类自动生成一个内部静态抽象类Stub[12]。Stub类继承android.os.Binder,该类向上又实现了IBinder接口,并且实现了IAccessibilityServiceClient接口。編译器在Stub类内部生成一个静态类Proxy,该类实现IAccessibilityServiceClient接口,所以最终AIDL执行结果是Stub中的Proxy代理执行结果[13]。

在IAccessibilityServiceClientWrapper的构造方法中有两个较重要的参数,一个是looper,在Accessibility Service的实现中就是主线程,可使应用程序从binder线程回到主线程;另一个是Callbacks类型的回调对象callback。callback参数初始化一个HandlerCaller对象。HandlerCaller的主要作用是通过持有Context所在线程的Handler实例对象,不断往Context所在线程的消息队列发送消息,然后在Handler实例对象的回调方法handleMessage中调用回调对象的executeMessage方法,而回调对象正是IAccessibilityServiceClientWrapper,所以最终调用的是IAccessibilityServiceClientWrapper的executeMessage方法,具体流程如图2所示。

1.2 绑定和监控其它APP原理

Android使用Accessibility Service监控其它应用程序并获得UI更改方法如下:

从Google的官方文档和Android相关源代码分析得到相关类及其关系如图3所示。当用户在设置页面开启某个Accessibility Service的无障碍应用程序后,Android系统会发送一条广播到AccessibilityManager Service系统服务[14]。收到该广播后,AccessibilityManager Service会绑定开启的Accessibility Service,即调用上文提到的继承自Service的AccessibilityService子类的onBind方法。根据上文分析流程,在AccessibilityService内部,onBind方法会创建并返回一个IAccessibilityServiceClientWrapper对象,开启AIDL跨进程通信。

当某个受到监控的应用程序UI发生改变时,Android会通过View类中的ViewRootImpl对象调用其中的AccessibilityManager对象发送AccessibilityEvent事件。发出的AccessibilityEvent事件会通过Binder类调用AccessibilityService的onAccessibilityEvent接口[15],并将AccessibilityEvent事件作为参数传递给AccessibilityService的具体实现类,即最终调用重写的onAccessibilityEvent方法。

在Android的Accessibility Service实现框架中还有很重要的一点:UI中的每一个View对象都会存储为一个AccessibilityNodeInfo对象。通过这个对象在UI节点树中可以查找到对应的View对象,并像操作原View对象一样对AccessibilityNodeInfo对象进行操作,例如执行点击操作[16],其本质是对应用中的元数据使用反序列技术,通过AccessibilityInteractionClient类实现 [17],流程如图4所示。

2 外挂插件实现思路

了解Accessibility Service的内部实现原理和它如何监控APP后,要实现一个基于Accessibility Service的Android外挂插件就变得容易了,其实现思路如下:

当手机用户在设置界面为某个APP开启无障碍服务后,Accessibility Service会一直在后台运行。当手机屏幕界面状态发生变化时,如状态栏出现新通知、窗口中焦点被移动等,就会发生AccessibilityEvent事件,这样Accessibility Service将可接收到界面的所有变化。而在Accessibility Service中,Android将手机屏幕中的所有UI组件信息存储在AccessibilityNodeInfo类中,因此可通过这些信息在UI节点树中获得相应的组件View对象,并执行期望的操作,例如点击操作。

以微信抢红包外挂插件为例,插件在后台启动Accessibility Service后,当手机收到微信红包的推送信息后,会发生AccessibilityEvent事件,从而调用AccessibilityService中重写的onAccessibilityEvent方法,插件代码通过判断推送信息中是否包含“[微信红包]”的消息提示进入聊天界面。通过AccessibilityNodeInfo遍历窗口UI节点树各个节点,发现带有”领取红包”字样的节点,则点击进入抢红包界面。在抢红包界面,插件代码再通过UI节点的ID获取含有“开”按钮的UI节点,打開红包详情页面。在红包详情页面,通过UI节点ID获取返回键按钮对应的节点,点击该节点并返回微信聊天界面。

3 外挂插件防御

在了解基于Accessibility Service实现外挂插件原理和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是防御代码处理的关键。在具体实现时需注意:由于AccessibilityManager Service是系统类,并未提供重写接口,除非重新编译Android系统源代码,否则无法实现代码逻辑。但是上文提及的AccessibilityManager类,其内部利用Binder可以间接调用AccessibilityManager Service[19]。除此之外,AccessibilityManager Service还有一个getEnabledAccessibilityServiceList方法[18],可以取得所有已经开启的AccessibilityService,所以防御的实现思路也是一样的。通过比较正在监控目标的Accessibility Service应用程序的包名,检测或禁止外挂插件启动。

3.2 屏蔽View获取和点击事件

Accessibility Service最终是通过AccessibilityInteractionClient对象操作View对象。其中,通过调用findAccessibilityNodeInfosByText方法获得期望的被监控应用程序UI的关键View对象,再通过调用performAccessibilityAction方法在该View对象上执行点击操作。针对此原理采取以下两个措施:①在实现APP时实现自己的TextView实现类,使其重写TextView的findViewsWithText方法[20],在该方法中将控件移出UI节点树,使Accessibility Service反序列查找UI节点树时无法找到这个View对象;②performAccessibilityAction方法执行点击事件最终会调用查找到的View的OnClickListener,所以可将OnClick替换为OnTouch事件。因为Android控件一般的操作都是执行点击操作,外挂插件编写者一般也会有这个固定思维。

4 结语

移动平台的反外挂技术研究越来越重要,但将传统的反外挂技术直接应用于移动应用平台难以有效防御外挂,特别是基于Accessibility Service的移动外挂插件。本文通过反编译已知的基于Accessibility Service的移动外挂插件,分析其实现原理和外挂行为模式,有针对性地提出通过AccessibilityManager有效检测外挂插件,以及实现Android应用程序时有意识屏蔽关键View的获取和点击事件这两种有效防御措施。实验验证表明,综合采用这两种措施,对已知外挂插件的识别准确率可达100%,对通过签名变种的外挂插件识别准确率也达到92%。未来在外挂插件样本数据充足的情况下,可以结合本文研究成果,应用机器学习算法,对移动外挂插件进行外挂行为模式的自动识别研究,以提高对其它形式变种外挂的识别准确率。

参考文献:

[1] 甘迪文. Windows黑客编程技术详解[M]. 北京:人民邮电出版社,2018.

[2] 兰晓,尹杰. 中国网络游戏外挂问题现状分析[J]. 软件,2010,31(10):71-77.

[3] 胡和君,范明钰. 基于内存搜索的隐藏进程检测技术[J]. 计算机应用,2008,29(1):124-129.

[4] 李延会,岳彩祥,徐金艳,等. 基于Winpcap的数据包捕获和协议分析系统的设计与实现[J]. 中国科技信息,2009(10):66-71.

[5] 杨丹,高员,顾欣,等. 基于用户数据分析的网页游戏反外挂方法[J]. 电子产品可靠性与环境试验,2015,33(4):25-31.

[6] 黄旭,曾孟佳,范婧,等. 一种基于ELM的在线游戏外挂检测方法[J]. 微型电脑应用,2018,34(4): 1-4.

[7] 王倩文,沈苏彬,吴振宇. 基于安卓平台的恶意软件动态监测的研究[J]. 计算机技术与发展,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恶意应用检测系统的设计与实现[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.

(责任编辑:杜能钢)

猜你喜欢

外挂插件调用
制售网络游戏外挂行为的刑法规制
石材反打外挂墙板应用技术
枪械的“外挂神器”
自编插件完善App Inventor与乐高机器人通信
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
战斗机武器外挂投放与内埋投放比较
基于系统调用的恶意软件检测技术研究
MapWindowGIS插件机制及应用
基于Revit MEP的插件制作探讨