基于多维度特征的Android恶意软件检测方法

第54卷 第5期2021年5月
通信技术
Communications Technology
Vol.54 No.5
May  2021
文献引用格式:徐玄骥,张智斌.基于多维度特征的Android恶意软件检测方法[J].通信技术,2021,54(5):1240-1245.
XU Xuanji,ZHANG Zhibin.Android malware detection method based on multi-dimensional
features[J].Communications Technology,2021,54(5):1240-1245.
doi:10.3969/j.issn.1002-0802.2021.05.030
基于多维度特征的Android恶意软件检测方法*
徐玄骥,张智斌
(昆明理工大学,云南 昆明 650500)
摘 要:随着Android操作系统的不断普及与快速发展,Android恶意软件与检测工具之间的对抗也愈发激烈。如何高效、准确地识别Android恶意软件对用户的隐私保护及设备安全至关重要。针对以往文献的不足,提出了一种基于多维度特征的Android恶意软件检测方案。该方案通过对Android应用软件包进行反编译,提取应用的权限、网络证书、代码混淆等多种特征进行融合,并使用随机森林模型和支持向量机模型进行训练。实验结果表明,与单纯依赖权限与API特征的传统方法相比,该方案对恶意软件测试集的检测率可提升高达19.4%。
关键词:安卓应用;恶意软件检测;代码混淆;随机森林
中图分类号:TP309 文献标识码:A 文章编号:1002-0802(2021)-05-1240-06 Android Malware Detection Method based on Multi-Dimensional Features
XU Xuanji, ZHANG Zhibin
(Kunming University of Science and Technology, Kunming Yunnan 650500, China) Abstract: With the increasing popularity of Android operating system, the arm race between Android malware and Android malware detection tools becomes more intense. It is vital for normal users to recognize Andr
oid malware in a precise and quick manner. Targeting at the drawbacks of previous works, an Android malware detection method based on multiple different features is proposed. This solution decompiles the Android application software package, extracts application permissions, network certificates, code obfuscation and other features for integration, and uses random forest models and support vector machine models for training. The experiments indicate that, compared with traditional approaches that only consider permissions and APIs, the detection rate can be raised by 19.4%.
Keywords: Android application; malware detection; code obfuscation; random forest
0 引 言手机包装
Android操作系统是使用人数最多的移动操作系统。统计信息显示,截至2020年12月,Google Play共有超过350万款应用可供下载,每月平均下载人次超过500万。然而,广阔的使用场景也为恶意软件发展提供了温床。另有统计显示,2020年1—3月间,共发现Android恶意软件超过48万款,其中木马为最主要的类型。种种数据都表明,恶意软件检测是一个重要的亟待解决的问题。然而,随着时间的推移,Android恶意软件也展现出了更强的伪装性,传统检测手段是否奏效存疑。
本文针对上述提到的问题,提出了一套基于多维度特征的Android恶意软件检测方法。通过反编译Android应用程序、抽取权限、使用应用程序编
* 收稿日期:2021-01-25;修回日期:2021-04-19 Received date:2021-01-25;Revised date:2021-04-19
第54卷第5期徐玄骥,张智斌:基于多维度特征的Android恶意软件检测方法
程接口(Application Programming Interface,API)、网络证书时效性、代码混淆程度等不同特征并将其组成向量,之后使用随机森林与支持向量机算法训练分类器,来实现对Android恶意代码的自动化识别。
目前,关于Android恶意代码检测的文献较多,主要思路可归结为基于权限与特征API、基于程序控制流与数据流以及基于动态行为分析3种。文献[1]考虑了不同权限之间的组合与恶意代码的关系,提出了一种基于随机森林的静态恶意代码检测方法。代码控制流信息也常常被用来进行恶意代码检测。文献[2]提出了一种Dalvik字节码插桩方案,通过对控制流的监控实现对应用恶意行为的识别。相比于静态分析,动态分析对软件的运行状态有更强的捕捉能力,因此也经常被应用于恶意代码检测。文献[3]使用污点分析技术追踪多个敏感数据源的数据流动,从而判断应用是否存在威胁用户隐私的操作,但污点分析开销大,运行效率较低。文献[4]将静态反编译特征与动态运行特征相结合,使用卷积神经网络与长短期记忆网络混合的方法对恶意应用进行检测。
由于Java语言易于逆向的特征,代码混淆技术被广泛应用于Android程序开发的过程中。代码混淆通
过去除代码中的语义信息,用等效的代码替换原有代码结构等方式,使得混淆后的代码难以理解,从而增加逆向的成本。文献[5]通过对Google 官方市场,中国第三方应用市场以及恶意软件等3个数据源的10余万应用程序包(Android application package,APK)进行大规模扫描,统计了常见的3种代码混淆技术的使用情况。统计结果显示,Android恶意软件对于代码混淆技术的使用与普通应用程序有较大差别。
1 基本原理
1.1 代码混淆在Android恶意软件检测中的使用1.1.1 标识符重命名
在软件开发过程中,开发者通常赋予变量名较多的语义信息,以保证程序的较高可读性。然而,充足的语义也为逆向者提供了方便,在变量名的帮助下,逆向者可以轻易理解原作者的意图,窃取其中重要的实现,从而对开发者的知识产权产生威胁。
标识符重命名通过将变量中的语义信息抹除,可以有效增加逆向者的攻击成本,从而被广泛使用。根据文献[5]所述,有超过70%的中国开发者和超过60%的恶意软件开发者会使用标识符重命名的方式进行混淆。但是二者的混淆实现存在较大差异。普通开发者通常使用Android Studio (Google官方推荐的Android开发集成环境)中内置的proguard工具进行标识符重命名,然而其策略较为简单,通常只按照字典顺序将标识符重命名为“a”“b”“aa”“ab”……,恶意软件开发者则会使用更具有迷惑性的策略,如
真空脱蜡炉形状相近的字母组合,如“Ill1I1ll”或“00OoOO0”等,甚至出现英语以外的字符(Unicode)。除此之外,恶意软件还经常将重载特性与标识符重命名结合起来,比如将某些敏感函数重命名为Android软件开发工具包 (Software Development Kit,SDK)中定义的一些关键API,由于参数不同,不会影响程序的正常运行,但往往会误导逆向工程师。
1.1.2 字符串加密
由于应用中的字符串包含了非常多的语义信息,逆向者通常会将其作为理解程序语义的突破口。下面的程序片段表明,即便混淆了程序中出现的标识符名称,有经验的逆向者仍然可以依靠字符串来猜测函数的功能。
String a(String a){
b.a(“Start to decrypt the string!”);
String b = c.a(a);
b.a(“Successfully decrypted!”);
return b;}
为了防止程序中的明文对信息的泄漏,字符串加密被作为一种有效的混淆手段。在Android应用开发的过程中,字符串加密可应用在多个阶段,包括Java代码编译阶段、Java字节码转Dex文件阶 段等。
对于恶意代码开发者来说,字符串加密能够有效地抹除程序语义信息,抵御部分基于硬编码特征的扫描工具的检测,假如加密算法实现得足够复杂,还能够有效地增加逆向过程的时间成本。根据文献[5]所述,普通软件开发者极少使用字符串加密。
1.1.3 Java反射
反射是Java语言的一种高级用法,提供了一种灵活的交互方式,使得开发者能够在程序运行时了解类、方法和变量的信息,甚至动态地创建类的实例或调用方法。在Android程序开发领域,Java通常被用来调用Android SDK中的非公开方法(标注
通信技术
有hidden注解的API)。以下代码展示了如何通过反射,调用“lephony.TelephonyManager”类的“getNetworkTypeName”方法。
TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService
(TELEPHONY_SERVICE);
Class clazz = Class.forName
(“lephony.TelephonyManager”);
Class[] argsClass = new Class[1];
argsClass[0] = int.Class;
Object[] params = new Object[1];
Params[0] = value;
Method method = Method
(“getNetworkTypeName”, argsClass);
method.invoke();
反射在普通程序与恶意程序中都会被使用,但是二者对反射的使用模式差异较大。普通软件通常会利
用反射进行JNI调用或后向兼容性的检测,然而恶意软件则会利用反射去隐藏控制流,从而抵抗静态分析工具的检测,或使用反射将原本正常的函数调用变得十分臃肿,加强对逆向者的干扰。
1.2 Android恶意代码检测系统的设计与实现
1.2.1 权限特征选择及获取
Android权限机制提供了对应用的访问控制。目前,Android系统提供了超过170种权限,覆盖应用行为的方方面面。然而,其中一部分权限可能会对用户的隐私或设备的运行状态产生影响,这部分权限被Android标记为“危险”,需要开发者与用户谨慎对待。由于恶意应用往往觊觎用户的隐私或企图掌握对设备的全面控制,危险权限的出现频率通常高于普通应用。除此之外,还发现,部分恶意软件倾向于定义较多的自定义权限。基于以上两种观察,从Android应用的清单文件中抽取权限列表,并统计其中危险权限以及自定义权限的出现次数,作为应用权限方面的特征。所选择的部分高危权限如表1所示。
1.2.2 证书特征选择及获取
在Android应用开发的过程中,需要对应用进行签名,签名后将会产生一个证书文件,通常以.RSA 作为后缀。当应用被上传到应用市场上进行审核时,证书将会被用来证明程序的正当性。然而,某些恶
意软件不能在正规市场中流通,他们所使用的证书也存在各种问题。在本文中,抽取了应用中的证书文件,并以其是否过期作为特征。
表1 所选择的部分高危权限
序号高危权限
1android.permission.READ_SMS
2android.permission.SEND_SMS
3android.permission.SET_DEBUG_APP
4android.permission.INSTALL_PACKAGES
刘惠祥
5android.permission.BRICK
6android.permission.REBOOT
7android.permission.SHUTDOWN
8android.permission.CHANGE_WIFI_STATE 1.2.3 敏感API调用特征选择及获取
Android SDK提供了丰富的API供开发者实现对应功能。与权限类似,部分API的滥用也可能造成用户隐私被窃取或设备系统异常,这部分API被称为敏感API,开发者在使用时需要特别注意。通常来讲,恶意软件对敏感API的使用更加频繁,基于此观察,选择敏感API的调用次数作为特征之一。除此之外,相比于普通软件,恶意软件对敏感API 的调用方式通常较为单一,调用过程也更容易被触发,因此,选择敏感API调用路径的平均长度作为特征之二。敏感API调用路径平均长度的计算方法如下伪代码所示:
APIs:敏感API列表
Records:存放API的路径
Androguard:Androguard的抽象表示
function DFS(Name,Record,Records)
Method ← _method(Name)微型压力传感器芯片
Xrefs ← _xref_from()
if Xrefs.length = 0 then
Records.add(Record) return
end if
for xref ∈ Xrefs do
Func ←_method(xref)
//如果属于第三方库,则跳过
if Func ∈ 3rd - libs then
break
end if
Record.add(Func)
DFS(Func,Record,Records)
end for
end function
function GetUsageOfSensitiveAPIs(APIs)
第54卷第5期徐玄骥,张智斌:基于多维度特征的Android恶意软件检测方法
Traces ← []
total_length ← 0
for API ∈ APIs do
DFS(API,[],traces)
end for
for trace ∈ traces do
total_length += trace.length
end for
return total_length/traces.length
end function
选择的部分敏感API如表2所示。
表2 选择的部分敏感API
类名方法名
TelehonyManager
getSystemService android.app.ActivityManager t.
pm.PackageManager
lephony.SmsManager sendDataMessage android.app.ActivityManager killBackgroundProcesses android.app.admin.
DevicePolicyManager
t.Context startService
1.2.4 程序混淆信息选择及获取
如第1.1小节所示,代码混淆技术在正常应用与恶意应用的使用有较大差异。基于此,选择如下特征表示程序的混淆信息:
(1)应用程序中标识符名称的平均长度。由于Android恶意软件倾向于对标识符进行复杂地重命名,其标识符名称的分布将不同于普通应用。除了标识符的平均长度以外,还可以使用信息熵来表征标识符名称上的差异。
(2)应用程序中字符串的信息熵。信息熵用于量化表示信息的不确定性,当某条信息被加密后,其信息熵将会增大。信息熵的通用计算公式如下:
2
1
log
N
i i
i
H P P
=
=−∑(1)式中,N表示事件的个数,P i表示事件i的发生概率。在本系统的实现中,抽取一个Android应用中出现的所有字符串并将其合并。假设合并后的字符串为S中出现的字符种类共为N,P i表示第i 个字符X i出现的概率,则
.()
.
i
i
S count X
P
S length
=,其中S.count(X i)表示X i在S中出现的次数,S.length表示字符串的长度。最终的信息熵可以根据公式(1)计算出来。
(3)应用程序中Java反射API调用次数。根据文献[5],虽然Java反射在Android普通软件与恶意软件中均被广泛使用,但恶意软件对其的使用频率远远高于普通软件。遍历应用中的每个函数,恢复其smali格式的代码,并与Java反射API作对比,统计其被调用的次数。选择的smali格式的Java反射API如表3所示。
表3 选择的Java反射API列表
序号Smali格式的Java反射API
1Ljava/lang/Class;->getClass()Ljava/lang/Class;
2Ljava/lang/Class;->getMethods()[Ljava/lang/reflect/Method;
3Ljava/lang/Class;->getMethod(Ljava/lang/String; [Ljava/lang/Class;)Ljava/lang/reflect/Method; 4Ljava/lang/Class;->getDeclaredMethods()[Ljava/lang/reflect/Method;
5Ljava/lang/Class;->getFields()[Ljava/lang/reflect/Field;
6Ljava/lang/Class;->getConstructors()[Ljava/lang/reflect/Constructor;
7Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
8Ljava/lang/Class;->getSuperclass()Ljava/lang/Class;
9Ljava/lang/Class;->getClasses()[Ljava/lang/Class;
10Ljava/lang/Class;->getDeclaredClasses()[Ljava/lang/Class;
11Ljava/lang/reflect/Method;->getName()Ljava/lang/String;
12Ljava/lang/reflect/Method;->invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; 13Ljava/lang/ClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;
14Ldalvik/system/DexClassLoader;->loadClass(Ljava/lang/String;)Ljava/lang/Class;
通信技术
1.2.5 分类算法
在从App中提取特征之后,需要使用机器学习算法对特征进行学习,从而实现对Android恶意代码的自动化鉴别。机器学习模型种类繁多,各具特点。经过调研,决定采用有监督二分类模型来进行实验,根据以往文献的经验,发现支持向量机与随机森林模型具有训练速度快、准确性高的优点,故针对两者进行了实验验证。
2 分析与讨论
本文采用androguard作为Android程序分析框架。Androguard提供了丰富的功能与Python开发接口,能够从Android程序中自动提取出类、方法、成员等信息,并生成对象间的函数调用图。使用Androguard抽取出每个Android程序的七个特征组成向量,并使用scikit learn库来对支持向量机模型与随机森林模型进行训练和预测。
为了使实验结果更具有说服力,采用文献中提到的数据源。这些正常的Android程序均是从国内第三方市场以及Google Play上下载,恶意程序主要获取于VirusShare网站以及文献[6]从该数据源中随机抽取
了2 000个正常的Android程序与2 000个恶意的Android组成了本实验的数据集。
为了验证本文所选择的特征的有效性,将特征分成了4类。
(1)权限类特征:Android程序中申请的高危权限数量以及自定义权限数量。
(2)证书类特征:证书是否已经过期。
(3)API特征:敏感API被调用的平均次数以及调用路径的长度。
(4)混淆特征:Android程序中标识符平均长度、字符串的信息熵以及Java反射的使用次数。
将数据集按照8:2的比例拆分为训练集和测试集,并进行5次的交叉检验。对于机器学习模型,均采用了scikit learn库中提供的默认参数,具体的参数信息如表4所示。
杨木皮子
实验结果表明,当使用全部特征时,随机森林模型可以达到95.3%的准确率,94.4%的精确率以及98.0%的召回率,相比之下,支持向量机拥有62.6%的准确率,62.0%的精确率与100%的召回率。可以看出,虽然支持向量机能够将测试集中的全部恶意应用出,但是同样存在非常多的误报,使得最终分类效果不理想。因此实际选择了随机森林作为本文的分类模型。确定分类模型之后,与只使用高危权限作为特征的传统方案进行对比实验。两种方案均采用随机森林作为分类模型,实验结果如 表5所示。
表4 分类模型默认参数
模型参数名称参数值
随机森林
子树数量100
每棵树的最大深度不定
区分内部节点所需的最小实例数2
叶子节点所包含的最小实例数1
支持向量机
正则化参数  1.0
核函数rbf
决策函数形状ovr
表5 在选用样本上的实验结果
方案准确率/(%)精确率/(%)召回率/(%)传统方案75.974.984.7
本方案95.394.498.0
可以看出,相对于传统方案,本方案的准确率、精确率以及召回率的提升分别为19.4%、16.5%以及13.3%,从而证明了特征与分类模型选择的有效性。为了更好地理解各个特征对分类结果的贡献度,输出了scikit learn库中随机森林的特征重要性,结果显示,各个特征的权重如表6所示。
表6 实验中各个特征的特征重要性
阻燃屏蔽控制电缆特征特征重要性
高危权限数量0.116
自定义权限数量0.095
证书是否过期0.003敏感API被调用的平均次数0.182
敏感API的调用路径的平均长度0.029
标识符平均长度0.000
字符串的信息熵0.339
Java反射的使用次数0.238可以看出,权限特征、API特征以及混淆特征拥有较高的贡献度,混淆特征的贡献度甚至超过50%,证明了混淆方式的异同确实能够有效地鉴别一个应用程序的恶意性。但是标志符的平均长度未能表现出任何区分性,原因可能是测试集中使用复杂重命名方式的恶意应用数量过少,同时普通应用开发者更加注重混淆保护,使得二者的重命名模式难以区分。
3 结 语
在本文中,提出了一种基于多种特征的Android

本文发布于:2024-09-22 23:25:16,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/306798.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   应用   使用   权限   进行
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议