一种基于防御网的Android应用程序防篡方法及系统转让专利

申请号 : CN201510846522.8

文献号 : CN105468970B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 汤战勇任庆峰房鼎益陈晓江龚晓庆陈峰李政桥刘方圆陈美玲

申请人 : 西北大学

摘要 :

本发明公开了一种基于防御网的Android应用防篡改方法及系统,其中方法步骤包括:构造防御节点模板库、待保护的Android应用程序的解析、生成目标节点集合、构造防御关联、根据用户输入,生成对应防御节点实例、生成并初始化防御网、对待保护的Android应用程序进行反编译、文件重构和签名,所述的系统用于实现该方法。本方法和系统可靠性高、易于扩展、低开销、高效率、过程自动化,软件保护的整体处理流程固定、规范化,主要以自动化为主,辅以较少的人工参与,加上处理周期短,因此完全适用于大量应用的批处理保护。

权利要求 :

1.一种基于防御网的Android应用程序防篡改方法,其特征在于,包括以下步骤:步骤一,构造防御节点模板库

防御节点为嵌入到待保护的Android应用程序中的代码段,用于监测篡改威胁并进行响应;构建防御节点模板库,模板库中存放防御节点的实现代码;

步骤二,解析待保护的Android应用程序

将待保护的Android应用程序进行解析,生成该待保护的Android应用程序的函数调用图,并对函数调用图中每一个节点进行描述;

步骤三,生成目标节点集合

在待保护的Android应用程序中,选取感兴趣的区域作为目标节点,并生成目标节点集合;

步骤四,构造防御关联

构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系;

步骤五,根据用户输入,生成对应防御节点实例

根据用户定义的防御节点种类和数据,在防御节点模板库中选择对应种类的防御节点的实现代码,生成对应的防御节点实例;

步骤六,生成并初始化防御网

根据步骤四中构造的防御关联,结合步骤五中生成的防御节点实例,进行防御网的初始化,该防御网包括防御节点和目标节点以及防御关联;

步骤七,对待保护的Android应用程序进行反编译、文件重构和签名。

2.如权利要求1所述的基于防御网的Android应用程序防篡改方法,其特征在于,所述的步骤一中防御节点模板库中,每一种防御节点的实现代码均包括三部分:触发模块、主功能模块和关键信息模块,其中,触发模块用于在检测到异常时触发主功能模块,主功能模块负责执行防篡改功能,关键信息模块用于记录该防御节点的关键信息。

3.如权利要求1所述的基于防御网的Android应用程序防篡改方法,其特征在于,所述的步骤四中,构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系的具体方法如下:构造关联关系时,需要满足以下约束条件a至c:

a.每个目标节点至少被一个防御节点J_Guard进行保护;

b.每个防御节点至少被除自身以外的两个防御节点J_Guard和N_Guard保护;

c.待保护的Android应用程序执行时,执行保护功能的防御节点必须能够在被保护节点执行时间附近及时执行;

对于条件a,设置目标节点与至少一个具有函数保护功能的防御节点进行关联;

对于条件b,对每个防御节点设置至少两个防御节点进行保护,其中一个为J_Guard,负责保护防御节点的触发模块,其中另一个为N_Guard,负责保护防御节点的主功能模块;

对于条件c,每个目标节点或防御节点在选择保护自己的防御节点时,应选择所述待保护的Android应用程序运行时与该目标节点或防御节点执行时间间隔前后较近的防御节点作为其防御节点;

具体地,Android应用程序的功能实现是由一个个函数构成的,当程序运行时,多个函数按照一定的时间顺序依次执行,这些函数组成了一个函数调用链,在同一个函数调用链中两个函数在执行时间上接近;记两个函数之间的函数个数称为跳数,则跳数越小,两个函数的执行间隔越短,因此每个目标节点或防御节点选择与其跳数最小的防御节点作为其防御节点。

4.一种用于实现权利要求1所述方法的系统,其特征在于,该系统包括依次连接的构造防御节点模板库模块、Android应用程序解析模块、生成目标节点集合模块、构造防御关联模块、生成对应防御节点实例模块、生成并初始化防御网模块和反编译、文件重构和签名模块;其中:构造防御节点模板库模块用于实现以下功能:

防御节点为嵌入到待保护的Android应用程序中的代码段,用于监测篡改威胁并进行响应;构建防御节点模板库,模板库中存放防御节点的实现代码;

Android应用程序解析模块用于实现以下功能:将待保护的Android应用程序进行解析,生成该待保护的Android应用程序的函数调用图,并对函数调用图中每一个节点进行描述;

生成目标节点集合模块用于实现以下功能:

在待保护的Android应用程序中,选取感兴趣的区域作为目标节点,并生成目标节点集合;

构造防御关联模块用于实现以下功能:

构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系;

生成对应防御节点实例模块用于实现以下功能:

根据用户定义的防御节点种类和数据,在防御节点模板库中选择对应种类的防御节点的实现代码,生成对应的防御节点实例;

生成并初始化防御网模块用于实现以下功能:

根据构造的防御关联,结合生成的防御节点实例,进行防御网的初始化,该防御网包括防御节点和目标节点以及防御关联;

反编译、文件重构和签名模块用于实现以下功能:

对待保护的Android应用程序进行反编译、文件重构和签名。

说明书 :

一种基于防御网的Android应用程序防篡方法及系统

技术领域

[0001] 本发明属于计算机安全技术领域,具体涉及一种针对Android平台应用软件的防篡改方法。

背景技术

[0002] 近年来,随着移动互联网的高速发展,网络用户的规模越来越大,接入的移动终端数目越来越多。功能日益丰富的移动终端,尤其是Android,已经代替PC成为人们工作、生活中不可缺少的平台。移动终端上的应用软件,在移动互联网的发展和移动终端的普及中扮演着极其重要的角色,其涵盖的领域不仅涉及社交、娱乐,还涉及到办公、通信、支付等。无论是公司厂商,还是政府部门,越来越多的单位参与到移动终端软件的研发、使用和管理中。
[0003] Android软件的广泛应用在为社会带来巨大利益的同时,其带来的安全问题也日益突出。Android软件往往运行于“白盒攻击”环境中(参见参考文献1),攻击者利用软件篡改技术攻击合法软件,生成恶意软件、破解版、盗版等非法软件,严重影响开发者的经济利益和软件产业的健康发展,甚至威胁到国家安全。因此,提高软件安全性,增强软件防篡改能力成为工业界和学术界急需解决的问题。
[0004] 目前针对Android应用软件的防篡改保护技术尚不成熟,主要技术有:①代码混淆技术,Proguard最早由Google研发,并在官方开发环境Android SDK中提供,开发者利用Proguard,可以对Java源码进行混淆,提高了分析难度,进而提高了软件自身防篡改的能力。然而,Proguard只是将代码中的变量名、函数名、类名进行混淆,只是延长了攻击者定位到关键信息的周期,并不能阻止对关键信息的篡改。②加壳技术,目前产业界安全提供商,例如DexGuard和Bangcle(参见参考文献3、4),针对Android软件提供了以加壳为主的加固服务,提高了Android应用逆向分析的难度。针对这些加壳保护技术,Jia Zhijun开发了脱壳器Zjdroid(参见参考文献5),能对主流的加壳方案进行有效的攻击。③篡改版本检测技术,近年来学术界一些学者致力于研究如何提高篡改版本的检测率。篡改版本检测方案,主要基于代码相似性比较(参考文献6、7、8)或者软件组件的耦合性(参见参考文献9),识别应用是否是篡改后的版本。但是,目前Android的第三方市场多达几十个,更有专门发布篡改版本的市场,因此基于检测的保护方案在实际应用中效果并不好。
[0005] 参考文献:
[0006] S Chow,P  Eisen,H Johnson,P  Van Oorschot.A  white-box DES implementation for DRM applications[J].Lecture notes in computer science,
2003,2696:1-15.
[0007] ProGuard.http://developer.android.com/tools/help/proguard.html.
[0008] DexGuard.http://www.guardsquare.com/software/dexguard-enterprise.[0009] Bangcle.http://www.bangcle.com/.
[0010] ZjDroid.http://seclab.safe.baidu.com/opensec_detail_2.html.
[0011] J Crussell.Attack of The Clones:Detecting Cloned Applications on Android Markets.ESORICS,Springer.2012.
[0012] S Hanna,L Huang.Juxtapp:A scalable system for detecting code reuse among android applications.9th International Conference,DIMVA 2012.
[0013] Zhou,Wu.Zhou,Yajin.Detecting repackaged smartphone applications in third-party android marketplaces.Proceedings of the second ACM conference on Data and Application Security and Privacy.2012.
[0014] Zhou,Wu.Zhou,Yajin.Grace,Michael.Fast,scalable detection of piggybacked mobile applications.Proceedings of the third ACM conference on Data and Application Security and Privacy.2013.
[0015] Threat Model.https://msdn.microsoft.com/en-us/library/aa302419.aspx.发明内容
[0016] 针对上述现有Android应用软件保护技术存在的缺陷和不足,本发明的目的在于,提供一种基于防御网的Android应用程序防篡方法,该方法利用计算机系统,对Android系统下应用软件的APK文件进行保护,其保护强度高、易于扩展。
[0017] 为了实现上述任务,本发明采用以下技术方案:
[0018] 一种基于防御网的Android应用程序防篡方法,包括以下步骤:
[0019] 步骤一,构造防御节点模板库
[0020] 防御节点为嵌入到待保护的Android应用程序中的代码段,用于监测篡改威胁并进行响应;构建防御节点模板库,模板库中存放防御节点的实现代码;
[0021] 步骤二,解析待保护的Android应用程序
[0022] 将待保护的Android应用程序进行解析,生成该待保护的Android应用程序的函数调用图,并对函数调用图中每一个节点进行描述;
[0023] 步骤三,生成目标节点集合
[0024] 在待保护的Android应用程序中,选取感兴趣的区域作为目标节点,并生成目标节点集合;
[0025] 步骤四,构造防御关联
[0026] 构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系;
[0027] 步骤五,根据用户输入,生成对应防御节点实例
[0028] 根据用户定义的防御节点种类和数据,在防御节点模板库中选择对应种类的防御节点的实现代码,生成对应的防御节点实例;
[0029] 步骤六,生成并初始化防御网
[0030] 根据步骤四中构造的防御关联,结合步骤五中生成的防御节点实例,进行防御网的初始化,该防御网包括防御节点和目标节点以及防御关联;
[0031] 步骤七,对待保护的Android应用程序进行反编译、文件重构和签名。
[0032] 进一步地,所述的步骤一中防御节点模板库中,每一种防御节点的实现代码均包括三部分:触发模块、主功能模块和关键信息模块,其中,触发模块用于在检测到异常时触发主功能模块,主功能模块负责执行防篡改功能,关键信息模块用于记录该防御节点的关键信息。
[0033] 进一步地,所述的步骤四中,构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系的具体方法如下:
[0034] 构造关联关系时,需要满足以下约束条件a至c:
[0035] a.每个目标节点至少被一个防御节点J_Guard进行保护;
[0036] b.每个防御节点至少被除自身以外的两个防御节点J_Guard和N_Guard保护;
[0037] c.待保护的Android应用程序执行时,执行保护功能的防御节点必须能够在被保护节点执行时间附近及时执行;
[0038] 对于条件a,设置目标节点与至少一个具有函数保护功能的防御节点进行关联;
[0039] 对于条件b,对每个防御节点设置至少两个防御节点进行保护,其中一个为J_Guard,负责保护防御节点的触发模块,其中另一个为N_Guard,负责保护防御节点的主功能模块;
[0040] 对于条件c,每个目标节点或防御节点在选择保护自己的防御节点时,应选择所述待保护的Android应用程序运行时与该目标节点或防御节点执行时间间隔前后较近的防御节点作为其防御节点;
[0041] 具体地,Android应用程序的功能实现是由一个个函数构成的,当程序运行时,多个函数按照一定的时间顺序依次执行,这些函数组成了一个函数调用链,在同一个函数调用链中两个函数在执行时间上接近;记两个函数之间的函数个数称为跳数,则跳数越小,两个函数的执行间隔越短,因此每个目标节点或防御节点选择与其跳数最小的防御节点作为其防御节点。
[0042] 一种基于防御网的Android应用程序防篡系统,该系统包括依次连接的构造防御节点模板库模块、Android应用程序解析模块、生成目标节点集合模块、构造防御关联模块、生成对应防御节点实例模块、生成并初始化防御网模块和反编译、文件重构和签名模块;其中:
[0043] 构造防御节点模板库模块用于实现以下功能:
[0044] 防御节点为嵌入到待保护的Android应用程序中的代码段,用于监测篡改威胁并进行响应;构建防御节点模板库,模板库中存放防御节点的实现代码;
[0045] Android应用程序解析模块用于实现以下功能:
[0046] 将待保护的Android应用程序进行解析,生成该待保护的Android应用程序的函数调用图,并对函数调用图中每一个节点进行描述;
[0047] 生成目标节点集合模块用于实现以下功能:
[0048] 在待保护的Android应用程序中,选取感兴趣的区域作为目标节点,并生成目标节点集合;
[0049] 构造防御关联模块用于实现以下功能:
[0050] 构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系;
[0051] 生成对应防御节点实例模块用于实现以下功能:
[0052] 根据用户定义的防御节点种类和数据,在防御节点模板库中选择对应种类的防御节点的实现代码,生成对应的防御节点实例;
[0053] 生成并初始化防御网模块用于实现以下功能:
[0054] 根据构造的防御关联,结合生成的防御节点实例,进行防御网的初始化,该防御网包括防御节点和目标节点以及防御关联;
[0055] 反编译、文件重构和签名模块用于实现以下功能:
[0056] 对待保护的Android应用程序进行反编译、文件重构和签名。
[0057] 本发明与现有技术相比具有以下技术特点:
[0058] 1.可靠性高,防御网中API节点嵌套保护,无孤立节点,使得攻击者无法直接篡改关键代码段。另外,随机化使得每个应用内嵌的防御网结构不同,使得攻击者的攻击知识不能重复利用。
[0059] 2.易于扩展,通过调节KeyValue预设值的大小,使得防御网的规模具有可控性,同时支持人工添加关键API,便于增强保护效果的多样性和复杂性。
[0060] 3.低开销、高效率,保护方案的逻辑主要是通过执行效率高的native层实现,使得保护后软件增加的性能开销和空间开销很小。
[0061] 4.过程自动化,软件保护的整体处理流程固定、规范化,主要以自动化为主,辅以较少的人工参与,加上处理周期短,因此完全适用于大量应用的批处理保护。

附图说明

[0062] 图1为本发明方法的整体流程图;
[0063] 图2是防御单元模版的结构示意图;
[0064] 图3是D_Guard节点中Java Hook实现原理示意图;
[0065] 图4是本发明的防御网构造框架示意图;
[0066] 图5防御单元间关联关系的示例图;
[0067] 图6是保护后APK重构过程示意图;
[0068] 图7为D_Guard的实现代码示意图。

具体实施方式

[0069] 一、方法具体步骤详述
[0070] 遵从上述技术方案,如图1所示,本发明提供了一种基于防御网的Android应用程序防篡方法,包括以下步骤:
[0071] 步骤一,构造防御节点模板库
[0072] 防御节点为嵌入到待保护的Android应用程序中的代码段,用于监测篡改威胁并进行响应;构建防御节点模板库,模板库中存放防御节点的实现代码;
[0073] 本方案中的防御网,是指执行某种特定安全功能的网状结构,通常网状结构是由一组节点和连接节点的边组成,在本方案的防御网中,节点包括待保护的目标节点和执行防御功能的防御节点,连接防御节点的边即为这些节点间的保护关联。
[0074] 防御节点是指针对指定目标执行特定防篡改保护的安全单元,是防御网的重要组成成员之一,通常会以代码段和数据的形式嵌入到被保护目标中,监测篡改威胁并进行响应。
[0075] 防御节点除保护目标节点外,也需考虑保护其他防御节点,按照防御节点的组成和功能,进行防御节点的构建,并将构建好的防御节点的实现代码存储到防御节点模板库中:
[0076] 在防御节点模板库中,每一种防御节点的实现代码均包括三部分:触发模块、主功能模块和关键信息模块,其中,触发模块用于在检测到异常时触发主功能模块,主功能模块负责执行防篡改功能,关键信息模块用于记录该防御节点的关键信息。
[0077] 本实施例中给出了三种存储在模板库中的防御节点的实现代码
[0078] 本方案中共分为三类防御节点,因此防御节点模板库负责存放三类防御节点的基本实现代码,用于防御网构造时提供具体的防御节点并辅助完成初始化;这三类模板结构构成如下表1所示:
[0079] 表1模板库中三种防御节点结构描述
[0080]
[0081] 如图2所示,考虑到Java层的逆向和篡改难度较低,本方案中使用C实现防御节点的主功能模块,并提供JNI接口供触发模块调用,这样增强了防御节点中关键功能的防篡改能力。
[0082] 本方案中,将这三类防御节点依次命名为J_Guard、N_Guard和D_Guard,下面对这三类防御节点的组成结构和具体实现进行详细介绍:
[0083] (1)防御节点J_Guard模板
[0084] J_Guard是指负责对Android应用指定Java代码段进行防篡改保护的安全单元。触发模块由Java代码(或smali代码)实现,负责触发主功能模块。通过插入到一个Java层函数体中实现与改Java函数的绑定,当Java函数执行时被执行。实现代码实例如下:
[0085]
[0086] 在上述的实例中采用的是smali代码,对于能获取源码的待保护Android应用程序,可以直接在Java源码中插入触发模块。对于无法获取源码的待保护应用,可以对其反编译后将触发模块的smali实现代码插入到所得的smali代码文件中。
[0087] 主功能模块由C代码实现,负责执行防篡改功能,由Java层的触发模块进行触发。保护对象为一个Java层函数的代码。防篡改的实现基于对该Java函数的完整性校验。主要步骤概括为执行时抽取Java函数的字节码,并计算hash值,检测该hash值是否等于预定值。
[0088] 关键信息模块用于记录本单元的关键信息,这些信息会在防御网构造时被初始化。包括单元编号,绑定的Java函数ID,作用对象Java函数的ID以及该函数的校验值。
[0089] (2)防御节点N_Guard模板
[0090] 防御节点N_Guard,是指负责对其他防御节点进行防篡改保护的安全单元,它主要针对的是所有防御节点的native函数部分。N_Guard也由触发模块、主功能模块、关键信息模块三部分组成。
[0091] 触发模块由Java实现,负责调用native层的主功能模块。它通过插入到一个Java层函数执行体中实现与该Java函数的绑定,随该Java函数执行时被触发。
[0092] 主功能模块仍由C代码实现,负责执行防篡改功能。与J_Guard中的主功能模块不同,它的作用对象为一个native函数。
[0093] 关键信息模块负责记录本单元的关键信息,这些信息包括单元编号,绑定的Java函数的ID,作用对象Native函数的ID及该函数校验值。
[0094] (3)防御节点D_Guard模板
[0095] 防御节点D_Guard,是指负责对Android应用中的dex可执行文件进行防篡改保护的安全单元,由于所有的防御节点中触发模块均在dex中,因此通过对dex文件的防篡改保护,可以实现对防御节点触发模块的保护。
[0096] D_Guard同样由触发模块、主功能模块、关键信息模块三部分组成。其中,触发模块由Java代码实现,负责触发主功能模块,与J_Guard和N_Guard中的不同,它是通过替换Java函数中的一个Java API的调用而非直接插入实现与该Java函数的绑定,它随该Java函数执行时被触发。主功能模块由C代码实现,负责执行防篡改功能,以及执行被触发模块替换的Java API的功能。作用对象为APK中dex可执行文件。关键信息模块记录本单元的关键信息,这些信息包括单元编号,绑定的Java函数的ID,dex文件的校验值。
[0097] 主功能模块具有两部分内容,一是针对dex的防篡改保护,基于对dex文件的完整性校验实现。二是实现Java层被替换(Hook)的函数,如图3所示,实现的主要思路为利用Android JNI机制提供的native调用Java函数的方式,完成类似Java方法Hook的过程。利用这个过程,可以有效防止通过直接删除或替换so文件实现攻击。
[0098] 经过长期对Android应用中Java层函数Hook的研究与实验,大部分Java函数均可以被Hook,表2列举了本方案中涉及到的Java函数。
[0099] 表2可Hook的Java函数列表
[0100]
[0101] 以第一个函数Java/io/FileWriter/为例,D_Guard的实现代码如图7所示:
[0102] 步骤二,解析待保护的Android应用程序
[0103] 将待保护的Android应用程序进行解析,生成该待保护的Android应用程序的函数调用图,并对函数调用图中每一个节点进行描述;具体过程为:
[0104] 图4是防御网构造示意图,如图中步骤(1)所示,构造防御网,首先会对输入的APK或其中的DEX文件进行解析,生成该应用的函数调用图,该函数调用图存储为一个文本文件,文件内容为一个列表,列表的每一项对应函数调用图中的一个函数节点,通过四元组<函数名,函数ID,前驱函数ID,后继函数ID>进行描述。
[0105] 步骤三,生成目标节点集合
[0106] 在待保护的Android应用程序中,选取感兴趣的区域作为目标节点,并生成目标节点集合;
[0107] 本方案中,目标节点指的是目标应用软件中需要防篡改保护的一段区域,一般是一个函数或代码段。如图4中所示,步骤(2)表示在生成函数调用图后,根据函数调用图和待保护函数集合,生成目标节点集合。其中,待保护函数集合由用户定义,集合的每一项为该应用待保护的关键函数的函数名。生成的目标节点集合的每一项为待保护函数对应的函数ID。
[0108] 步骤四,构造防御关联
[0109] 构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系;
[0110] 如图4所示,步骤(3)表示输入步骤(1)(2)生成的函数调用图和目标节点集合,利用防御网构造算法结合中的算法,构造防御网内各节点间的关联关系。算法包括两类,一是构造目标节点与防御节点间关联的算法;二是构造防御节点与防御节点间关联的算法。由于步骤(3)中节点间关联关系构造具有一定的随机性,因此重复步骤(3)即可得到一组互不相同的关系集合。关系集合每一项表示为三元组<节点ID,触发点所在函数ID,对应防御节点ID>,以文本的形式存储在XML文件中。
[0111] 提高防御节点安全性,可以从两方面进行。一是提高节点自身的逆向和篡改难度。在步骤一中,本方案利用Android JNI机制,将防御节点的核心功能代码从安全性较低的Java层通过C重写的方式迁移到逆向和篡改难度较高的native层。另一方面,可以通过构造防御网,在防御节点之间建立一定的关联关系,使得防御节点之间互相保护。所谓关联,就是在应用中选择合适的位置(函数体)进行防御节点部署的过程,或指在应用中已有的防御节点间构建保护关系的过程。
[0112] 防御网由两种节点构成,一是程序中需要保护的目标节点,记为g;另一种是执行保护功能的防御节点。节点间的关联关系,是指两个节点间的单向的保护关系,通常包括两类,第一类是由防御节点指向对应的目标节点,记为G->g;第二类是指由防御节点指向需要保护的其他防御节点,记为G->G’;防御网实例如图5所示,图中G表示防御节点,g表示目标节点,节点间的单向连线表示保护关系。
[0113] 构造关联关系时,需要满足以下约束条件a至c:
[0114] a.每个目标节点至少被一个防御节点J_Guard进行保护;
[0115] b.每个防御节点至少被除自身以外的两个防御节点J_Guard和N_Guard保护;
[0116] c.Android应用程序执行时,执行保护功能的防御节点必须能够在被保护节点执行时间附近及时执行;
[0117] 对于条件a,防御网内的目标节点一般为Android应用中的一个自定义Java函数,设置目标节点与至少一个具有函数保护功能的防御节点(即J_Guard)进行关联;
[0118] 对于条件b,根据步骤一中防御节点构造过程可知,每个防御节点的代码部分包括java层的触发模块和native层的主功能模块,因此为了防止防御节点代码被篡改,对每个防御节点设置至少两个防御节点进行保护,其中一个为J_Guard,负责保护防御节点的触发模块,其中另一个为N_Guard,负责保护防御节点的主功能模块;
[0119] 对于条件c,每个目标节点或防御节点在选择保护自己的防御节点时,需要考虑保护功能的响应及时性。所谓响应及时性,是指当被保护节点发生篡改时,对应的防御节点能及时的监测到该攻击并作出响应。因此,应选择所述待保护的Android应用程序运行时与该目标节点或防御节点执行时间间隔前后较近的防御节点作为其防御节点。
[0120] 根据构造关联关系的3个约束条件,对防御网的构造算法进行设计,具体设计与实现如下:
[0121] 假设应用中有M个目标节点,则每个目标节点g的入度(In-degree)至少为1,记为gIN(i)≥1,i∈M;
[0122] 假设应用中N个防御节点,则每个防御节点G的入度(In-degree)至少为2,其中对于每个入度,至少一个终点为J_Guard节点,至少一个终点为N_Guard节点,记为GIN(i)=GIN-JGuard(i)+GIN-NGuard(i)≥2,i∈N,其中GIN-JGuard(i)≥1andGIN-NGuard(i)≥1。三种防御节点中,除了D_Guard外,对于J_Guard和N_Guard节点,每个节点的出度(Out-degree)至少为1,记为GOUT(i)≥1,其中
[0123] 根据步骤一可知,对于D_Guard节点,会执行一种Hook函数,根据节点内Hook的Java函数不同,D_Guard具有不同的类型。因此,D_Guard节点的具体类型和数量与实际的被保护应用有关,同时该数量也可根据具体情况进行人工调节,例如应用中Java函数Java/io/FileWriter/的调用点数目为20,若设置对应该函数的D_Guard数量上限为5,则只对原程序中的任意5处调用点进行Hook处理。
[0124] 对于如何满足约束条件c,本文提出了一种基于函数调用链的解决方式,方法如下:
[0125] Android应用程序的功能实现是由一个个函数构成的,当程序运行时,多个函数按照一定的时间顺序依次执行,这些函数组成了一个函数调用链,在同一个函数调用链中两个函数在执行时间上接近;记两个函数之间的函数个数称为跳数,则跳数越小,两个函数的执行间隔越短,因此每个目标节点或防御节点选择与其跳数最小的防御节点作为其防御节点。
[0126] 根据以上对3个约束条件的具体分析,防御网构造时的主要算法如下:
[0127]
[0128]
[0129] 防御节点D_Guard的部署算法如下:
[0130]
[0131]
[0132] 对于防御节点间保护关系的建立,其关联算法如下:
[0133]
[0134]
[0135] 步骤五,根据用户输入,生成对应防御节点实例
[0136] 根据用户定义的防御节点种类和数据,在防御节点模板库中选择对应种类的防御节点的实现代码,生成对应的防御节点实例;
[0137] 为了保证防御网具有良好的可扩展性,本文防御网构造方案允许通过改变防御节点数量来调节防御网的规模。图4步骤(4)表示根据用户定义的防御节点种类和数目,在防御节点模板库选择对应种类的防御节点的实现代码,生成对应的防御节点实例,实例的触发模块实现存储在.smali代码文件中,主功能模块实现和关键信息模块实现存储在.c后缀的代码文件中。
[0138] 步骤六,生成并初始化防御网
[0139] 根据步骤四中构造的防御关联,结合步骤五中生成的防御节点实例,进行防御网的初始化,该防御网包括防御节点和目标节点以及防御关联;
[0140] 如图4,步骤(5)表示结合步骤(3)得到的防御网内节点间关联关系集和步骤(4)生成的防御节点实例,进行防御网的初始化。具体初始化过程包括:首先会解析步骤(3)得到的一组节点关联关系集合,获取各节点编号,对应触发模块绑定函数ID,然后计算各防御节点对应保护目标的hash值,最后根据以上信息对步骤5中生成的.c文件中各防御节点实例的关键信息模块进行修改,并编译生成so库文件。
[0141] 步骤七,对待保护的Android应用程序进行反编译、文件重构和签名。
[0142] 利用反编译引擎APKTool或Baksmali,反编译待保护APK的dex文件,得到对应的smali代码文件;如图6所示,将防御节点smali指令填充到步骤7得到的smali文件夹下对应smali指令文件中,同时将so库文件植入步骤7中反编译源APK得到的文件夹libs中(若libs文件夹不存在则新建libs文件夹,APK结构参见文献11)。利用APKTool进行重构生成保护后的APK并对其签名.本发明默认利用Android源码提供的testkey.py8和testkey.x509.pem文件进行APK签名。同时也允许加载开发者的keystore进行APK签名。
[0143] 本发明还提供了一种用于实现上述方法的系统:
[0144] 一种基于防御网的Android应用程序防篡系统,该系统包括依次连接的构造防御节点模板库模块、Android应用程序解析模块、生成目标节点集合模块、构造防御关联模块、生成对应防御节点实例模块、生成并初始化防御网模块和反编译、文件重构和签名模块;其中:
[0145] 构造防御节点模板库模块用于实现以下功能:
[0146] 防御节点为嵌入到待保护的Android应用程序中的代码段,用于监测篡改威胁并进行响应;构建防御节点模板库,模板库中存放防御节点的实现代码;
[0147] Android应用程序解析模块用于实现以下功能:
[0148] 将待保护的Android应用程序进行解析,生成该待保护的Android应用程序的函数调用图,并对函数调用图中每一个节点进行描述;
[0149] 生成目标节点集合模块用于实现以下功能:
[0150] 在待保护的Android应用程序中,选取感兴趣的区域作为目标节点,并生成目标节点集合;
[0151] 构造防御关联模块用于实现以下功能:
[0152] 构造目标节点与防御节点之间、防御节点与防御节点之间的关联关系;
[0153] 生成对应防御节点实例模块用于实现以下功能:
[0154] 根据用户定义的防御节点种类和数据,在防御节点模板库中选择对应种类的防御节点的实现代码,生成对应的防御节点实例;
[0155] 生成并初始化防御网模块用于实现以下功能:
[0156] 根据构造的防御关联,结合生成的防御节点实例,进行防御网的初始化,该防御网包括防御节点和目标节点以及防御关联;
[0157] 反编译、文件重构和签名模块用于实现以下功能:
[0158] 对待保护的Android应用程序进行反编译、文件重构和签名。
[0159] 二、实验验证与分析
[0160] 本方案中,将从保护方案的有效性、效率、可行性三个方面进行验证。
[0161] 1.保护方案有效性分析与验证
[0162] 本部分将基于DREAD风险分析模型(参考文献10),对保护前后应用面对同一篡改攻击时所面临的风险大小进行分析量化,通过两个风险值的对比,验证保护方案的有效性,即应用软件经保护后风险值降低,则表明保护方案增强了应用软件的安全性。
[0163] DREAD模型是一种经典的安全威胁分析框架,由微软提出,用来对应用威胁进行风险分析、评估、量化,例如web应用设计时的安全性考虑等。DREAD算法通常会计算一个风险值,作为风险排序的参考,这个风险值是五个属性的平均值,包括:潜在危害性(Damage Potential),可重用性(Reproducibility),可利用性(Exploitability),受影响用户规模(Affected Users),隐蔽性(Discoverability),分别用缩写D,R,E,A,D表示,基于DREAM的风险值RiskValue计算公式如下:
[0164] RiskValue=(D+R+E+A+D)/5  (1)
[0165] 由上面公式可知,RiskValue是一个0~10之间的数值,RiskValue值越高,代表威胁的风险越大
[0166] (1)保护前风险分析
[0167] (1-1)Damage Potential
[0168] Damage Potential表示该威胁的潜在危害性,即当漏洞被利用后可能造成的危害的程度,表现为对应用内资产或敏感信息的可访问程度,以及获取的系统特权级别。程度可用0~10进行衡量,例如0表示无危害,5表示个别资产会受到危害,10表示整个应用或资产面临威胁。
[0169] 由于Android应用处于白盒攻击环境下,因此通过逆向可以使得应用的大部分代码和数据暴露给攻击者,同时攻击者很容易获取非法操作应用内的代码和数据的权限,进而干预应用的执行流程和业务逻辑。因此对于一般的Android应用,其篡改威胁的潜在危害性比较高,即D=6~8。
[0170] (1-2)Reproducibility
[0171] Reproducibility即可重用性,用来描述攻击者基于某威胁,对目标发动重复攻击过程的难度。可重用性的程度可用0~10衡量,例如0表示基本不能或很难重复攻击,5表示攻击者能重复攻击,但受到限制,例如次数、时间等。10表示攻击者可以任意的发动攻击,甚至自动化。
[0172] 对Android应用进行篡改攻击,由于其攻击面,攻击过程和攻击手段基本固定,符合一定的模式,同时Android应用结构规整,因此攻击者重复攻击过程的难度较低,对于同一应用不同版本,甚至对不同Android应用也能进行自动化的攻击。另外,对于一般的Android应用,简单的保护并不能有效阻止攻击者重复攻击过程并累积攻击知识,最终完成攻击。因此对于一般的Android应用,篡改威胁的可重复性R=8~10。
[0173] (1-3)Exploitability
[0174] Exploitability表示威胁的可利用性,即利用该威胁发动攻击的难易程度。可利用性程度用0~10衡量,例如0表示该威胁的成功利用需要丰富的攻击知识、技巧、攻击经验进行复杂的分析,同时需要特定的攻击工具或环境辅助;5表示基于一般的攻击技术或攻击经验,辅以常规的工具即可完成攻击;10表示具备基础攻击知识和部分攻击技术的初学者,在常规的攻击工具辅助下短时间内即可完成攻击。
[0175] 近几年Android系统逐渐普及,其遭受篡改攻击的Android应用数量却呈现了爆炸式的增长,发动攻击的攻击者中,不仅有许多经验丰富的高级攻击者,更有许多初学者。造成这种情况的重要原因之一是因为学习在当前缺乏保护的Android应用上发动篡改攻击的难度不高,同时已经出现了大量的攻击工具,对于初学者来讲,其在短时间内就能掌握攻击方法,足以对一般的Android应用进行篡改。因此对于Android应用篡改威胁,其可利用性E=8~10。
[0176] (1-4)Affected Users
[0177] Affected Users也是威胁的风险分析时的重要属性之一,它表示该威胁下影响的用户的规模。通常也用0~10进行衡量,数字越低,表示受影响的用户规模越小。
[0178] Android平台应用发布渠道众多,除了Google Play,用户还可以从360助手,豌豆荚等第三方应用商店下载应用,近年来,Android应用用户不断增长,截至到2015年第一季,仅国内的第三方手机应用商店的活跃用户规模已达到4.2亿[x]。在这些下载的应用中,不乏被篡改的应用,特别是在第三方应用商店中,同时,大多数应用面临被篡改的威胁,直接影响到下载安装这些应用的用户。因此,本文中A可取为8~10.
[0179] (1-5)Discoverability
[0180] Discoverability即隐蔽性,具体是指对于目标应用,分析并定位产生该威胁的漏洞的难易程度。本文仍以0~10作为初始衡量范围,例如0代表很难分析代码或定位攻击点,5表示借助部分推理或调试可以跟踪到有效攻击点,10表示可直接获取可分析的代码并定位到关键篡改点。
[0181] 对于大多数Android应用而言,其主要由Java编译生成,利用逆向工具可以很容易的获取具有良好可读性的代码,例如Java代码或者smali代码。同时,利用现有的工具,例如DDMS,Android Studio等,可以很容易的实现Java层或者smali层的动态调试,因此,本文取D=6~8,表示可以较容易的获取程序代码并进行分析调试,从而定位篡改点。
[0182] (2)保护后风险分析
[0183] 对于潜在危害性(Damage Potential)方面,虽然保护方案并不阻止攻击者针对Android APK的逆向分析,然而D_Guard节点的主功能模块对原程序中的部分Java调用进行了接管,因此对Java层的部分执行逻辑进行了隐藏,增大了攻击者的分析难度,降低了篡改威胁的潜在危害性。
[0184] 对于可重用性(Reproducibility)方面,由于每个节点受到多个且多类防御节点的保护,使得攻击者无法采用单一的攻击方法,对重复攻击的次数和效果进行了限制。
[0185] 对于可利用性(Exploitability)方面,保护后的应用中防御网具有篡改感知和响应功能,且防御节点间相互保护,因此完成攻击需要首先分析出防御网的整体结构,这需要攻击者具备较高的逆向分析经验和花费较长的时间。
[0186] 对于用户规模(Affected Users)方面,保护后的应用能有效防止攻击者篡改,因此从源头上避免了应用程序篡改版本的产生,因此降低了篡改威胁所造成的影响。
[0187] 对于隐蔽性(Discoverability)方面,对于单个防御节点,构成节点的模块分散到不同运行空间,即java层和native层,增强了程序中关键信息和代码的定位难度,提高了隐蔽性。
[0188] 结合以上分析,保护前后应用的篡改威胁风险值如下表所示:
[0189] 表3保护前后篡改威胁风险值列表
[0190]
[0191] 显然,保护后的应用的篡改威胁风险小于保护前应用的风险,验证了本发明中保护方案的有效性。
[0192] 2.保护方案效率实验验证
[0193] 为了验证保护方案的效果,本文同时选择了当前两款主流的加固商对实验对象进行加固,并在软件大小,启动时间两个方面对加固后的应用进行测试和对比,软件大小对比如下:
[0194] 表4保护前后应用软件大小对比数据(KB)
[0195]
[0196] 从上表中可知,相较于成熟的商业加固商,本发明中的防御网保护方案,对待保护软件带来的大小开销较小,处于可接受的范围。
[0197] 启动时间测试:本文对原始应用、防御网保护后的、Bangcle保护后的、360保护后的应用的启动时间进行测试,从启动速度方面验证保护方案对应用带来的性能开销大小,本文中每个样本应用测试100次并计算其平均启动时间,对比数据如下:
[0198] 表5保护前后应用软件启动时间评测数据(ms)
[0199]
[0200] 从上表可知,与成熟的商业加固商对比,本发明的基于防御网的保护方案对目标应用所造成的性能开销更小。
[0201] 3.保护方案的可行性(兼容性)验证:
[0202] 由于Android系统版本较多,版本之间的差异对应用正常运行所造成的影响决定了保护方案可行性的高低,因此,为了验证保护方案的可行性,本文中选择了5种主流的Android系统版本用于测试应用是否兼容,测试结果如下表:
[0203] 表6保护后应用兼容性测试数据
[0204]
[0205] 从上表可知,经过本专利中保护方案保护后的应用在主流的Android系统版本上可以正常执行,因此基于防御网的保护方案具有良好的兼容性和可行性。